定时中断不执行,不知道什么原因,着急啊
时间:10-02
整理:3721RD
点击:
现在这个程序遇到了一些问题:定时器定时5ms,在定时中断中计数1000次(既完成定时5S),执行串口发送字符,但是程序并没有发从出a,b...g,h.如果把count赋值在100,可以执行中断发送,但不是5s,如果把count赋值大于100,则执行send(i),并不执行中断发送程序。这是什么原因,难道和串口的中断发送相冲突,导致结果发布出来,还是什么原因,能给一个比较详细的解释么?谢谢
#include <reg52.h>
int i;
unsigned int count;
//延时1ms乘以count
void delay1ms(int count)
{
int j,k;
while(count--!=0)
{
for(j=0;j<9;j++)
for(k=0;k<15;k++)
;
}
}
//定时器T0定时5ms程序
void InitTimer0(void)
{
TMOD = 0x21;
TH0 = 0x0DC;
TL0 = 0x00;
EA=1;
ET0=1;
TR0=1;
}
//串口发送程序
send(unsigned char a)
{
TI = 0;
SBUF = a;
while(!TI);
}
//系统初始化
void init()
{
TMOD = 0X21; //timer 1 mode 2: 8-Bit reload
SCON = 0X50; //mode 1: 8-bit UART, enable receiver
TH1 = 0XFA; //reload value 19200 baud /22.1184M
TL1 = TH1;
PCON= 0X80;
TR1=1; //timer 1 run
TI=1;
}
//定时时间到之后,执行中断程序
void Timer0Interrupt(void) interrupt 1 using 1
{
TH0 = 0x0DC;
TL0 = 0x00;
count--;
if(count==1)
{
count = 10;
send('a');
send('b');
send('c');
send('d');
send('e');
send('f');
send('g');
send('h');
}
}
//主函数从此执行
main()
{ count=100;
delay1ms(100);
init();
InitTimer0();
send('i');
delay1ms(1000);
}
#include <reg52.h>
int i;
unsigned int count;
//延时1ms乘以count
void delay1ms(int count)
{
int j,k;
while(count--!=0)
{
for(j=0;j<9;j++)
for(k=0;k<15;k++)
;
}
}
//定时器T0定时5ms程序
void InitTimer0(void)
{
TMOD = 0x21;
TH0 = 0x0DC;
TL0 = 0x00;
EA=1;
ET0=1;
TR0=1;
}
//串口发送程序
send(unsigned char a)
{
TI = 0;
SBUF = a;
while(!TI);
}
//系统初始化
void init()
{
TMOD = 0X21; //timer 1 mode 2: 8-Bit reload
SCON = 0X50; //mode 1: 8-bit UART, enable receiver
TH1 = 0XFA; //reload value 19200 baud /22.1184M
TL1 = TH1;
PCON= 0X80;
TR1=1; //timer 1 run
TI=1;
}
//定时时间到之后,执行中断程序
void Timer0Interrupt(void) interrupt 1 using 1
{
TH0 = 0x0DC;
TL0 = 0x00;
count--;
if(count==1)
{
count = 10;
send('a');
send('b');
send('c');
send('d');
send('e');
send('f');
send('g');
send('h');
}
}
//主函数从此执行
main()
{ count=100;
delay1ms(100);
init();
InitTimer0();
send('i');
delay1ms(1000);
}
你的问题我看出来两点,给你说一下
1.串口波特率和定时器有问题,要用同一个定时器
2.在中断函数中加一个while(1)如:void Timer0Interrupt(void) interrupt 1 using 1
{
while(1)
{ TH0 = 0x0DC;
TL0 = 0x00;
count--;
if(count==1)
{
count = 10;
send('a');
send('b');
send('c');
send('d');
send('e');
send('f');
send('g');
send('h');
}
}
}
楼上的人才,加了while(1)就不能从中断函数出来了,可能是你定义的延时函数中count的类型有问题,改为unsigned int试试
问题解决了,不是你说的这个问题,你的解决方法也不对
不是别的问题,就是终端里面程序太多,主程序里面没有调用好
没道理啊,中断里面直接用了一个while(1)怎么从中断里出来呢?小弟新手,有些地方不懂还请小编见谅,就请小编告知一下!