C51单片机外部中断,定时中断,串口中断同时使用的问题

C51单片机外部中断,定时中断,串口中断同时使用的问题,第1张

应该一个定时器,一个计算器,一个外部中断。定时器中断设高。不要用外部中断计数,有可能会漏掉脉冲。开一个计数器就行,外部中断来了就开定时器和计数器。定时器到2S直接关计数器,并将计数值用串口发送。注意计数器满了之后会由FF变为00然后继续计数。

单片机定时器0设置为工作方式1为TMOD=0x01;定时器1设置工作方式1时TMOD=0x10阁下看TMOD里的各个位啥意思就知道了。
#include<reg52h>
void main()
{
while(1)
{
SBUF=0xfe;
while(!TI);
if(RI==1)RI=0;
REN=1;
P0=SBUF;
}
}
这个程序不对。
错误有:
1主程序没设定波特率、串口工作方式、定时器初值,也没说中断还是查询方式来工作,咋个通讯啊!
2假设已经设定好了,接下来的也不行。
while(!TI);
后面要加TI=0;清楚发送中断标志
3REN要放在最外头,除非你发送时不允许接收,才在里头写。
4 if(RI==1)RI=0;
要写成:while(!RI);RI=0;
一直等到接收完毕才将RI清零。接收时要停在哪儿等着,呵呵。所以是while不能是if
#include<reg52h>
void main()
{
TMOD=0x20;
SCON=0x50;//串口通讯方式1
TH1=0xfd;//波特率9600
TL1=0xfd;
TR1=1;
TI=0;//发送中断标志位清零
RI=0;//接收中断标志位清零
while(1)
{
SBUF=0xfe;
while(!TI);Ti=0;
while(!RI);Ri=0 ;
P0=SBUF;
}
}

首先要搞清楚这两个定时器是分别独立的,定时器都给定时1s的初值,程序初始化的时候就同时已经启动T0和T1开始定时(TMOD=0x11;
TH0=(65536-50000)/256;TL0=(65536-50000)%256;TH1=(65535-50000)/256;TL1=(65535-50000)%256;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;
这几句就同时启动两个定时器)若T0和T1定时的时间同时到,由于T0的优先级高于T1,此时T1先重载初值,开始下一秒的计数,然后执行T0的中断,T0执行完再执行T1的,这时的T1才重载初值,所以总会在T0一执行完中断后刚好执行T1的中断,因为T0与T1都是定时1s的,只是T0的那一秒T1慢了执行T0中断程序的时间

可以有3个办法,一个是设定中断优先级,响应一个中断后会响应另一个中断。
另一个是用一个中断用程序写出不同的响应代码,顺序执行两段程序。
第三个是用中断标志位,将两个中断标志,然后马上退出程序,在主程序检查标志位响应相应代码。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13165253.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-14
下一篇 2023-06-14

发表评论

登录后才能评论

评论列表(0条)

保存