找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8018|回复: 5
收起左侧

单片机交通灯设计(东西南北四个方向分别添加红、黄、绿交通信号灯)

[复制链接]
ID:322586 发表于 2018-5-5 10:11 | 显示全部楼层 |阅读模式
、任务功能介绍:
(1)四位数码管计时,分别代表小时和分钟(为了便于演示,可加快时间,实际是最高两位按分钟变动,低两位按秒变动)
(2)两个独立按键,分别对小时数,分钟数修改(按一下加一个值)
(3)东西南北四个方向分别添加红、黄、绿交通信号灯以及两位数码管显示信号灯剩余时间。

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<rtx51tny.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit con=P3^2;                 //存储寄存器的时钟输入。

  6. sbit snr=P2^2;                //上升沿时移位寄存器中的数据进入存储寄存器,         
  7. sbit sng=P2^3;                    //下降沿时存储寄存器中的数据保持不变。                                                         
  8. sbit sny=P2^4;                    //应用时通常将ST_CP置为低点平,
  9. sbit ewr=P2^5;                    //移位结束后再在ST_CP端产生一个正脉冲更新显示数据。                 
  10. sbit ewg=P2^6;
  11. sbit ewy=P2^7;

  12. sbit KEY1 = P1^0;      
  13. sbit KEY2 = P1^1;
  14. sbit LA=P2^0;
  15. sbit LB=P2^1;

  16. uchar minute=0;
  17. uchar hour=0;
  18. uchar code DSY_DUAN[]={0x3f,0x06,0x5b,0x4f,0x66,
  19.                                                 0x6d,0x7d,0x07,0x7f,0x6f};
  20. unsigned char code tew[]={0x06,0x7f,0x06,0x07,0x06,0x7d,0x06, 0x6d,
  21.                                                         0x06,0x66,0x06,0x4f,0x06,0x5b,0x06,0x06,
  22.                                                         0x06,0x3f,0x3f,0x6f,0x3f,0x7f,0x3f,0x07,
  23.                                                         0x3f,0x7d,0x3f,0x6d,0x3f,0x66,0x3f,0x4f,
  24.                                                         0x3f,0x5b,0x3f,0x06,0x3f,0x3f,0x06,0x66,
  25.                                                         0x06,0x4f,0x06,0x5b,0x06,0x06,0x06,0x3f,
  26.                                                          0x3f,0x6f,0x3f,0x7f,0x3f,0x07,0x3f,0x7d,
  27.                                                         0x3f,0x6d,0x3f,0x66,0x3f,0x4f,0x3f,0x5b,
  28.                                                         0x3f,0x06,0x3f,0x3f,0x3f,0x4f,0x3f,0x5b,
  29.                                                         0x3f,0x06,0x3f,0x3f};
  30.                                              //东西方向数码管倒计时段码表
  31. unsigned char code tsn[]={0x06,0x66,0x06,0x4f,0x06,0x5b,0x06,0x06,
  32.                                                         0x06,0x3f,0x3f,0x6f,0x3f,0x7f,0x3f,0x07,
  33.                                                         0x3f,0x7d,0x3f,0x6d,0x3f,0x66,0x3f,0x4f,
  34.                                                         0x3f,0x5b,0x3f,0x06,0x3f,0x3f,0x3f,0x4f,
  35.                                                         0x3f,0x5b,0x3f,0x06,0x3f,0x3f,0x06,0x7f,
  36.                                                         0x06,0x07,0x06,0x7d,0x06,0x6d,0x06,0x66,
  37.                                                         0x06,0x4f,0x06,0x5b,0x06,0x06,0x06,0x3f,
  38.                                      0x3f,0x6f,0x3f,0x7f,0x3f,0x07,0x3f,0x7d,
  39.                                                         0x3f,0x6d,0x3f,0x66,0x3f,0x4f,0x3f,0x5b,
  40.                                                         0x3f,0x06,0x3f,0x3f};
  41.                                             //南北方向数码管倒计时段码表
  42. void delay(uint t)
  43. {
  44.    uchar i;
  45.    while(t--);
  46.    for(i=0;i>250;i++);
  47. }


  48. void job0() _task_ 0
  49. {
  50.     os_create_task(1);
  51.         os_create_task(2);
  52.         os_create_task(3);
  53.         os_create_task(4);
  54.         os_create_task(5);
  55.         os_delete_task(0);
  56. }
  57. void job1() _task_ 1                  //十字路口数码管倒计时部分
  58. {         
  59.         uchar i;
  60.         SCON=0x00;                          //配置串口通信为方式0,八位同步移位寄存器
  61.         con=0;                                  //con先拉低,后拉高
  62.         while(1)
  63.         {
  64.            for(i=0;i<38;i++)             //每两个数码管倒计时部分共有76个段码,
  65.                                       //所以需要乘2才能到达下一个状态。        
  66.               {
  67.                            SBUF=tsn[i*2];              //南北方向9-15数码管扫描
  68.                            while(!TI);
  69.                            TI=0;                          //软件清零部分;
  70.                            SBUF=tsn[i*2+1];      //南北方向1-7数码管扫描
  71.                            while(!TI);
  72.                            TI=0;
  73.                         SBUF=tew[i*2];
  74.                            while(!TI);
  75.                            TI=0;               
  76.                         SBUF=tew[i*2+1];
  77.                            while(!TI);
  78.                            TI=0;                      //接收完毕信号;
  79.                            con=1;                           //595芯片ST_CP端工作;
  80.                            os_wait(K_IVL,10,0);       //延时100ms;
  81.                            con=0;                           //595芯片ST_CP端停止工作;
  82.           }
  83.         }                  
  84. }

  85. void job2() _task_ 2
  86. {
  87.    while(1)
  88.    {
  89.                 minute++;                    //分钟加一
  90.                 if(minute==60)               //分钟满60;
  91.                 {
  92.                         minute=0;                //分钟清零;
  93.                         hour++;                  //小时加一;
  94.                         if(hour==60)             //小时满60;
  95.                         {
  96.                                 hour=0;              //小时清零;
  97.                         }
  98.                            
  99.                 }
  100.                 os_wait(K_IVL,100,0);        //延时1s;
  101.         }
  102. }
  103. void job3() _task_ 3                    //按键检测
  104. {
  105.         while(1)
  106.         {
  107.                 if(P1!=0xff)                //有键被按下;
  108.                 {
  109.                         delay(10);
  110.                         
  111.                         if(KEY1==0)                    //如果第一个键被按下,分钟个位加一;
  112.                         {
  113.                                 minute=minute%10+1;
  114.                                 if(minute==60)      //分钟满60清零
  115.                                 {
  116.                                         minute=0;
  117.                                 }
  118.                         }
  119.                         else if(KEY2==0)        //如果第二个键被按下,小时个位加一;
  120.                         {
  121.                                 hour=hour%10+1;
  122.                                 if(hour==60)        //小时满60清零
  123.                                 {
  124.                                         hour=0;
  125.                                 }
  126.                         }
  127.                         while(P1!=0xff);             //判断抬起;   
  128.                 }
  129.         }
  130. }

  131. void job4() _task_ 4                    //计时数码管扫描程序
  132. {
  133.         while(1)
  134.         {

  135.                 LA=1,LB=1;                            //P2口前两个管脚输入
  136.                 P0=DSY_DUAN[minute%10];                //分个
  137.                 delay(500);
  138.         
  139.                 LA=1,LB=0;
  140.                 P0=DSY_DUAN[hour%10];           //时个
  141.                 delay(500);
  142.                
  143.                 LA=0,LB=1;
  144.                 P0=DSY_DUAN[minute/10];
  145.                 delay(500);
  146.         
  147.                 LA=0,LB=0;
  148.                 P0=DSY_DUAN[hour/10];
  149.                 delay(500);         
  150.    }         
  151. }

  152. void job5() _task_ 5               //南北方向交通灯
  153. {
  154.    while(1)
  155.    {
  156.             snr=0;sng=1;sny=1;                                                           //南北红,东西绿
  157.          ewr=1;ewg=0;ewy=1;
  158.          os_wait(K_IVL,150,0);
  159.          
  160.          snr=0;sng=1;sny=1;                                                           //南北红,东西黄
  161.          ewr=1;ewg=1;ewy=0;
  162.          os_wait(K_IVL,10,0);
  163.          snr=0;sng=1;sny=1;                                                           //南北红,东西黄
  164.          ewr=1;ewg=1;ewy=1;
  165.          os_wait(K_IVL,10,0);
  166.          snr=0;sng=1;sny=1;                                                           //南北红,东西黄
  167.          ewr=1;ewg=1;ewy=0;
  168.          os_wait(K_IVL,10,0);
  169.          snr=0;sng=1;sny=1;                                                           //南北红,东西黄
  170.          ewr=1;ewg=1;ewy=1;
  171.          os_wait(K_IVL,10,0);
  172.          
  173.          snr=1;sng=0;sny=1;                                                           //南北绿,东西红
  174.          ewr=0;ewg=1;ewy=1;
  175.          os_wait(K_IVL,150,0);
  176.          
  177.          snr=1;sng=1;sny=0;                                                           //南北黄,东西红
  178.          ewr=0;ewg=1;ewy=1;
  179.          os_wait(K_IVL,10,0);
  180.          snr=1;sng=1;sny=1;                                                           //南北黄,东西红
  181.          ewr=0;ewg=1;ewy=1;
  182.          os_wait(K_IVL,10,0);
  183.          snr=1;sng=1;sny=0;                                                           //南北黄,东西红
  184.          ewr=0;ewg=1;ewy=1;
  185.          os_wait(K_IVL,10,0);
  186.          snr=1;sng=1;sny=1;                                                           //南北黄,东西红
  187.          ewr=0;ewg=1;ewy=1;
  188.          os_wait(K_IVL,10,0);

  189.    }
  190.         os_wait(K_IVL,100,0);   
  191. }
复制代码

所有资料51hei提供下载:
红绿灯.rar (45.99 KB, 下载次数: 68)
回复

使用道具 举报

ID:430008 发表于 2018-11-20 19:48 | 显示全部楼层
感谢楼主
回复

使用道具 举报

ID:449527 发表于 2018-12-19 08:54 | 显示全部楼层
感谢感谢
回复

使用道具 举报

ID:528461 发表于 2019-5-6 14:48 | 显示全部楼层
为什么数码管不显示数字
回复

使用道具 举报

ID:542332 发表于 2019-5-19 20:23 | 显示全部楼层
感谢楼主
回复

使用道具 举报

ID:542727 发表于 2019-5-20 12:54 来自手机 | 显示全部楼层
感谢楼主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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