大家好,最近我做一个简单的上位机程序,串口一直向外发送一串数据,同时,上位机如果接收到数据则点亮P25,P36为灭,数据不需要保存,判断接收到即可。数据接收到后打开定时器,如果过1S没有接收到数据,则熄灭P25,点亮P36。现在的问题是如果定时器中断函数不加,通信发送与接收都是正常的,加了定时器中断函数,整个程序都不运行了,不能发送了,也检测不到接收,第一次做定时器中断嵌套,不知道是什么问题,大家帮我看看,谢谢了。下面附程序:
#include<STC12C5A32S2.H>
#include<INTRINS.H>
sbit P25=P2^5;
sbit P36=P3^6;
unsigned char i=0;
unsigned char code tab[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
/*****************************************************************************
初始化
*****************************************************************************/
void UART_INIT(void)
{
SCON=0x50; //工作方式1,接收使能
TMOD|=0x21; //定时器1,工作方式2,定时器0,工作方式1
AUXR&=0x3F; //定时器0,1时钟为Fosc/12,即12T
AUXR&=0xFE; //串口1选择定时器1为波特率发生器
PCON&=0x7F; //波特率不加倍
TH1=0xF0; //波特率2400,时钟频率14.7456MHz
TL1=0xF0;
TH0=0XD0; //定时长度10ms
TL0=0X00;
TR0=0; //定时器0关,数据接收完毕使能
TR1=1; //定时器1使能
PS=1; //串口中断设为高优先级
EA=1; //打开总中断
ET0=1; //打开定时器0中断
ET1=0; //关定时器1中断
ES=1; //打开串口中断
}
/*****************************************************************************
软件延时1ms
*****************************************************************************/
void delay_1ms(unsigned int t)
{
unsigned int a,b;
for(a=0;a<t;a++);
for(b=0;b<1167;b++);
}
/*****************************************************************************
发送子函数
*****************************************************************************/
void sendchar(unsigned char ch)
{
SBUF=ch;
while(!TI);
TI=0;
}
/*****************************************************************************
主函数
*****************************************************************************/
void mian(void)
{
unsigned char s;
delay_1ms(100); //上电延时
UART_INIT();
while(1)
{
for(s=0;s<10;s++)
{
sendchar(tab[s]);
delay_1ms(100);
}
}
}
/*****************************************************************************
串口接收中断函数
*****************************************************************************/
void UART_Rountine(void) interrupt 4
{
if(RI)
{
RI=0;
i=0;
P25=0; //灯亮
P36=1; //灯灭
}
TR0=1; //打开定时器
}
/*****************************************************************************
定时器中断函数
*****************************************************************************/
void Timer0_Rountine(void) interrupt 1
{
TH0=0XD0; //定时长度10ms
TL0=0X00;
i++; //计数加1
if(i>=100) //超过1S没有进入接收中断
{
i=0; //计数清零
TR0=0; //关定时器
P25=1; //灯灭
P36=0; //灯亮
}
}
|