找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 241|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)交通燈程序 4個(gè)數(shù)碼管

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1148919 發(fā)表于 2025-4-24 23:22 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #define uchar unsigned char  //無(wú)符號(hào)字符型 宏定義        變量范圍0~255
  2. #define uint  unsigned int         //無(wú)符號(hào)整型 宏定義        變量范圍0~65535

  3. //數(shù)碼管段選定義  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};           //數(shù)碼管顯示數(shù)組的緩沖區(qū)

  6. //數(shù)碼管位選定義
  7. sbit smg_we1 = P2^0;            //數(shù)碼管位選IO口定義
  8. sbit smg_we2 = P2^1;                //數(shù)碼管位選IO口定義
  9. sbit smg_we3 = P3^6;                //數(shù)碼管位選IO口定義
  10. sbit smg_we4 = P3^7;                //數(shù)碼管位選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;                            //設(shè)置不同參數(shù)的變量

  17. char dx_s = 0,nb_s = 0;        //東西  南北 倒計(jì)時(shí)變量

  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;   //東西、南北的時(shí)間設(shè)置的時(shí)間
  28. uchar flag_jdgz ;     //交通管制

  29. /***********************數(shù)碼位選函數(shù)*****************************/
  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. * 功能 : 延時(shí)1ms函數(shù)
  44. * 輸入 : q
  45. * 輸出 : 無(wú)
  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. * 功能 : 數(shù)碼管顯示
  57. * 輸入 : 無(wú)
  58. * 輸出 : 無(wú)
  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);                  //延時(shí)
  68.         }
  69. }

  70. /*********************定時(shí)器0初始化******************/
  71. void time0_init()         
  72. {
  73.         EA  = 1;                   //開總中斷
  74.         TMOD = 0X01;          //定時(shí)器0工作方式1
  75.         ET0 = 1;                  //開定時(shí)器0中斷
  76.         TR0 = 1;                  //允許定時(shí)器0定時(shí)
  77.         TH0 = 0x3c;
  78.         TL0 = 0xb0;     //50ms
  79. }

  80. /*********************交通燈處理函數(shù)*********************************/
  81. void jiaotongdeng_dis()
  82. {
  83.         if(flag_1s == 1)           //1秒執(zhí)行一次里面的程序  
  84.         {
  85.                 flag_1s = 0;
  86.                 if(flag_dx_nb == 0)           //南北綠燈時(shí)間
  87.                 {
  88.                         dx_s --;                   //東西倒計(jì)時(shí)時(shí)間減1
  89.                         nb_s --;                   //南北倒計(jì)時(shí)時(shí)間減1
  90.                         if(dx_s == 5)
  91.                                 nb_s = 5;
  92.                 }
  93.                 if(flag_dx_nb == 1)           //東西綠燈時(shí)間
  94.                 {
  95.                         dx_s --;                   //南北倒計(jì)時(shí)時(shí)間減1
  96.                         nb_s --;                   //東西倒計(jì)時(shí)時(shí)間減1
  97.                         if(nb_s == 5)
  98.                                 dx_s = 5;
  99.                 }
  100.                 if(dx_s <= 0)                  //倒計(jì)時(shí)時(shí)間為0切換東西 南北綠燈時(shí)間
  101.                 {
  102.                         flag_dx_nb = ~flag_dx_nb;
  103.                         if(flag_dx_nb == 1)         //東西時(shí)間
  104.                         {
  105.                                 dx_s = dx_time;         
  106.                                 nb_s = dx_time + 5;
  107.                         }
  108.                         else                                  //南北時(shí)間
  109.                         {
  110.                                 dx_s = nb_time + 5;        
  111.                                 nb_s = nb_time;         
  112.                         }
  113.                 }
  114.         }
  115.         dis_smg[0] = smg_du[dx_s % 10] ;        //顯示東西倒計(jì)時(shí) 時(shí)間
  116.         dis_smg[1] = smg_du[dx_s / 10] ;
  117.         dis_smg[2] = smg_du[nb_s % 10] ;        //顯示南北倒計(jì)時(shí) 時(shí)間  
  118.         dis_smg[3] = smg_du[nb_s / 10] ;

  119. /***********************南北時(shí)間綠燈時(shí)間*********************************/
  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)                 //當(dāng)小于5秒時(shí)  黃燈要閃了
  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. /***********************東西時(shí)間綠燈時(shí)間*********************************/
  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)                 //當(dāng)小于5秒時(shí)  黃燈要閃了
  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. /********************獨(dú)立按鍵程序*****************/
  177. uchar key_can;         //按鍵值

  178. void key()         //獨(dú)立按鍵程序
  179. {
  180.         static uchar key_new;        //key_new  這個(gè)變量的功能是做按鍵松手檢測(cè)的
  181.         key_can = 0;                //按鍵值還原成0
  182.          if(key1 == 0 || key2 == 0 || key3 == 0 || key4 == 0)                //有按鍵按下
  183.         {
  184.                 delay_1ms(1);                     //按鍵延時(shí)消抖動(dòng)
  185.                 if(key_new == 1)
  186.                 {                                         
  187.                         key_new = 0;                //key_new = 0   說(shuō)明按鍵已按下
  188.                         if(key1 == 0)                //確認(rèn)是按鍵按下
  189.                                 key_can = 1;         //得到按鍵值
  190.                         if(key2 == 0)                //確認(rèn)是按鍵按下
  191.                                 key_can = 2;         //得到按鍵值
  192.                         if(key3 == 0)                //確認(rèn)是按鍵按下
  193.                                 key_can = 3;         //得到按鍵值
  194.                         if(key4 == 0)                //確認(rèn)是按鍵按下
  195.                                 key_can = 4;         //得到按鍵值
  196.                 }                        
  197.         }
  198.         else
  199.                 key_new = 1;         //key_new = 1   說(shuō)明按鍵已經(jīng)松開了        
  200. }

  201. /********************設(shè)置函數(shù)*****************/
  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)          //設(shè)置鍵
  245.         {
  246.                 menu_1 ++;
  247.                 if(menu_1 >= 3)
  248.                 {
  249.                         menu_1  = 0;  //menu_1 = 0 退出設(shè)置,是在正常顯示界面下
  250.                 }
  251.         }

  252.         if(menu_1 == 1)           //設(shè)置東西綠燈的時(shí)間
  253.         {
  254.                 if(key_can == 2)  //加鍵
  255.                 {
  256.                         dx_time ++ ;                //設(shè)置東西綠燈的時(shí)間 加1
  257.                         if(dx_time > 99)
  258.                                 dx_time = 99;
  259.                 }
  260.                 if(key_can == 3)  //減鍵
  261.                 {
  262.                         dx_time -- ;                //設(shè)置東西綠燈的時(shí)間 減1
  263.                         if(dx_time <= 5)
  264.                                 dx_time = 5;
  265.                 }
  266.                 dis_smg[0] = smg_du[dx_time % 10] ;                //顯示設(shè)置的東西綠燈的時(shí)間 個(gè)位數(shù)
  267.                 dis_smg[1] = smg_du[dx_time / 10] ;            //顯示設(shè)置的東西綠燈的時(shí)間 十位數(shù)
  268.                 dis_smg[2] = smg_du[10] ;        //顯示為A
  269.                 dis_smg[3] = smg_du[10] ;        //顯示為A
  270.          }        
  271.         if(menu_1 == 2)           //設(shè)置南北綠燈的時(shí)間
  272.         {
  273.                 if(key_can == 2)   //加鍵
  274.                 {
  275.                         nb_time ++ ;                //設(shè)置南北綠燈的時(shí)間 加1
  276.                         if(nb_time > 99)
  277.                                 nb_time = 99;
  278.                 }
  279.                 if(key_can == 3)   //減鍵
  280.                 {
  281.                         nb_time -- ;                //設(shè)置南北綠燈的時(shí)間 減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] ;                //顯示設(shè)置的南北綠燈的時(shí)間 個(gè)位數(shù)
  288.                 dis_smg[3] = smg_du[nb_time / 10] ;                //顯示設(shè)置的南北綠燈的時(shí)間 十位數(shù)
  289.          }
  290. }


  291. /********************************************************************
  292. * 名稱 : main()
  293. * 功能 : 實(shí)現(xiàn)燈的閃爍
  294. * 輸入 : 無(wú)
  295. * 輸出 : 無(wú)
  296. ***********************************************************************/
  297. void main()
  298. {
  299.          time0_init();                  //定時(shí)器初始化程序
  300.          dx_s = nb_time + 5;          //南北時(shí)間
  301.         nb_s = nb_time ;          //東西時(shí)間
  302.         while(1)
  303.         {
  304.                 key();                           //按鍵函數(shù)
  305.                 if(key_can > 0)           //有按鍵按下
  306.                         key_with();           //按鍵處理設(shè)置函數(shù)
  307.                 if((menu_1 == 0) && (flag_jdgz == 0))
  308.                         jiaotongdeng_dis();           //交通燈處理函數(shù)

  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();         //數(shù)碼管顯示函數(shù)
  317.         }
  318. }  

  319. /*********************定時(shí)器0中斷服務(wù)程序************************/
  320. void time0_int() interrupt 1  
  321. {                                                   
  322.         static  uchar value;                         //定時(shí)50ms中斷一次
  323.         TH0 = 0x3c;
  324.         TL0 = 0xb0;     //50ms
  325.         value ++;
  326.          if(value % 10 == 0)
  327.                 flag_500ms = ~flag_500ms;           //定時(shí)產(chǎn)生一個(gè)500毫秒的變量
  328.         if(value >= 20)
  329.         {
  330.                 value = 0;
  331.                 flag_1s = 1;         //定時(shí)產(chǎn)生一個(gè)1秒的變量
  332.         }
  333. }
復(fù)制代碼

# 交通燈 4個(gè)數(shù)碼管 大 1.zip

528.64 KB, 下載次數(shù): 0, 下載積分: 黑幣 -5

程序,原理圖

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表