关于定时器0和串口的问题
时间:10-02
整理:3721RD
点击:
各位,最近在调试的时候发现个问题,希望大神能帮忙看下是什么原因。
只要程序中ES=1,定时器0工作,但是串口无反应,但是将ES=0注释掉之后,程序就正常了,这是为什么?
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar t0;
void init()
{
TMOD=0x21;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
TH1=0xfd;
TL1=0xfd;
TR1=1; //打开定时器1
REN=1; //允许串口接收数据
SM0=0; //10位异步传输
SM1=1;
ES=1; //开串口中断 就是这里,将ES=1注释掉之后程序正常?不解
EA=1; //开总中断
}
void main()
{
init();
while(1);
}
void timer0() interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
t0++;
if(t0==20)
{
SBUF=0xaa;
}
}
只要程序中ES=1,定时器0工作,但是串口无反应,但是将ES=0注释掉之后,程序就正常了,这是为什么?
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar t0;
void init()
{
TMOD=0x21;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
TH1=0xfd;
TL1=0xfd;
TR1=1; //打开定时器1
REN=1; //允许串口接收数据
SM0=0; //10位异步传输
SM1=1;
ES=1; //开串口中断 就是这里,将ES=1注释掉之后程序正常?不解
EA=1; //开总中断
}
void main()
{
init();
while(1);
}
void timer0() interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
t0++;
if(t0==20)
{
SBUF=0xaa;
}
}
程序的主要用途时采集数据之后将数据通过232传输到电脑上,现在先调试每隔一段时间将固定数据输出到电脑上
没看见你的串口中断程序呀
你开串口中断有啥用?在那里出来串口中断?
你一开串口中断,可能串口一中断,程序就飞了吧
是一定的啊,你开了串口中断后,又没有写中断程序!自然啊中断后RI=1;了,就无法跳出中断
去掉ES=1;就可以
在tmod前,将总中断关掉
开了串口中断,每发送或接收一字节数据都会进入串口中断,并且只有清除了串口中断标志位才会退出中断。没有对应的中断函数,那么程序就一直停留在串口中断入口,等待TI或RI清零
嗯,昨天晚上想了很久,也判断是这个问题,今天测试下看看