找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机交通灯程序 4个数码管

[复制链接]
ID:1148919 发表于 2025-4-24 23:22 | 显示全部楼层 |阅读模式
  1. #define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
  2. #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535

  3. //数码管段选定义  0   1   2    3    4    5            6         7          8           9   A        B               
  4. uchar smg_du[]={0x40,0x75,0x0c,0x14,0x31,0x12,0x02,0x74,0x00,0x10,0x20,0x03,};         //断码

  5. uchar dis_smg[4] = {0};           //数码管显示数组的缓冲区

  6. //数码管位选定义
  7. sbit smg_we1 = P2^0;            //数码管位选IO口定义
  8. sbit smg_we2 = P2^1;                //数码管位选IO口定义
  9. sbit smg_we3 = P3^6;                //数码管位选IO口定义
  10. sbit smg_we4 = P3^7;                //数码管位选IO口定义

  11. sbit key1 = P1^0;            //按键IO口定义
  12. sbit key2 = P1^1;                //按键IO口定义
  13. sbit key3 = P1^2;                //按键IO口定义
  14. sbit key4 = P1^3;                //按键IO口定义
  15.   
  16. uchar menu_1;                            //设置不同参数的变量

  17. char dx_s = 0,nb_s = 0;        //东西  南北 倒计时变量

  18. sbit dx_red    = P2^7;            //东西红灯IO口定义
  19. sbit dx_green  = P2^6;                //东西绿灯IO口定义
  20. sbit dx_yellow = P2^5;                //东西黄灯IO口定义

  21. sbit nb_red    = P2^4;                //南北红灯IO口定义
  22. sbit nb_green  = P2^3;                //南北绿灯IO口定义
  23. sbit nb_yellow = P2^2;                //南北黄灯IO口定义        

  24. bit flag_1s = 0;          //1秒的变量
  25. bit flag_500ms;                  //500毫秒的变量
  26. bit flag_dx_nb = 0;   //东西南北模式
  27. uchar dx_time = 30,nb_time = 20;   //东西、南北的时间设置的时间
  28. uchar flag_jdgz ;     //交通管制

  29. /***********************数码位选函数*****************************/
  30. void smg_we_switch(uchar i)
  31. {
  32.         switch(i)
  33.         {
  34.                 case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
  35.                 case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;
  36.                 case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
  37.                 case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
  38.         }        
  39. }
  40.   
  41. /********************************************************************
  42. * 名称 : delay_1ms()
  43. * 功能 : 延时1ms函数
  44. * 输入 : q
  45. * 输出 : 无
  46. ***********************************************************************/
  47. void delay_1ms(uint q)
  48. {
  49.         uint i,j;
  50.         for(i=0;i<q;i++)
  51.                 for(j=0;j<120;j++);
  52. }

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

  70. /*********************定时器0初始化******************/
  71. void time0_init()         
  72. {
  73.         EA  = 1;                   //开总中断
  74.         TMOD = 0X01;          //定时器0工作方式1
  75.         ET0 = 1;                  //开定时器0中断
  76.         TR0 = 1;                  //允许定时器0定时
  77.         TH0 = 0x3c;
  78.         TL0 = 0xb0;     //50ms
  79. }

  80. /*********************交通灯处理函数*********************************/
  81. void jiaotongdeng_dis()
  82. {
  83.         if(flag_1s == 1)           //1秒执行一次里面的程序  
  84.         {
  85.                 flag_1s = 0;
  86.                 if(flag_dx_nb == 0)           //南北绿灯时间
  87.                 {
  88.                         dx_s --;                   //东西倒计时时间减1
  89.                         nb_s --;                   //南北倒计时时间减1
  90.                         if(dx_s == 5)
  91.                                 nb_s = 5;
  92.                 }
  93.                 if(flag_dx_nb == 1)           //东西绿灯时间
  94.                 {
  95.                         dx_s --;                   //南北倒计时时间减1
  96.                         nb_s --;                   //东西倒计时时间减1
  97.                         if(nb_s == 5)
  98.                                 dx_s = 5;
  99.                 }
  100.                 if(dx_s <= 0)                  //倒计时时间为0切换东西 南北绿灯时间
  101.                 {
  102.                         flag_dx_nb = ~flag_dx_nb;
  103.                         if(flag_dx_nb == 1)         //东西时间
  104.                         {
  105.                                 dx_s = dx_time;         
  106.                                 nb_s = dx_time + 5;
  107.                         }
  108.                         else                                  //南北时间
  109.                         {
  110.                                 dx_s = nb_time + 5;        
  111.                                 nb_s = nb_time;         
  112.                         }
  113.                 }
  114.         }
  115.         dis_smg[0] = smg_du[dx_s % 10] ;        //显示东西倒计时 时间
  116.         dis_smg[1] = smg_du[dx_s / 10] ;
  117.         dis_smg[2] = smg_du[nb_s % 10] ;        //显示南北倒计时 时间  
  118.         dis_smg[3] = smg_du[nb_s / 10] ;

  119. /***********************南北时间绿灯时间*********************************/
  120.         if(flag_dx_nb == 0)  
  121.         {
  122.                 if(dx_s > 5)
  123.                 {
  124.                         dx_red    = 0;     //东西红灯亮
  125.                         dx_green  =        1;           //东西绿灯灭
  126.                         dx_yellow = 1;           //东西黄灯灭
  127.                         nb_red    = 1;     //南北红灯灭
  128.                         nb_green  =        0;           //南北绿灯亮
  129.                         nb_yellow = 1;           //南北黄灯灭

  130.                 }else if(dx_s <= 5)                 //当小于5秒时  黄灯要闪了
  131.                 {
  132.                         dx_red    = 0;     //东西红灯灭
  133.                         dx_green  =        1;           //东西绿灯灭
  134.                         dx_yellow = 1;           //东西黄灯灭
  135.                         nb_red    = 1;     //南北红灯灭
  136.                         nb_green  =        1;           //南北绿灯灭
  137.                         if(flag_500ms == 0)           //黄灯闪烁
  138.                         {
  139.                                 nb_yellow = 0;        //亮        
  140.                         }
  141.                         else
  142.                         {
  143.                                 nb_yellow = 1;        //灭        
  144.                         }
  145.                 }
  146.         }
  147. /***********************东西时间绿灯时间*********************************/
  148.         if(flag_dx_nb == 1)  
  149.         {
  150.                 if(nb_s > 5)
  151.                 {
  152.                         dx_red    = 1;  //东西红灯灭
  153.                         dx_green  =        0;        //东西绿灯亮
  154.                         dx_yellow = 1;        //东西黄灯灭
  155.                         nb_red    = 0;  //南北红灯亮
  156.                         nb_green  =        1;        //南北绿灯灭
  157.                         nb_yellow = 1;        //南北黄灯灭
  158.                 }else if(nb_s <= 5)                 //当小于5秒时  黄灯要闪了
  159.                 {
  160.                         dx_red    = 1;    //东西红灯灭
  161.                         dx_green  =        1;          //东西绿灯灭
  162.                         nb_red    = 0;    //南北红灯亮
  163.                         nb_green  =        1;          //南北绿灯灭
  164.                         nb_yellow = 1;          //南北黄灯灭
  165.                         if(flag_500ms == 0)         //黄灯闪烁
  166.                         {
  167.                                 dx_yellow = 0;//东西黄灯亮        
  168.                         }
  169.                         else
  170.                         {
  171.                                 dx_yellow = 1;//东西黄灯灭        
  172.                         }

  173.                 }
  174.         }                        
  175. }

  176. /********************独立按键程序*****************/
  177. uchar key_can;         //按键值

  178. void key()         //独立按键程序
  179. {
  180.         static uchar key_new;        //key_new  这个变量的功能是做按键松手检测的
  181.         key_can = 0;                //按键值还原成0
  182.          if(key1 == 0 || key2 == 0 || key3 == 0 || key4 == 0)                //有按键按下
  183.         {
  184.                 delay_1ms(1);                     //按键延时消抖动
  185.                 if(key_new == 1)
  186.                 {                                         
  187.                         key_new = 0;                //key_new = 0   说明按键已按下
  188.                         if(key1 == 0)                //确认是按键按下
  189.                                 key_can = 1;         //得到按键值
  190.                         if(key2 == 0)                //确认是按键按下
  191.                                 key_can = 2;         //得到按键值
  192.                         if(key3 == 0)                //确认是按键按下
  193.                                 key_can = 3;         //得到按键值
  194.                         if(key4 == 0)                //确认是按键按下
  195.                                 key_can = 4;         //得到按键值
  196.                 }                        
  197.         }
  198.         else
  199.                 key_new = 1;         //key_new = 1   说明按键已经松开了        
  200. }

  201. /********************设置函数*****************/
  202. void key_with()
  203. {
  204.         if(key_can == 4)   //交通管制按键 紧急模式
  205.         {
  206.                 flag_jdgz ++;
  207.                 if(flag_jdgz > 4)
  208.                         flag_jdgz = 0;        
  209.                 if(flag_jdgz == 1)         //  全部亮红灯
  210.                 {
  211.                         dx_red    = 0;  //东西红灯亮
  212.                         dx_green  =        1;        //东西绿灯灭
  213.                         dx_yellow = 1;        //东西黄灯灭
  214.                         nb_red    = 0;  //南北红灯亮
  215.                         nb_green  =        1;        //南北绿灯灭
  216.                         nb_yellow = 1;        //南北黄灯灭                        
  217.                 }
  218.                 if(flag_jdgz == 2)         //  东西红灯  南北绿灯
  219.                 {
  220.                         dx_red    = 0;  //东西红灯亮
  221.                         dx_green  =        1;        //东西绿灯灭
  222.                         dx_yellow = 1;        //东西黄灯灭
  223.                         nb_red    = 1;  //南北红灯灭
  224.                         nb_green  =        0;        //南北绿灯亮
  225.                         nb_yellow = 1;        //南北黄灯灭                        
  226.                 }
  227.                 if(flag_jdgz == 3)         //  南北红灯  东西绿灯
  228.                 {
  229.                         dx_red    = 1;  //东西红灯灭
  230.                         dx_green  =        0;        //东西绿灯亮
  231.                         dx_yellow = 1;        //东西黄灯灭
  232.                         nb_red    = 0;  //南北红灯亮
  233.                         nb_green  =        1;        //南北绿灯灭
  234.                         nb_yellow = 1;        //南北黄灯灭                        
  235.                 }
  236.                  if(flag_jdgz == 4)         //  南北黄灯闪  东西黄灯闪
  237.                 {
  238.                         dx_red    = 1;  //东西红灯灭
  239.                         dx_green  =        1;        //东西绿灯灭
  240.                          nb_red    = 1;  //南北红灯灭
  241.                         nb_green  =        1;        //南北绿灯灭
  242.                  }
  243.         }
  244.         if(key_can == 1)          //设置键
  245.         {
  246.                 menu_1 ++;
  247.                 if(menu_1 >= 3)
  248.                 {
  249.                         menu_1  = 0;  //menu_1 = 0 退出设置,是在正常显示界面下
  250.                 }
  251.         }

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


  291. /********************************************************************
  292. * 名称 : main()
  293. * 功能 : 实现灯的闪烁
  294. * 输入 : 无
  295. * 输出 : 无
  296. ***********************************************************************/
  297. void main()
  298. {
  299.          time0_init();                  //定时器初始化程序
  300.          dx_s = nb_time + 5;          //南北时间
  301.         nb_s = nb_time ;          //东西时间
  302.         while(1)
  303.         {
  304.                 key();                           //按键函数
  305.                 if(key_can > 0)           //有按键按下
  306.                         key_with();           //按键处理设置函数
  307.                 if((menu_1 == 0) && (flag_jdgz == 0))
  308.                         jiaotongdeng_dis();           //交通灯处理函数

  309.                 if(flag_jdgz == 4)        //夜间模式
  310.                         if(flag_500ms == 1)                //  南北黄灯闪  东西黄灯闪
  311.                         {
  312.                                 flag_500ms = 0;
  313.                                 nb_yellow = ~nb_yellow;           //  南北黄灯闪
  314.                                 dx_yellow = ~dx_yellow;           //  东西黄灯闪
  315.                         }        
  316.                 display();         //数码管显示函数
  317.         }
  318. }  

  319. /*********************定时器0中断服务程序************************/
  320. void time0_int() interrupt 1  
  321. {                                                   
  322.         static  uchar value;                         //定时50ms中断一次
  323.         TH0 = 0x3c;
  324.         TL0 = 0xb0;     //50ms
  325.         value ++;
  326.          if(value % 10 == 0)
  327.                 flag_500ms = ~flag_500ms;           //定时产生一个500毫秒的变量
  328.         if(value >= 20)
  329.         {
  330.                 value = 0;
  331.                 flag_1s = 1;         //定时产生一个1秒的变量
  332.         }
  333. }
复制代码

# 交通灯 4个数码管 大 1.zip

528.64 KB, 下载次数: 0, 下载积分: 黑币 -5

程序,原理图

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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