找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2923|回复: 1
收起左侧

基于51单片机控制的交通信号灯

[复制链接]
ID:719754 发表于 2020-9-27 10:54 | 显示全部楼层 |阅读模式
//主程序
void main()
{
        TMOD=0X11;                                           //定时器设置
        TH1=0X3C;               
        TL1=0XB0;
        TH0=0X3C;                                        //定时器0置初值 0.05S
        TL0=0XB0;
        EA=1;                                                //开总中断
        ET0=1;                                                //定时器0中断开启
        ET1=1;                                           //定时器1中断开启
        TR0=1;                                                //启动定时0
        TR1=0;                                                         //关闭定时1
        EX0=1;                                                //开外部中断0
        EX1=1;                                                //开外部中断1

        P2=0Xc3;                                        // 开始默认状态,东西绿灯,南北黄灯   
    sec_nb=sec_dx+5;                         //默认南北通行时间比东西多5秒
        while(1)                                          //主循环
        {         
                key();                                         //调用按键扫描程序
                display();                                 //调用显示程序
        }       
}
//函数的定义部分
void key(void)        //按键扫描子程序
{         
       
if(k1!=1)                                                        //当K1(禁止)键按下时
        {
                   display();                                       //调用显示,用于延时消抖
                   if(k1!=1)                                                //如果确定按下
                   {        
                    TR0=0;                                                //关定时器
                        Red_dx=1;
                        Red_nb=1;                                        //全部置红灯
                        TR1=0;
                        sec_dx=00;                                        //四个方向的时间都为00
                        sec_nb=00;
                        do
                        {
                                display();                                 //调用显示,用于延时
                        }       
                        while(k1!=1);                        //等待按键释放       
                   }
        }
        if(k2!=1)                                                        //当K2(确认)键按下时
        {       
                display();                                       //调用显示,用于延时消抖
                if(k2!=1)                                                //如果确定按下
                {
                        TR0=1;                                                  //启动定时器0
                        sec_nb=set_timenb;                                //从中断回复,仍显示设置过的数值
                        sec_dx=set_timedx;                                //显示设置过的时间
                        TR1=0;                                                          //关定时器1       
                        if(set==0)                                                //时间倒时到0时
                        {
                                P2=0X00;                                         //灭显示
                                Green_dx=1;                                                //东西绿灯亮
                                Red_nb=1;                                        //南北红灯亮
                                sec_nb=sec_dx+5;                         //回到初值
                        }
                        else
                        {
                                P2=0x00;                                        //南北绿灯,东西红灯
                                Green_nb=1;
                                Red_dx=1;
                                sec_dx=sec_nb+5;
                        }
                }
        }       
}

void display(void) //显示子程序
{               
        buf[1]=sec_nb/10;                 //第1位 东西秒十位
        buf[2]=sec_nb%10;                 //第2位 东西秒个位
        buf[3]=sec_dx/10;                 //第3位 南北秒十位
        buf[0]=sec_dx%10;                 //第4位 南北秒个位               
        P1=0xff;                          // 初始灯为灭的
        P0=0x00;                                     //灭显示
        P1=0xfe;                           //片选LED1
        P0=table[buf[1]];                //送东西时间十位的数码管编码                       
        delay(1);                                //延时
        P1=0xff;                                //关显示
        P0=0x00;                                //灭显示
                                                  
        P1=0xfd;                     //片选LED2
        P0=table[buf[2]];                 //送东西时间个位的数码管编码
        delay(1);                                 //延时
        P1=0xff;                                //关显示
        P0=0x00;                                //关显示
        P1=0Xfb;                                  //片选LED3
        P0=table[buf[3]];        //送南北时间十位的数码管编码
        delay(1);                                //延时
        P1=0xff;                                 //关显示
        P0=0x00;                                 //关显示
        P1=0Xf7;                                 //片选LED4       
        P0=table[buf[0]];        //送南北时间个位的数码管编码
        delay(1);                                //延时
}


仿真.png

交通信号灯.zip

526.13 KB, 下载次数: 73, 下载积分: 黑币 -5

回复

使用道具 举报

ID:1000039 发表于 2022-1-6 15:40 | 显示全部楼层
怎么改成1秒间隔闪烁
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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