找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1218|回复: 0
收起左侧

基于单片机的交通灯设计

[复制链接]
ID:482207 发表于 2019-4-6 16:13 | 显示全部楼层 |阅读模式
电路原理图如下:
原理图1.PNG

制作出来的实物图如下:
51hei.png 51hei.png

单片机源程序如下:
  1. #include <reg52.h>                 //调用单片机头文件
  2. #define uchar unsigned char   //宏定义"uchar"代替"unsigned char"。
  3. #define uint  unsigned int          //宏定义"uint"用来定义无符号整型数。


  4. //数码管段选定义 0     1    2    3           4           5        6         7          8           9        
  5. uchar code smg_du[]={0xc0,0xf9,0xb0,0x92,0x99,0xa4,0x82,0xf8,0x80,0x90,
  6. //                                           A        B         C          D           E   F        不显示
  7.                                           0x83,0xa1,0xc6,0x88,0x86,0x8e,0xff};         //断码        

  8. uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};        
  9. uchar smg_i = 4;    //显示数码管的个位数

  10. //数码管位选定义
  11. sbit smg_we1 = P2^0;            //数码管位选定义
  12. sbit smg_we2 = P2^1;
  13. sbit smg_we3 = P3^6;
  14. sbit smg_we4 = P3^7;


  15. char dx_s = 0;        //东西  南北 倒计时变量
  16. sbit dx_red    = P2^4;            //东西红灯
  17. sbit dx_green  = P2^3;                //东西绿灯
  18. sbit dx_yellow = P2^2;                //东西黄灯

  19. sbit nb_red    = P2^7;                //南北红灯
  20. sbit nb_green  = P2^6;                //南北绿灯
  21. sbit nb_yellow = P2^5;                //南北黄灯        

  22. uchar flag_jtd_mode;  //交通灯的模式 根据时间
  23. bit flag_1s = 0;
  24. bit flag_500ms;
  25. bit flag_dx_nb;                 //东西南北模式
  26. uchar flag_5m_value;
  27. uchar i;
  28. uchar flag_alarm;        //模式
  29. uchar dx_time = 30,nb_time = 20;   //东西、南北的时间
  30. uchar flag_jdgz ;     //交通管制


  31. /***********************数码位选函数*****************************/
  32. void smg_we_switch(uchar i)
  33. {
  34.         switch(i)
  35.         {
  36.                 case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
  37.                 case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;
  38.                 case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
  39.                 case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
  40.         }        
  41. }


  42. /********************************************************************
  43. * 名称 : delay_1ms()
  44. * 功能 : 延时1ms函数
  45. * 输入 : q
  46. * 输出 : 无
  47. ***********************************************************************/
  48. void delay_1ms(uint q)
  49. {
  50.         uint i,j;
  51.         for(i=0;i<q;i++)
  52.                 for(j=0;j<110;j++);
  53. }


  54. /********************************************************************
  55. * 名称 : display()
  56. * 功能 : 数码管显示
  57. * 输入 : 无
  58. * 输出 : 无
  59. ***********************************************************************/
  60. void display()
  61. {
  62.         uchar i;
  63.         for(i=0;i<smg_i;i++)
  64.         {               
  65.                 P0 = 0xff;                  //消隐
  66.                 smg_we_switch(i);            //位选
  67.                 P0 = dis_smg[i];          //段选         
  68.                 delay_1ms(3);
  69.         }
  70. }

  71. /*********************定时器0、定时器1初始化******************/
  72. void time0_init()         
  73. {
  74.         EA  = 1;                   //开总中断
  75.         TMOD = 0X11;          //定时器0、定时器1工作方式1
  76.         ET0 = 1;                  //开定时器0中断
  77.         TR0 = 1;                  //允许定时器0定时
  78. //        ET1 = 1;                  //开定时器1中断
  79. //        TR1 = 1;                  //允许定时器1定时        
  80. }

  81. /*********************交通灯处理函数*********************************/
  82. void jiaotongdeng_dis()
  83. {
  84.         if(flag_1s == 1)
  85.         {
  86.                 flag_1s = 0;
  87.                 if(dx_s == 0)
  88.                 {
  89.                         if(flag_dx_nb == 1)
  90.                                 dx_s = nb_time;          //南北时间
  91.                         else
  92.                                 dx_s = dx_time;          //东西时间
  93.                         flag_dx_nb = ~flag_dx_nb;
  94.                 }
  95.                 dx_s --;
  96.         }
  97.         dis_smg[0] = smg_du[dx_s % 10] ;
  98.         dis_smg[1] = smg_du[dx_s / 10] ;
  99.         dis_smg[2] = smg_du[dx_s % 10] ;
  100.         dis_smg[3] = smg_du[dx_s / 10] ;

  101. /***********************南北时间*********************************/
  102.                 if(flag_dx_nb == 0)  
  103.                 {
  104.                         if(dx_s > 5)
  105.                         {
  106.                                 dx_red    = 1;  //灭
  107.                                 dx_green  =        0;        //亮
  108.                                 dx_yellow = 1;        //灭
  109.                                 nb_red    = 0;  //亮
  110.                                 nb_green  =        1;        //灭
  111.                                 nb_yellow = 1;        //灭
  112.                                 flag_5m_value = 0;        
  113.                         }else if(dx_s <= 5)                 //当小于5秒时  黄灯要闪了
  114.                         {
  115.                                 dx_red    = 1;    //灭
  116.                                 dx_green  =        1;          //灭
  117.                                 nb_red    = 0;    //亮
  118.                                 nb_green  =        1;          //灭
  119.                                 nb_yellow = 1;          //灭
  120.                                 if(flag_500ms == 0)
  121.                                 {
  122.                                         dx_yellow = 0;//亮        
  123.                                 }
  124.                                 else
  125.                                 {
  126.                                         dx_yellow = 1;//灭        
  127.                                 }
  128.                         }
  129.                 }
  130. /***********************东西时间*********************************/
  131.                 if(flag_dx_nb == 1)  
  132.                 {
  133.                         if(dx_s > 5)
  134.                         {
  135.                                 dx_red    = 0;     //亮
  136.                                 dx_green  =        1;           //灭
  137.                                 dx_yellow = 1;           //灭
  138.                                 nb_red    = 1;     //灭
  139.                                 nb_green  =        0;           //亮
  140.                                 nb_yellow = 1;           //灭
  141.                                 flag_5m_value = 0;        
  142.                         }else if(dx_s <= 5)                 //当小于5秒时  黄灯要闪了
  143.                         {
  144.                                 dx_red    = 0;     //灭
  145.                                 dx_green  =        1;           //灭
  146.                                 dx_yellow = 1;           //灭
  147.                                 nb_red    = 1;     //灭
  148.                                 nb_green  =        1;           //灭
  149.                                 if(flag_500ms == 0)           //黄灯闪烁
  150.                                 {
  151.                                         nb_yellow = 0;        //亮        
  152.                                 }
  153.                                 else
  154.                                 {
  155.                                         nb_yellow = 1;        //灭        
  156.                                 }
  157.                         }
  158.         }                        
  159. }

  160. /********************独立按键程序*****************/
  161. uchar key_can;         //按键值

  162. void key()         //独立按键程序
  163. {
  164.         static uchar key_new;
  165.         key_can = 20;                   //按键值还原
  166.         P1 |= 0x1f;
  167.         if((P1 & 0x1f) != 0x1f)                //按键按下
  168.         {
  169.                 delay_1ms(1);                     //按键消抖动
  170.                 if(((P1 & 0x1f) != 0x1f) && (key_new == 1))
  171.                 {                                                //确认是按键按下
  172.                         key_new = 0;
  173.                         switch(P1 & 0x1f)
  174.                         {
  175.                                 case 0x1e:  key_can = 1;  break;         //得到按键值
  176.                                 case 0x1d:  key_can = 2;  break;         //得到按键值
  177.                                 case 0x1b:  key_can = 3;  break;         //得到按键值
  178.                                 case 0x17:  key_can = 4;  break;         //得到按键值
  179.                         }
  180.                 }                        
  181.         }
  182.         else
  183.                 key_new = 1;        
  184. }

  185. uchar menu_1,flag_s;


  186. /********************设置函数*****************/
  187. void key_with()
  188. {
  189.         if(key_can == 4)   //交通管制按键
  190.         {
  191.                 flag_jdgz ++;
  192.                 if(flag_jdgz > 5)
  193.                         flag_jdgz = 0;        
  194.                 if(flag_jdgz == 1)         //  全部亮红灯
  195.                 {
  196.                         dx_red    = 0;  //亮
  197.                         dx_green  =        1;        //灭
  198.                         dx_yellow = 1;        //灭
  199.                         nb_red    = 0;  //亮
  200.                         nb_green  =        1;        //灭
  201.                         nb_yellow = 1;        //灭                        
  202.                 }
  203.                 if(flag_jdgz == 2)         //  东西红灯  南北绿灯
  204.                 {
  205.                         dx_red    = 0;  //亮
  206.                         dx_green  =        1;        //灭
  207.                         dx_yellow = 1;        //灭
  208.                         nb_red    = 1;  //灭
  209.                         nb_green  =        0;        //亮
  210.                         nb_yellow = 1;        //灭                        
  211.                 }
  212.                 if(flag_jdgz == 3)         //  南北红灯  东西绿灯
  213.                 {
  214.                         dx_red    = 1;  //灭
  215.                         dx_green  =        0;        //亮
  216.                         dx_yellow = 1;        //灭
  217.                         nb_red    = 0;  //亮
  218.                         nb_green  =        1;        //灭
  219.                         nb_yellow = 1;        //灭                        
  220.                 }
  221.                 if(flag_jdgz == 4)         //  南北绿灯  东西绿灯
  222.                 {
  223.                         dx_red    = 1;  //灭
  224.                         dx_green  =        0;        //亮
  225.                         dx_yellow = 1;        //灭
  226.                         nb_red    = 1;  //灭
  227.                         nb_green  =        0;        //亮
  228.                         nb_yellow = 1;        //灭                        
  229.                 }
  230.                 if(flag_jdgz == 5)         //  南北黄灯  东西黄灯
  231.                 {
  232.                         dx_red    = 1;  //灭
  233.                         dx_green  =        1;        //灭
  234.                         dx_yellow = 0;        //亮
  235.                         nb_red    = 1;  //灭
  236.                         nb_green  =        1;        //灭
  237.                         nb_yellow = 0;        //亮                        
  238.                 }
  239.         }
  240.         if(key_can == 1)          //设置键
  241.         {
  242.                 menu_1 ++;
  243.                 if(menu_1 >= 3)
  244.                 {
  245.                         menu_1  = 0;
  246.                 }
  247.         }

  248.         if(menu_1 == 1)           //设置东西的时间
  249.         {
  250.                 if(key_can == 2)
  251.                 {
  252.                         dx_time ++ ;                //加1
  253.                         if(dx_time > 99)
  254.                                 dx_time = 99;
  255.                 }
  256.                 if(key_can == 3)
  257.                 {
  258.                         dx_time -- ;                //减1
  259.                         if(dx_time <= 10)
  260.                                 dx_time = 10;
  261.                 }
  262.                 dis_smg[0] = smg_du[10] ;        //显示为A
  263.                 dis_smg[1] = smg_du[10] ;        //显示为A
  264.                 dis_smg[2] = smg_du[dx_time % 10] ;                //显示东西设置的时候
  265.                 dis_smg[3] = smg_du[dx_time / 10] ;        
  266.         }        
  267.         if(menu_1 == 2)           //设置南北的时间
  268.         {
  269.                 if(key_can == 2)
  270.                 {
  271.                         nb_time ++ ;                //加1
  272.                         if(nb_time > 99)
  273.                                 nb_time = 99;
  274.                 }
  275.                 if(key_can == 3)
  276.                 {
  277.                         nb_time -- ;                //减1
  278.                         if(nb_time <= 10)
  279.                                 nb_time = 10;
  280.                 }
  281.                 dis_smg[0] = smg_du[11] ;        //显示为B
  282.                 dis_smg[1] = smg_du[11] ;        //显示为B
  283.                 dis_smg[2] = smg_du[nb_time % 10] ;                //显示东西设置的时候
  284.                 dis_smg[3] = smg_du[nb_time / 10] ;        
  285.         }
  286. }


  287. ……………………

  288. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

交通灯设计.7z (207.89 KB, 下载次数: 10)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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