久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3324|回復: 2
打印 上一主題 下一主題
收起左側

基于51單片機的交通燈制作資料 4個數碼管顯示

[復制鏈接]
跳轉到指定樓層
樓主
里面有仿真圖,源代碼。.hex文件等等。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


制作出來的實物圖如下:


單片機源程序如下:
  1. #include <reg52.h>                 //調用單片機頭文件
  2. #define uchar unsigned char  //無符號字符型 宏定義        變量范圍0~255
  3. #define uint  unsigned int         //無符號整型 宏定義        變量范圍0~65535

  4. //數碼管段選定義  0   1   2    3    4    5         6         7          8           9   A        B               
  5. uchar smg_du[]={0x40,0x75,0x0c,0x14,0x31,0x12,0x02,0x74,0x00,0x10,0x20,0x03,};         //斷碼

  6. uchar dis_smg[4] = {0};           //數碼管顯示數組的緩沖區

  7. //數碼管位選定義
  8. sbit smg_we1 = P2^0;            //數碼管位選IO口定義
  9. sbit smg_we2 = P2^1;                //數碼管位選IO口定義
  10. sbit smg_we3 = P3^6;                //數碼管位選IO口定義
  11. sbit smg_we4 = P3^7;                //數碼管位選IO口定義

  12. sbit key1 = P1^0;            //按鍵IO口定義
  13. sbit key2 = P1^1;                //按鍵IO口定義
  14. sbit key3 = P1^2;                //按鍵IO口定義
  15. sbit key4 = P1^3;                //按鍵IO口定義

  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. * 名稱 : delay_1ms()
  42. * 功能 : 延時1ms函數
  43. * 輸入 : q
  44. * 輸出 : 無
  45. ***********************************************************************/
  46. void delay_1ms(uint q)
  47. {
  48.         uint i,j;
  49.         for(i=0;i<q;i++)
  50.                 for(j=0;j<120;j++);
  51. }

  52. uchar i;
  53. /********************************************************************
  54. * 名稱 : display()
  55. * 功能 : 數碼管顯示
  56. * 輸入 : 無
  57. * 輸出 : 無
  58. ***********************************************************************/
  59. void display()
  60. {
  61.          for(i=0;i<4;i++)
  62.         {               
  63.                 P0 = 0xff;                  //消隱
  64.                 smg_we_switch(i);            //位選
  65.                 P0 = dis_smg;          //段選         
  66.                 delay_1ms(3);                  //延時
  67.         }
  68. }

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

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

  118. /***********************南北時間*********************************/
  119.         if(flag_dx_nb == 0)  
  120.         {
  121.                 if(dx_s > 5)
  122.                 {
  123.                         dx_red    = 0;     //東西紅燈亮
  124.                         dx_green  =        1;           //東西紅燈滅
  125.                         dx_yellow = 1;           //東西黃燈滅
  126.                         nb_red    = 1;     //南北紅燈滅
  127.                         nb_green  =        0;           //南北綠燈亮
  128.                         nb_yellow = 1;           //南北黃燈滅

  129.                 }else if(dx_s <= 5)                 //當小于5秒時  黃燈要閃了
  130.                 {
  131.                         dx_red    = 0;     //東西紅燈滅
  132.                         dx_green  =        1;           //東西紅燈滅
  133.                         dx_yellow = 1;           //東西黃燈滅
  134.                         nb_red    = 1;     //南北紅燈滅
  135.                         nb_green  =        1;           //南北綠燈滅
  136.                         if(flag_500ms == 0)           //黃燈閃爍
  137.                         {
  138.                                 nb_yellow = 0;        //亮        
  139.                         }
  140.                         else
  141.                         {
  142.                                 nb_yellow = 1;        //滅        
  143.                         }
  144.                 }
  145.         }
  146. /***********************東西時間*********************************/
  147.         if(flag_dx_nb == 1)  
  148.         {
  149.                 if(nb_s > 5)
  150.                 {
  151.                         dx_red    = 1;  //東西紅燈滅
  152.                         dx_green  =        0;        //東西紅燈亮
  153.                         dx_yellow = 1;        //東西黃燈滅
  154.                         nb_red    = 0;  //南北紅燈亮
  155.                         nb_green  =        1;        //南北綠燈滅
  156.                         nb_yellow = 1;        //南北黃燈滅
  157.                 }else if(nb_s <= 5)                 //當小于5秒時  黃燈要閃了
  158.                 {
  159.                         dx_red    = 1;    //東西紅燈滅
  160.                         dx_green  =        1;          //東西紅燈滅
  161.                         nb_red    = 0;    //南北紅燈亮
  162.                         nb_green  =        1;          //南北綠燈滅
  163.                         nb_yellow = 1;          //南北黃燈滅
  164.                         if(flag_500ms == 0)         //黃燈閃爍
  165.                         {
  166.                                 dx_yellow = 0;//東西黃燈亮        
  167.                         }
  168.                         else
  169.                         {
  170.                                 dx_yellow = 1;//東西黃燈滅        
  171.                         }

  172.                 }
  173.         }                        
  174. }

  175. /********************獨立按鍵程序*****************/
  176. uchar key_can;         //按鍵值

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



  200. /********************設置函數*****************/
  201. void key_with()
  202. {
  203.         if(key_can == 4)   //交通管制按鍵
  204.         {
  205.                 flag_jdgz ++;
  206.                 if(flag_jdgz > 4)
  207.                         flag_jdgz = 0;        
  208.                 if(flag_jdgz == 1)         //  全部亮紅燈
  209.                 {
  210.                         dx_red    = 0;  //東西紅燈亮
  211.                         dx_green  =        1;        //東西綠燈滅
  212.                         dx_yellow = 1;        //東西黃燈滅
  213.                         nb_red    = 0;  //南北紅燈亮
  214.                         nb_green  =        1;        //南北綠燈滅
  215.                         nb_yellow = 1;        //南北黃燈滅                        
  216.                 }
  217.                 if(flag_jdgz == 2)         //  東西紅燈  南北綠燈
  218.                 {
  219.                         dx_red    = 0;  //東西紅燈亮
  220.                         dx_green  =        1;        //東西綠燈滅
  221.                         dx_yellow = 1;        //東西黃燈滅
  222.                         nb_red    = 1;  //南北紅燈滅
  223.                         nb_green  =        0;        //南北綠燈亮
  224.                         nb_yellow = 1;        //南北黃燈滅                        
  225.                 }
  226.                 if(flag_jdgz == 3)         //  南北紅燈  東西綠燈
  227.                 {
  228.                         dx_red    = 1;  //東西紅燈滅
  229.                         dx_green  =        0;        //東西綠燈亮
  230.                         dx_yellow = 1;        //東西黃燈滅
  231.                         nb_red    = 0;  //南北紅燈亮
  232.                         nb_green  =        1;        //南北綠燈滅
  233.                         nb_yellow = 1;        //南北黃燈滅                        
  234.                 }
  235.                  if(flag_jdgz == 4)         //  南北黃燈閃  東西黃燈閃
  236.                 {
  237.                         dx_red    = 1;  //東西紅燈滅
  238.                         dx_green  =        1;        //東西綠燈滅
  239.                          nb_red    = 1;  //南北紅燈滅
  240.                         nb_green  =        1;        //南北綠燈滅
  241.                  }
  242.         }
  243.         if(key_can == 1)          //設置鍵
  244.         {
  245.                 menu_1 ++;
  246.                 if(menu_1 >= 3)
  247.                 {
  248.                         menu_1  = 0;  //menu_1 = 0 是在正常顯示界面下
  249.                 }
  250.         }

  251.         if(menu_1 == 1)           //設置東西綠燈的時間
  252.         {
  253.                 if(key_can == 2)
  254.                 {
  255.                         dx_time ++ ;                //設置東西綠燈的時間 加1
  256.                         if(dx_time > 99)
  257.                                 dx_time = 99;
  258.                 }
  259.                 if(key_can == 3)
  260.                 {
  261.                         dx_time -- ;                //設置東西綠燈的時間 減1
  262.                         if(dx_time <= 5)
  263.                                 dx_time = 5;
  264.                 }
  265.                 dis_smg[0] = smg_du[dx_time % 10] ;                //顯示設置的東西綠燈的時間 個位數
  266.                 dis_smg[1] = smg_du[dx_time / 10] ;            //顯示設置的東西綠燈的時間 十位數
  267.                 dis_smg[2] = smg_du[10] ;        //顯示為A
  268.                 dis_smg[3] = smg_du[10] ;        //顯示為A
  269.          }        
  270.         if(menu_1 == 2)           //設置南北綠燈的時間
  271.         {
  272.                 if(key_can == 2)
  273.                 {
  274.                         nb_time ++ ;                //設置南北綠燈的時間 加1
  275.                         if(nb_time > 99)
  276.                                 nb_time = 99;
  277.                 }
  278.                 if(key_can == 3)
  279.                 {
  280.                         nb_time -- ;                //設置南北綠燈的時間 減1
  281.                         if(nb_time <= 5)
  282.                                 nb_time = 5;
  283.                 }
  284.                 dis_smg[0] = smg_du[11] ;        //顯示為B
  285.                 dis_smg[1] = smg_du[11] ;        //顯示為B
  286.                 dis_smg[2] = smg_du[nb_time % 10] ;                //顯示設置的南北綠燈的時間 個位數
  287.                 dis_smg[3] = smg_du[nb_time / 10] ;                //顯示設置的南北綠燈的時間 十位數
  288.          }
  289. }


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

  308.                 if(flag_jdgz == 4)        //夜間模式
  309.                         if(flag_500ms == 1)                //  南北黃燈閃  東西黃燈閃
  310.                         {
  311.                                 flag_500ms = 0;
  312.                                 nb_yellow = ~nb_yellow;           //  東西黃燈閃
  313.                                 dx_yellow = ~dx_yellow;           //  東西黃燈閃
  314.                         }        
  315.                 display();         //數碼管顯示函數
  316.         }
  317. }  

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

Keil代碼與Proteus仿真下載: 交通燈 4個數碼管 大 1.7z (787.53 KB, 下載次數: 201)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:1112889 發表于 2024-3-15 14:39 來自手機 | 只看該作者
用Proteus8.13打開
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 嫩草最新网址 | 久久久123 | 日韩在线免费电影 | 国产精品永久免费视频 | 色婷婷久久久久swag精品 | 一区二区三区av | 国产精品成人一区二区 | 亚洲精品www| 日韩毛片在线视频 | 日中文字幕在线 | 在线观看中文字幕亚洲 | 成人av激情 | 成人一级视频在线观看 | 日本精品免费在线观看 | 精品久久视频 | 一级黄色录像毛片 | 欧美日韩1区 | 天天干天天操天天爽 | 精品国产乱码久久久久久88av | 日本人爽p大片免费看 | 亚洲精品www久久久 www.蜜桃av | 日日摸天天添天天添破 | 久久69精品久久久久久国产越南 | 久久久精品一区二区三区 | 欧美一区二区免费视频 | 伊人二区 | 日韩精品福利 | 欧美不卡一区二区三区 | 久久久久99| 精品国产1区2区3区 一区二区手机在线 | 91在线| 国产在线资源 | 一区二区三区视频在线观看 | 亚洲毛片在线观看 | 日本亚洲欧美 | 日本精品一区二区 | 国产乱码精品一区二区三区忘忧草 | 在线免费中文字幕 | 天天操天天干天天爽 | 秋霞国产 | 99久久日韩精品免费热麻豆美女 |