找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3115|回复: 3
打印 上一主题 下一主题
收起左侧

基于51单片机的交通信号灯Proteus仿真图与带详细注释的程序

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


如上图显示一样,设计的是25秒交通信号灯(也可以自行改时间),这是课程设计时候写的,和现实的路灯情况一样 有需要的可以自行下载源码和仿真图。

单片机源程序如下:
  1. #define        uchar        unsigned char
  2. #define        uint        unsigned int
  3. #include        <reg52.h>
  4. /*****定义控制位**********************/
  5. sbit        EW_LED2=P2^3;        //EW_LED2控制位
  6. sbit        EW_LED1=P2^2;        //EW_LED1控制位
  7. sbit        SN_LED2=P2^1;        //SN_LED2控制位
  8. sbit        SN_LED1=P2^0;        //SN_LED1控制位
  9. sbit    SN_Yellow=P1^6; //SN黄灯
  10. sbit    SN_Red=P1^7;    //SN红灯
  11. sbit    EW_Yellow=P1^2; //EW黄灯
  12. sbit    EW_Red=P1^3;    //EW红灯
  13. bit     Flag_SN_Yellow;     //SN黄灯标志位
  14. bit     Flag_EW_Yellow;     //EW黄灯标志位
  15. char        Time_EW;  //东西方向倒计时单元
  16. char        Time_SN;  //南北方向倒计时单元
  17. uchar EW=30,SN=30,EWL=5,SNL=5;     //程序初始化赋值,正常模式
  18. uchar EW1=30,SN1=30,EWL1=5,SNL1=5; //用于存放修改值的变量
  19. uchar code table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~~~~9段选码
  20. uchar code S[9]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84,0x88};//交通信号灯控制代码

  21. /**********************延时子程序************************/
  22. void delay_ms(unsigned int x) //延时ms
  23. {
  24.         unsigned int i,j;
  25.         for(i=x;i>0;i--)
  26.         for(j=110;j>0;j--);
  27. }

  28. /*****************显示子函数**************************/
  29. void Display(void)
  30. {
  31.         char h,l;
  32.         h=Time_EW/10;
  33.         l=Time_EW%10;
  34.     P0=table[l];
  35.         EW_LED2=1;
  36.         delay_ms(1);
  37.         EW_LED2=0;
  38.     P0=table[h];
  39.         EW_LED1=1;
  40.         delay_ms(1);
  41.         EW_LED1=0;

  42.         h=Time_SN/10;
  43.         l=Time_SN%10;
  44.         P0=table[l];
  45.         SN_LED2=1;
  46.         delay_ms(1);
  47.         SN_LED2=0;
  48.     P0=table[h];
  49.         SN_LED1=1;
  50.         delay_ms(1);
  51.         SN_LED1=0;
  52.                
  53. }

  54. /**********************T0中断服务程序*******************/
  55. void timer0(void)interrupt 1 using 1
  56. {
  57.         static uchar count;
  58.         TH0=(65536-50000)/256;
  59.         TL0=(65536-50000)%256;
  60.         count++;
  61.        
  62.         if(count==10)
  63.         {
  64.           if(Flag_SN_Yellow==1) //测试南北黄灯标志位
  65.           {SN_Yellow=~SN_Yellow;}
  66.           if(Flag_EW_Yellow==1)  //测试东西黄灯标志位
  67.           {EW_Yellow=~EW_Yellow;}
  68.         }
  69.         if(count==20)        {
  70.                 Time_EW--;
  71.                 Time_SN--;
  72.         if(Flag_SN_Yellow==1)//测试南北黄灯标志位
  73.             {SN_Yellow=~SN_Yellow;}
  74.         if(Flag_EW_Yellow==1)//测试东西黄灯标志位
  75.             {EW_Yellow=~EW_Yellow;}
  76.         count=0;
  77.         }
  78.        
  79. }

  80. /*********************主程序开始**********************/
  81. void main(void)
  82. {

  83.     TMOD=0x01;//定时器工作于方式1
  84.         TH0=(65536-50000)/256;//定时器赋初值
  85.         TL0=(65536-50000)%256;
  86.         EA=1; //CPU开中断总允许
  87.         ET0=1;//开定时中断
  88.     TR0=1;//启动定时

  89.         /*******S0状态(初始状态)**********/
  90.         Time_EW=5;       
  91.         Time_SN=5;               
  92.         while(Time_SN>=0||Time_EW>=0)
  93.         {
  94.           Flag_EW_Yellow=0;           //EW关黄灯显示信号
  95.           P1=S[8];         //所有路口红灯
  96.           Display();
  97.         }
  98.        
  99.         while(1)                         
  100.         {
  101.                 /*******S1状态(主干道直行状态)**********/
  102.                 Time_EW=EW;       
  103.                 Time_SN=SN;               
  104.                 while(Time_SN>=4)
  105.             {
  106.               Flag_EW_Yellow=0;           //EW关黄灯显示信号
  107.                   P1=S[0];         //SN通行,EW红灯
  108.               Display();
  109.                 }
  110.        
  111.                 /*******S2状态(主干道直行黄灯闪烁状态)**********/
  112.             P1=0x00;
  113.                 while(Time_SN>=0)
  114.            {
  115.              Flag_SN_Yellow=1;         //SN开黄灯信号位
  116.                  EW_Red=1;      //SN黄灯亮,等待左转信号,EW红灯
  117.              Display();
  118.            }
  119.        
  120.                
  121.        
  122.            /***********赋值(主干道通行变次干道通行)**********/
  123.                 EW=EW1;
  124.                 SN=SN1;
  125.                 EWL=EWL1;
  126.                 SNL=SNL1;
  127.        
  128.                 /*******S3状态(次干道直行状态)**********/                       
  129.                 Time_EW=SN;
  130.                 Time_SN=EW;
  131.             while(Time_EW>=4)
  132.             {
  133.                   Flag_SN_Yellow=0;  //SN关黄灯显示信号                          
  134.                   P1=S[4];         //EW通行,SN红灯
  135.                   Display();
  136.                 }
  137.        
  138.                 /*******S4状态(次干道直行黄灯闪烁状态)**********/
  139.                 P1=0X00;
  140.                 while(Time_EW>=0)
  141.            {
  142.              Flag_EW_Yellow=1;//EW开黄灯信号位
  143.              SN_Red=1;//EW黄灯亮,等待左拐信号,SN红灯       
  144.              Display();
  145.            }
  146.        
  147.                
  148.        
  149.                     /***********赋值(次干道通行变主干道通行)**********/
  150.             EW=EW1;
  151.                 SN=SN1;
  152.                 EWL=EWL1;
  153.                 SNL=SNL1;
  154.         }
  155. }
复制代码

所有资料51hei附件下载:
交通信号灯.zip (104.11 KB, 下载次数: 90)

评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:334781 发表于 2022-4-26 05:53 | 只看该作者
最近想开发一个循环定时器的程序,一下子没有了思路,参考一下这个信号灯程序,有一定的帮助。
回复

使用道具 举报

板凳
ID:343934 发表于 2022-11-26 17:48 | 只看该作者
就是绿灯倒计时完全为零时,黄的开始亮三秒合理,
回复

使用道具 举报

地板
ID:1085202 发表于 2023-6-20 17:26 | 只看该作者
根据车流量改变信号灯时间要如何加上去啊?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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