找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1415|回复: 2
收起左侧

问一个关于单片机中断的问题,两个方向的交通灯

[复制链接]
ID:510031 发表于 2019-4-13 22:04 | 显示全部楼层 |阅读模式
我想做一个两个方向的交通灯,红绿(0xed)——黄黄(0xf3)——绿红(0xde),用定时器和中断来做
但是结果是:一直只有2个灯亮,没有变化。
调试发现不会进入子程序。

单片机代码如下:
#include<reg52.h>

void Init_Timer(void)    //初始化
{    TMOD|=0x01;
    TH0=0x00;
    TL0=0x00;
    EA=1;         //总中断//
    ET0=1;        //定时器0允许//
    TR0=1;        //T0启停控制//
}
void display()
{    static unsigned char i;
   
    if(0<=i<=99)
    {
      P1=0xed;
     }
    else if(100<=i<=139)
     {   
         P1=0xf3;
     }
    else if(140<=i<=239)
     {   
         P1=0xde;
     }
       else if(i>239)
     {   
         i=0;
     }
     i++;
}
void Timer_isr(void) interrupt 1
{   
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        display();
}
void main()
{
    Init_Timer();
    while(1);
}
请问哪位能帮我看一下



回复

使用道具 举报

ID:213173 发表于 2019-4-14 08:03 | 显示全部楼层
if 括号内表达式错误。因为在任何时间都能满足 if(0<=i<=99) 的判断条件,不可能进入下一条判断语句。
正常表达式应该这样写 if(0<=i && i<=99),原来 if(0<=i<=99)的写法相当于 if(0<=i || i<=99)。

#include<reg52.h>

void Init_Timer(void)    //初始化
{
    TMOD|=0x01;
    TH0=0x00;
    TL0=0x00;
    EA=1;         //总中断//
    ET0=1;        //定时器0允许//
    TR0=1;        //T0启停控制//
}
void display()
{
    static unsigned char i;
   
        if(0<=i && i<=99)
        {
                P1=0xed;
        }
        else if(100<=i && i<=139)
        {   
                P1=0xf3;
        }
        else if(140<=i && i<=239)
        {   
                P1=0xde;
        }
        else if(i>239)
        {   
                i=0;
        }
        i++;
}
void Timer_isr(void) interrupt 1
{   
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        display();
}
void main()
{
    Init_Timer();
    while(1);
}
回复

使用道具 举报

ID:510031 发表于 2019-4-14 10:37 | 显示全部楼层
wulin 发表于 2019-4-14 08:03
if 括号内表达式错误。因为在任何时间都能满足 if(0

嗯嗯!太感谢老师了,看来还是基础不扎实,谢谢老师指出错误
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表