新手求大哥大姐帮忙,程序问题解答疑问

2019-07-15 18:57发布

#include <reg51.h>         
         sbit  led1=P0^1;
         sbit  led2=P0^2;
         sbit  led3=P0^3;
               
                        
void main()

{           
           TMOD=0X01;
        TH0=(65536-50000) /256;
        TL0=(65536-50000)%256;
           EA=1;//中断开关
           ET0=1;//定时0
           TR0=1;

           led1=0;
           led2=1;
           led3=0;
          while(1)        ;/*为什么要有这条语句?猜想:
          TH0+TL0共用50ms>led1~led3这三条语句执行的时间        ,
          所以主函数执行完了,而TR0未来得及跳转到中断函数去执行。*/
         

}

   void T0_time() interrupt 1
   {
           
                         TH0=(65536-50000) /256;
                         TL0=(65536-50000)%256;
                         a++;                //为什么有这样一条if语句?
                         if(a==20)
                         {
                                a=0;
                                led1=~led1;
                                led2=~led2;
                                led3=~led3;

                                 }
                  }
        


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
zy2014
1楼-- · 2019-07-15 20:36
while(1);
让程序一直运行,否则程序就会跳出main函数,程序就会退出,之后就与中断没有关系了。


a++;
如果变量a不自增的话(a的值一直为0),那么led1 led2 led3的值在哪里改变。

评分

参与人数 1积分 +2 收起 理由 dongyumin + 2 您的付出是论坛的动力,感谢您一直支持!.

查看全部评分

苍穹小狐
2楼-- · 2019-07-15 22:26
zy2014 发表于 2014-7-31 16:46
while(1);
让程序一直运行,否则程序就会跳出main函数,程序就会退出,之后就与中断没有关系了。

喔喔,谢谢,但后面那个我还不明白,中断函数里面没循环语句,怎么可以使  a++; 再执行呢?

非常感谢,嘿嘿
zy2014
3楼-- · 2019-07-16 03:51
中断:CPU在执行一个程序时,对系统发生的某个事件(程序自身或外界的原因)作出的一种反应:CPU暂停正在执行的程序,保留现场后自动转去处理相应的事件,处理完该事件后,到适当的时候返回断点,继续完成被打断的程序。

这里你是用的是T0定时器/计数器的中断,一旦开启定时器,定时器便开始计数,当计数溢出时,自动进入中断服务程序执行代码(TH0,TL0又被重新赋值),执行完中断服务程序后再回到原来处继续执行(while(1))。至于定时器为什么会自增,咱也不明白,这都是芯片层次的了。

苍穹小狐
4楼-- · 2019-07-16 06:23
呼,搞明白了,等会我再用for循环试试。

谢啦,哈哈。。。。。
583302104
5楼-- · 2019-07-16 06:24
 精彩回答 2  元偷偷看……
苍穹小狐
6楼-- · 2019-07-16 07:15
583302104 发表于 2014-7-31 18:03
这个是led间隔1秒闪烁的程序,因为方式1最多能记65536us,所以取50000us也就是50ms中断一次,中断一次a的值 ...

谢谢,你的好意,,嗯嗯

一周热门 更多>