mcs单片机机MCS-51问题。 1:50ms延迟和1ms延迟怎么实现有什么差别。2:定时计数器

查看: 4995|回复: 8
关于51单片机多个定时器同时工作问题,
首先谢谢回答。我用的是郭天祥的教材,例3.5.2。我把程序烧录进去没反应,问题是:当同时打开定时器0和定时器1,他们都是中断一次50ms。刚开始工作时,它们分别进行计数, 几乎同时计满。但默认情况系(没有设置中断优先级),CPU先响应T0发起来的中断请求(T0和T1同时发起请求,T1也发起中断请求只是CPU没搭理他),然后开始执行T0的中断服务。等T0中断服务结束后,才开始响应T1的中断请求(之前T1一直处在请求中断之 中),此时T0已经重装初值,开始重新计时。
这就是我理解的这个过程不知道对不对?求指导,谢谢!
下面是程序和要求。
//用定时器0的方式1实现第一个发光二极管以200ms间隔闪烁;用定时器1的方式1实现数码管前两位59s循环计时。
#include&reg52.h&
#define uint unsigned int
#define uchar unsigned char
sbit led1=P1^0;
sbit dula=P2^6;& & & && &//段锁存
sbit wela=P2^7;& & & & //位锁存
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayxms(uchar);& & & && &//延迟xms(毫秒)
void display(uchar,uchar);& & & &&&
uchar num0,num1,num,aa,
void main()
& & & & EA=1;
& & & & ET0=1;
& & & & ET1=1;
& & & & TMOD=0x11;
& & & & TH0=()/256;
& & & & TH0=()%256;
& & & & TH1=()/256;
& & & & TL1=()%256;
& & & & TR0=1;
& & & & TR1=1;
& & & & while(1)
& & & & & & & & display(aa,bb);
void delayxms(uchar xms)
& & & & uchar i,j;
& & & & for(i=i&0;i--)
& & & & & & & & for(j=110;j&0;j--);
void display(uchar ge,uchar,shi)
& & & & dula=0;
& & & & wela=0;
& & & & P0=table[shi];
& & & & dula=1;
& & & & dula=0;
& & & & P0=0
& & & & wela=1;
& & & & P0=0& & & & & & & & & & & &&&//位选择(十位)
& & & & wela=0;
& & & & delayxms(5);
& & & & dula=0;
& & & & wela=0;
& & & & P0=table[ge];
& & & & dula=1;
& & & & dula=0;
& & & & P0=0
& & & & wela=1;
& & & & P0=0& & & && & //位选择(个位)
& & & & wela=0;
& & & & delayxms(5);
void timer0() interrupt 1& & & & //定时器0中断服务
& & & & TH0=()/256;
& & & & TH0=()%256;
& & & & num0++;& & & & & & & & & & & & & & & && & //num0对定时器0进行计数,每次50ms
& & & & if(4==num0)
& & & & & & & & num0=0;
& & & & & & & & led1=~led1;
void timer1() interrupt 3& & & &&&//定时器1中断服务
& & & & TH0=()/256;
& & & & TH0=()%256;
& & & & num1++;& & & & & & & & & & & & & & & & & & & &&&//num1对定时器1进行计数,每次50ms
& & & & if(20==num1)
& & & & & & & & num++;
& & & & & & & & if(60==num)
& & & & & & & & num=0;
& & & & & & & & aa=num/10;
& & & & & & & & bb=num%10;
 理解得很透彻。T0优先级高于T1。所以T0比T1先执行中断,也就先重装初值,T1处于暂停,所以每次T0进入中断T1都会暂停。所以T1的时间会大于50ms,至于你说的完全没反应有可能是你的板子和老郭的不一样导致的
 我也是用的郭老师的书,板子不是他的,显示不出来
程序语句有多处错误,装入初值语句那,至少3处错误,,跟我刚开始的时候犯的错误差不多,。
程序语句有多处错误,装入初值语句那,至少3处错误,,跟我刚开始的时候犯的错误差不多,。
这个是我提问时临时写的,里面有几点错误:
1,重装初值都装到TH0了
2,num1要清零,
3,void display(uchar&&ge,uchar shi)中uchar和shi之间没有逗号。
我烧程序时,没有这些错误,主要是if(60==)下的 {&&}把aa=num/10;和bb=num%10;都括起来了。谢谢回答,已经解决了
这个是我提问时临时写的,里面有几点错误:
1,重装初值都装到TH0了
2,num1要清零,
是if(60==num),抱歉,匿名不能修改已发表的内容
我也是用的郭老师的书,板子不是他的,显示不出来
好的,最好配套,如果是刚学的话。最好自己边焊接边学习
理解得很透彻。T0优先级高于T1。所以T0比T1先执行中断,也就先重装初值,T1处于暂停,所以每次T0进入中断T1 ...
谢谢第一个回答的呀,现在已经解决,我用的是他的书和他的板子。我的账户,密码忘了,找回时,这网站老不给我发邮件,所以回复的慢了点,抱歉
这个是我提问时临时写的,里面有几点错误: 1,重装初值都装到TH0了 2,num1要清零, 3,void display(uchar&&ge,uchar shi)中uchar和shi之间没有逗号。 我烧程序时,没有这些错误,主要是if(60==)下的 {&&}把aa=num/10;和bb=num%10;都括起来了。谢谢回答,已经解决了
Powered by

我要回帖

更多关于 mcs51指令集 的文章

 

随机推荐