关于STC单片机的中断问题

wx672497940 2014-11-11 06:12:32
先说下问题,程序中我设置了两个中断,一为定时器0中断,二为串口中断。单片机上电后,程序运行正常,P37叫的电平变化也正常,当进入串口接收到0x11,P37的电平频率发生明显变化,当串口收到其他数值时,P37电平频率又正常,按道理这是不应该影响到的。现贴上部分程序,求指点迷津!


typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned long ULONG;

BYTE UART_data; //定义串口接收数据变量
BYTE data_used[6]; //定义空数组,用于中断数据处理
BYTE num;
ULONG Water_AD,Water_VO,Ziwai,Voc,Average,Sum,Wum;
WORD i,count;
WORD WFlag=0,ZFlag=0,VFlag=0,flag=0;


#define FOSC 11059200L //定义晶振频率
#define BAUD 9600 //定义波特率

/*定义翻转引脚*/
sbit P37 = P3^7;


/*延时函数声明*/
void Delay(WORD n);
void Delay_ms(WORD a);

/*******************************************************************************
* 函数名 : Timer0Interrupt
* 描述 : 串口中断处理函数
* 输入参数 : 无
* 返回参数 : 无
*******************************************************************************/
void Timer0Interrupt() interrupt 1 using 1
{
TL0 = (65536-10)%256;
TH0 = (65536-10)/256;
count++;
if(count=5)
{
flag=1;
count=0;
}
}


/*******************************************************************************
* 函数名 : InitializeTimer0
* 描述 : 定时器初始化
* 输入参数 : 无
* 返回参数 : 无
*******************************************************************************/
void InitializeTimer0()
{
TMOD = 0x01; //定义Timer0为16位工作方式
TL0 = (65536-10)%256;
TH0 = (65536-10)/256;

ET0 = 1; //允许Timer0 中断
EA = 1;
TR0 = 1;
count = 0;
}

/*******************************************************************************
* 函数名 : InitializeADC
* 描述 : ADC初始化
* 输入参数 : 无
* 返回参数 : 无
*******************************************************************************/
void InitializeADC()
{
P1 = P1M0 = P1M1 = 0xff;
ADC_DATA = 0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
Delay(2);
}

/*******************************************************************************
* 函数名 : ReadADCData
* 描述 : ADC初始化
* 输入参数 : ch
* 返回参数 : ADC_DATA
*******************************************************************************/
BYTE ReadADCData(BYTE ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //延时
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG)); //等待完整标志位
ADC_CONTR &= ~ADC_FLAG; //关闭 ADC

return ADC_DATA;
}

/*******************************************************************************
* 函数名 : InitializeUsart
* 描述 : 串口初始化
* 输入参数 : 无
* 返回参数 : 无
*******************************************************************************/
void InitializeUsart()
{
EA = 1; //允许中断
ES = 1;
SCON = 0x5a; //8 数据位,无校验位
TMOD = 0x20;
TH1 = TL1 = -(FOSC/12/32/BAUD); //设置波特率
TR1 = 1;
}

/*发送一个字节 */
void SendData(unsigned char dat)
{
while (!TI);
TI = 0;
SBUF = dat;
}

/*******************************************************************************
* 函数名 : DataGet
* 描述 : 获取水分数值
* 输入参数 : 无
* 返回参数 : 无
*******************************************************************************/
void DataGet()
{
P37=1;
_nop_();
Water_AD=ReadADCData(1);
_nop_();
P37=0;
}

/*******************************************************************************
* 函数名 : Analyze
* 描述 : 水分数据处理函数
* 输入参数 : 无
* 返回参数 : 无
*******************************************************************************/
void Analyze()
{
Water_VO=Water_AD*50/256;
if(Water_VO>0)
{
for(i=0;i<10;i++)
{
Sum+=Water_VO;
}
Average=Sum/10;
SendData(Average);
Sum=0;
}
}

/*******************************************************************************
* 函数名 : main
* 描述 : 主函数
* 输入参数 : 无
* 返回参数 : 无
*******************************************************************************/
void main()
{
InitializeTimer0();
InitializeADC();
InitializeUsart();

while (1)
{
if(flag)
{
flag=0;
DataGet();
}
if(WFlag)
{
WFlag=0;
Analyze();
}
}
}

/*******************************************************************************
* 函数名 : UsartInterrupt
* 描述 : 串口中断处理函数
* 输入参数 : 无
* 返回参数 : 无
*******************************************************************************/
void UsartInterrupt(void) interrupt 4 using 2
{
RI = 0; //令接收中断标志位为0(软件清零)
UART_data = SBUF; //将接收到的数据送入变量 UART_data

if(UART_data==0x11)
{
WFlag=1;ZFlag=0;VFlag=0;
}
else if(UART_data==0x22)
{
ZFlag=1;WFlag=0;VFlag=0;
}
else if(UART_data==0x33)
{
VFlag=1;WFlag=0;ZFlag=0;
}
}
...全文
1025 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2015-01-20
  • 打赏
  • 举报
回复
引用 4 楼 PALLEE 的回复:
[quote=引用 3 楼 liuchang910781261 的回复:] TH1 = TL1 = -(FOSC/12/32/BAUD); //设置波特率 ---为什么波特率还是负数?
补码吧[/quote] 还有这样的补码?
palleexu 2015-01-19
  • 打赏
  • 举报
回复
引用 3 楼 liuchang910781261 的回复:
TH1 = TL1 = -(FOSC/12/32/BAUD); //设置波特率 ---为什么波特率还是负数?
补码吧
liuchang910781261 2015-01-19
  • 打赏
  • 举报
回复
TH1 = TL1 = -(FOSC/12/32/BAUD); //设置波特率 ---为什么波特率还是负数?
fenggfd 2015-01-07
  • 打赏
  • 举报
回复
剩下的没仔细看
zyzhang365 2014-12-02
  • 打赏
  • 举报
回复
void Timer0Interrupt() interrupt 1 using 1 { TL0 = (65536-10)%256; TH0 = (65536-10)/256; count++; if(count=5) // 你这玩意儿对吗 { flag=1; count=0; } } 剩下的没仔细看。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧