11+11=22 2020-12-06 19:03 采纳率: 0%
浏览 9

为什么这段程序里的外部中断用不了?

#include "reg51.h"
#include"STC.H"
#include "intrins.h"

#define	FOSC  11059200			//系统时钟频率
#define	BAUD  19200				//定义Baud率
#define Count 256 		   		//定义计数频率
				  
typedef	 unsigned char uchar;	
typedef	 unsigned int  uint;
typedef  bit           BT;   	
	 
sfr	 ADC_CONTR	 =   0xBC;	   //ADC控制寄存器
sfr	 ADC_RES	 =   0xBD;	   //ADC高八位寄存器
sfr	 P1ASF	     =   0x9D;	   //P1 secondary function control register

sfr  AUXR 		 =   0x8e;	   //辅助函数寄存器
sbit Flag1  	 = 	 P0^0; 	   //时钟clk
sbit Flag2		 =	 P0^1;	   //reset信号

#define		ADC_POWER	0x80		//ADC电源控制位
#define	    ADC_FLAG	0x10		//ADC完成标志位
#define		ADC_START   0x08		//ADC开始控制位
#define		ADC_SPEEDH  0x40		//180个时钟周期

uint   count1 = 0;				//计数ADC采样数
uint   count2 = 0;				//计算RESET信号的占空比
uint   count3 = 0;  			//为AD-trig计数 

BT     AD_Sp	  = 0;				//AD-sp信号

void  InitUart();				  	//初始化Uart函数
void  InitADC ();					//初始化ADC函数
void  SendData(uchar dat);			//发送数据到PC机
uchar GetADCResult(uchar ch);		//读取ADC接口的数据
void  Delay(uint n);				//延时函数
void  ShowResult(uchar ch);			

void main()
{ 

	AD_Sp  = 0;		  //初始化Sp

	EA  = 1;			  //全局中断打开

	AUXR |=  0x80;		  //辅助寄存器
	TMOD|=  0x01;		  

	TL0  = 0XC0;		  //初始化
	TH0  = 0XFf;
		
		
	
	IT0 = 1;			  //IT0中断打开
	EX0 = 1;

	TR0  = 0;		   	  //定时器0打开
	ET0  = 0;	

	IT1 = 1;			  //IT1中断打开
	EX1 = 1; 

	count2 = 0; 
	Flag2=0;
										
	InitUart();				//初始化Uart
	InitADC();  			//初始化ADC特殊寄存器
							//Start A/D conversion
	while (1) 
	{  
		ShowResult(0);		   		//在PC机上显示
	}
}

/*----------------------------
	在电脑上显示采集的数据
----------------------------*/
void ShowResult(uchar ch)
{
	SendData(GetADCResult(ch));
}
 
 
/*----------------------------
	   采集Video的数据
----------------------------*/

uchar GetADCResult(uchar ch)	  
{
	ADC_CONTR = ADC_POWER|ADC_SPEEDH|ch|ADC_START;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
		
	while (!(ADC_CONTR & ADC_FLAG));
	ADC_CONTR &= ~ADC_FLAG;

	return 	 ADC_RES;
} 

/*----------------------------
		初始化ADC寄存器
----------------------------*/
void InitADC()
{
	P1ASF = 0x01;		  			//设置P1.0口为ADC转换口
	ADC_RES = 0;					//清除上一个数据
	ADC_CONTR = ADC_POWER|ADC_SPEEDH;

	Delay(10);						//延时一段时间,开始ad转换
} 

/*----------------------------
	   初始化UART寄存器
----------------------------*/
void InitUart()
{
	SCON = 0x5a;
	TMOD |= 0x20;
	TH1 = TL1 = -(FOSC/12/32/BAUD);
	TR1 = 1;
}  


/*----------------------------
	   UART发送数据函数
----------------------------*/
void SendData(uchar dat)
{
	while (!TI);   				//等待先前的数据发送
	TI = 0;						//清除 TI 标志位
	if(AD_Sp)
	{
		SBUF = dat;					//发送最近的数据
	}
} 
 
/*----------------------------
		软件延时函数
----------------------------*/
void Delay(uint n)
{
	uint x;
	while (n--)
	{
		x = 100;
		while (x--);
	}
} 

/*---------------------------
	配置CLK信号和Reset信号
---------------------------*/
void Time0()interrupt 1 
{
	TL0=0XC3;
	TH0=0XFF;

	Flag1=~Flag1;	  //为解调仪模块提供CLK时钟

	if(count2--==0)	  //为解调仪模块提供RESET信号,其中积分时间为30个CLK周期。
	{
		if(Flag2==1)
		{
			count2=550;
			Flag2 =~Flag2;
		}
		else
		{
			count2=60;
			Flag2 =~Flag2;
		}
	}

} 

/*-----------------------
		接受AD-sp信号
------------------------*/
void exint0() interrupt 0 	  //接受AD—sp的信号P3.2
{
		Flag1=~Flag1;
		AD_Sp   = 1;								
} 

/*--------------------------------------
	采集AD-trig信号并且记录其个数
---------------------------------------*/
void exint1() interrupt 2 	 //接受AD-trig的信号P3.3
{
	
	if(AD_Sp)
	{
		
		Flag2=~Flag2;

		if(count1	==	Count)
		{	
			count1=0;		//接受trig信号的个数
			AD_Sp=0;
		}
		else
			count1++;
	}
} 												 
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-09 15:28
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 苹果系统的mac m1芯片的笔记本使用ce修改器使用不了
  • ¥15 单相逆变的电压电流双闭环中进行低通滤波PID算法改进
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 如何卸载arcgis 10.1 data reviewer for desktop
  • ¥15 共享文件夹会话中为什么会有WORKGROUP
  • ¥15 关于#python#的问题:使用ATL02数据解算光子脚点的坐标(操作系统-windows)
  • ¥115 关于#python#的问题:未加密前两个软件都可以打开,加密后只有A软件可打开,B软件可以打开但读取不了数据
  • ¥15 在matlab中Application Compiler后的软件无法打开
  • ¥15 想问一下STM32创建工程模板时遇到得问题
  • ¥15 Fiddler抓包443