关于51单片机的串口和定时器共用冲突

做一个篮球计分系统,我用定时器T0,来计算时间,然后再数码管上显示。然后串口将时间和分数发送出去。用外部中断0来设置系统的运行和暂停。只要我不用设置串口,数码管就可以正常运行,计时也可以正常运行,就是不设置串口的工作方式SM0,和SM1与定时器有关就能正常工作,如果设置为方式2也可以工作,方式二就是波特率是固定的,与定时器无关。不然的话就不能工作了代码如下:
#include<reg51.h>
#define LEDData P0
#define uchar unsigned char
#define uint8 unsigned int
uchar RS485_Flag,RS485_SBUF;
unsigned char code LEDCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //???0--9???
unsigned char minit,second,count,count1; //?,?,???
unsigned char set_minit=12,set_second=0;
void RS485_init(void);
void Seri(void);
void send_data1(int String);
void send_data(uchar String);

sbit add1=P1^0;
sbit dec1=P1^1;
sbit exchange=P1^2;
sbit add2=P1^3;
sbit dec2=P1^4;
sbit secondpoint=P0^7;
sbit led1=P2^7;
sbit led2=P2^6;
sbit led3=P2^5;
sbit led4=P2^4;
sbit led5=P2^3;
sbit led6=P2^2;
sbit led7=P2^1;
sbit led8=P2^0;
sbit led9=P3^7;
sbit led10=P3^6;
sbit alam=P1^7; //??
bit playon=0;
bit timeover=0;
bit AorB=0;
bit halfsecond=0;
unsigned int scoreA;
unsigned int scoreB;
void send_data1(int String)
{
uchar a,b;
a = String/10;
b = String%10;
send_data(a+48);
send_data(b+48);
}
void send_data(uchar String)
{
SBUF = String;
while(TI==0);
TI = 0;
}
void RS485_INT(void) interrupt 4
{
// if(SBUF==AddressID)
{
if(RS485_Flag == 0) //??
{
while(RI == 0);
RI=0;
RS485_SBUF=SBUF;
RS485_Flag = 1;
}
if(RS485_Flag == 1)
{
ES = 0;
RS485_Flag = 0;
SBUF = RS485_SBUF;
while(!TI); //????????
TI = 0; // ?????????
ES = 1; // ??????
}
}
}
void Delay5ms(void)
{
unsigned int i;
for(i=100;i>0;i--);
}
void RS485_init(void) //9600bps@11.0592MHz
{
//SCON = 0xF0; //REN=1????????,??????3,SM2=1
SM0=0;
SM1=1; //???????1
REN=1; // ????

串口需要定时器1或定时器2作为波特率发生器哦,这个定时器要工作在方式2,不能中断。
按照你说的,应该没有这个问题,串口不会影响T0的。
代码不完全,看不出来呢追问

你有邮箱吗?我把完整的代码传给你。这里贴不下

追答

这里好像贴不了邮箱吧。
三五二五三四二七零

追问

已经发给你,了,麻烦你看一看。我是在proteus里面仿真的

温馨提示:内容为网友见解,仅供参考
无其他回答

关于51单片机的串口和定时器共用冲突
串口需要定时器1或定时器2作为波特率发生器哦,这个定时器要工作在方式2,不能中断。按照你说的,应该没有这个问题,串口不会影响T0的。代码不完全,看不出来呢

51单片机定时和串口冲突?
T0中断太频繁了,因为同级中断,T0优先,所以总抢占中断,串口被边缘话了。修改一下程序:void timer_init(){ TMOD=0x22;SCON=0X50;TH1=0xfd;TL1=0xfd;TR1=1;TH0=246;TL0=246;ET0=1;TR0=1;ES=1;EA=1;PS=1; } void timer0_int() interrupt 1 {time++;if(time<50)\/\/count为占空比...

51单片机定时器0和定时器1使用冲突
SM1=1;当 REN=1; 执行完后,单片机完全符合串口方式0,同步移位方式,如果你这时板子接在电脑串口上,不管你电脑有没有发串口数据,单片机RXD脚已经在接收了,而且你没写串口中断,RI不清0,那就在串口中断里出不来了,下面的程序都做不到,所以你定时器0不动,关了T1就等于关了串口,也就正常...

51单片机定时器和串口通讯冲突怎么办?
void init_int() \/\/串口、定时器初始化 { TMOD|=0x20; \/\/定时器T1,方式二 TH1=0xfd; \/\/波特率2400 TL1=0xfd;TR1=1; \/\/启动T1 SM0=0; \/\/串口,工作方式一 SM1=1;REN=1; \/\/允许接收 ES=1; \/\/串口中断允许 EA=1; \/\/开总中断 } 然后中断里面是这样写...

为什么我c51单片机定时器数码管显示和串口不能同时实现?
注意c51单片机串口要用到定时器1作为波特率发生器。如果数码管显示也用定时器1就会冲突。

51单片机串口中断和产生波特率的定时器中断为什么不能同时开启?_百度...
利用51单片机的定时器1的溢出率产生波特率,并不需要打开 T1 的中断。如果打开了,你就应该编写相应的中断程序。如果,你没有写中断程序,那么,它中断后,自然就会给你添乱。

51单片机,定时器中断和外部中断冲突了,外部中断后再也进不入定时中断...
外部中断里不要做太多事情吧。简单置个标志位之类的,在主函数里轮询标志位去执行代码。在中断里做太多事情,是一大忌。

STC51单片机同时使用定时器0定时器1和串口
用 T1 控制波特率,此期间,T1 就不能用来中断了。其实,想要实现定时,有一个 T0 足以满足各种需求。T1,就不应该用来做定时用。T2,是有的。

51单片机T0工作于方式3的时候,这时T1口不能用作定时器和中断,是因为会...
51单片机T0工作于方式3的时候,T0占用了T1的资源。这时,用 T1 计数、定时,也都还可以,但是,T1 不能中断了,只能用查询的方法。T1,此时仅仅适合于用于控制串口的波特率。控制波特率时,T1,一般都是设置为方式2。想关闭T1定时器,是不是TMOD要设为0x33?对。如果,想要 T1 停止工作,把 T1 设...

51单片机两个定时器互相干扰怎么办
具体的事件的具体执行在中断外执行---也就是在中断里只置位或清事件的标志位,中断里的程序执行时间尽可能小,越小两个定时器互相干扰的就越少。对于那些实时性要求特别苛刻的应用(us级别,响应的延迟最多在12us或者更小),建议用双mcu或者cpld之类。

相似回答