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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

4個數碼管的交通燈仿真和源程序

  [復制鏈接]
跳轉到指定樓層
樓主
這是交通燈的原理圖
4位交通燈的程序如下:

  1. #include <reg52.h>                 //調用單片機頭文件
  2. #define uchar unsigned char   //宏定義"uchar"代替"unsigned char"。
  3. #define uint  unsigned int          //宏定義"uint"用來定義無符號整型數。

  4. #include "eeprom52.h"


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

  9. uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};        
  10. uchar smg_i = 4;    //顯示數碼管的個位數

  11. //數碼管位選定義
  12. sbit smg_we1 = P2^0;            //數碼管位選定義
  13. sbit smg_we2 = P2^1;
  14. sbit smg_we3 = P3^6;
  15. sbit smg_we4 = P3^7;


  16. char dx_s = 0;        //東西  南北 倒計時變量
  17. sbit dx_red    = P2^4;            //東西紅燈
  18. sbit dx_green  = P2^3;                //東西綠燈
  19. sbit dx_yellow = P2^2;                //東西黃燈

  20. sbit nb_red    = P2^7;                //南北紅燈
  21. sbit nb_green  = P2^6;                //南北綠燈
  22. sbit nb_yellow = P2^5;                //南北黃燈        

  23. uchar flag_jtd_mode;  //交通燈的模式 根據時間
  24. bit flag_1s = 0;
  25. bit flag_500ms;
  26. bit flag_dx_nb;                 //東西南北模式
  27. uchar flag_5m_value;
  28. uchar i;
  29. uchar flag_alarm;        //模式
  30. uchar dx_time = 30,nb_time = 20;   //東西、南北的時間
  31. uchar flag_jdgz ;     //交通管制


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

  43. /******************把數據保存到單片機內部eeprom中******************/
  44. void write_eeprom()
  45. {
  46.         SectorErase(0x2000);
  47.         byte_write(0x2000, dx_time);
  48.         byte_write(0x2001, nb_time);

  49.         byte_write(0x2058, a_a);        
  50. }

  51. /******************把數據從單片機內部eeprom中讀出來*****************/
  52. void read_eeprom()
  53. {
  54.         dx_time = byte_read(0x2000);
  55.         nb_time = byte_read(0x2001);

  56.         a_a      = byte_read(0x2058);
  57. }

  58. /**************開機自檢eeprom初始化*****************/
  59. void init_eeprom()         ///開機自檢eeprom初始化
  60. {
  61.         read_eeprom();                //先讀
  62.         if(a_a != 1)                //新的單片機初始單片機內問eeprom
  63.         {
  64.                 a_a = 1;
  65.                 dx_time = 30;
  66.                 nb_time = 20;   //東西、南北的時間
  67.                 write_eeprom();           //保存數據
  68.         }        
  69. }


  70. /********************************************************************
  71. * 名稱 : delay_1ms()
  72. * 功能 : 延時1ms函數
  73. * 輸入 : q
  74. * 輸出 : 無
  75. ***********************************************************************/
  76. void delay_1ms(uint q)
  77. {
  78.         uint i,j;
  79.         for(i=0;i<q;i++)
  80.                 for(j=0;j<110;j++);
  81. }


  82. /********************************************************************
  83. * 名稱 : display()
  84. * 功能 : 數碼管顯示
  85. * 輸入 : 無
  86. * 輸出 : 無
  87. ***********************************************************************/
  88. void display()
  89. {
  90.         uchar i;
  91.         for(i=0;i<smg_i;i++)
  92.         {               
  93.                 P0 = 0xff;                  //消隱
  94.                 smg_we_switch(i);            //位選
  95.                 P0 = dis_smg[i];          //段選         
  96.                 delay_1ms(3);
  97.         }
  98. }

  99. /*********************定時器0、定時器1初始化******************/
  100. void time0_init()         
  101. {
  102.         EA  = 1;                   //開總中斷
  103.         TMOD = 0X11;          //定時器0、定時器1工作方式1
  104.         ET0 = 1;                  //開定時器0中斷
  105.         TR0 = 1;                  //允許定時器0定時
  106. //        ET1 = 1;                  //開定時器1中斷
  107. //        TR1 = 1;                  //允許定時器1定時        
  108. }

  109. /*********************交通燈處理函數*********************************/
  110. void jiaotongdeng_dis()
  111. {
  112.         if(flag_1s == 1)
  113.         {
  114.                 flag_1s = 0;
  115.                 if(dx_s == 0)
  116.                 {
  117.                         if(flag_dx_nb == 1)
  118.                                 dx_s = nb_time;          //南北時間
  119.                         else
  120.                                 dx_s = dx_time;          //東西時間
  121.                         flag_dx_nb = ~flag_dx_nb;
  122.                 }
  123.                 dx_s --;
  124.         }
  125.         dis_smg[0] = smg_du[dx_s % 10] ;
  126.         dis_smg[1] = smg_du[dx_s / 10] ;
  127.         dis_smg[2] = smg_du[dx_s % 10] ;
  128.         dis_smg[3] = smg_du[dx_s / 10] ;

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

  188. /********************獨立按鍵程序*****************/
  189. uchar key_can;         //按鍵值

  190. void key()         //獨立按鍵程序
  191. {
  192.         static uchar key_new;
  193.         key_can = 20;                   //按鍵值還原
  194.         P1 |= 0x1f;
  195.         if((P1 & 0x1f) != 0x1f)                //按鍵按下
  196.         {
  197.                 delay_1ms(1);                     //按鍵消抖動
  198.                 if(((P1 & 0x1f) != 0x1f) && (key_new == 1))
  199.                 {                                                //確認是按鍵按下
  200.                         key_new = 0;
  201.                         switch(P1 & 0x1f)
  202.                         {
  203.                                 case 0x1e:  key_can = 1;  break;         //得到按鍵值
  204.                                 case 0x1d:  key_can = 2;  break;         //得到按鍵值
  205.                                 case 0x1b:  key_can = 3;  break;         //得到按鍵值
  206.                                 case 0x17:  key_can = 4;  break;         //得到按鍵值
  207.                         }
  208.                 }                        
  209.         }
  210.         else
  211.                 key_new = 1;        
  212. }

  213. uchar menu_1,flag_s;


  214. /********************設置函數*****************/
  215. void key_with()
  216. {
  217.         if(key_can == 4)   //交通管制按鍵
  218.         {
  219.                 flag_jdgz ++;
  220.                 if(flag_jdgz > 5)
  221.                         flag_jdgz = 0;        
  222.                 if(flag_jdgz == 1)         //  全部亮紅燈
  223.                 {
  224.                         dx_red    = 0;  //亮
  225.                         dx_green  =        1;        //滅
  226.                         dx_yellow = 1;        //滅
  227.                         nb_red    = 0;  //亮
  228.                         nb_green  =        1;        //滅
  229.                         nb_yellow = 1;        //滅                        
  230.                 }
  231.                 if(flag_jdgz == 2)         //  東西紅燈  南北綠燈
  232.                 {
  233.                         dx_red    = 0;  //亮
  234.                         dx_green  =        1;        //滅
  235.                         dx_yellow = 1;        //滅
  236.                         nb_red    = 1;  //滅
  237.                         nb_green  =        0;        //亮
  238.                         nb_yellow = 1;        //滅                        
  239.                 }
  240.                 if(flag_jdgz == 3)         //  南北紅燈  東西綠燈
  241.                 {
  242.                         dx_red    = 1;  //滅
  243.                         dx_green  =        0;        //亮
  244.                         dx_yellow = 1;        //滅
  245.                         nb_red    = 0;  //亮
  246.                         nb_green  =        1;        //滅
  247.                         nb_yellow = 1;        //滅                        
  248.                 }
  249.                 if(flag_jdgz == 4)         //  南北綠燈  東西綠燈
  250.                 {
  251.                         dx_red    = 1;  //滅
  252.                         dx_green  =        0;        //亮
  253.                         dx_yellow = 1;        //滅
  254.                         nb_red    = 1;  //滅
  255.                         nb_green  =        0;        //亮
  256.                         nb_yellow = 1;        //滅                        
  257.                 }
  258.                 if(flag_jdgz == 5)         //  南北黃燈  東西黃燈
  259.                 {
  260.                         dx_red    = 1;  //滅
  261.                         dx_green  =        1;        //滅
  262.                         dx_yellow = 0;        //亮
  263.                         nb_red    = 1;  //滅
  264.                         nb_green  =        1;        //滅
  265.                         nb_yellow = 0;        //亮                        
  266.                 }
  267.         }
  268.         if(key_can == 1)          //設置鍵
  269.         {
  270.                 menu_1 ++;
  271.                 if(menu_1 >= 3)
  272.                 {
  273.                         menu_1  = 0;
  274.                 }
  275.         }

  276.         if(menu_1 == 1)           //設置東西的時間
  277.         {
  278.                 if(key_can == 2)
  279.                 {
  280.                         dx_time ++ ;                //加1
  281.                         if(dx_time > 99)
  282.                                 dx_time = 99;
  283.                 }
  284.                 if(key_can == 3)
  285.                 {
  286.                         dx_time -- ;                //減1
  287.                         if(dx_time <= 10)
  288.                                 dx_time = 10;
  289.                 }
  290.                 dis_smg[0] = smg_du[10] ;        //顯示為A
  291.                 dis_smg[1] = smg_du[10] ;        //顯示為A
  292.                 dis_smg[2] = smg_du[dx_time % 10] ;                //顯示東西設置的時候
  293.                 dis_smg[3] = smg_du[dx_time / 10] ;        
  294.                 write_eeprom();         //保存數據        
  295.         }        
  296.         if(menu_1 == 2)           //設置南北的時間
  297.         {
  298.                 if(key_can == 2)
  299.                 {
  300.                         nb_time ++ ;                //加1
  301.                         if(nb_time > 99)
  302.                                 nb_time = 99;
  303.                 }
  304.                 if(key_can == 3)
  305.                 {
  306.                         nb_time -- ;                //減1
  307.                         if(nb_time <= 10)
  308.                                 nb_time = 10;
  309.                 }
  310.                 dis_smg[0] = smg_du[11] ;        //顯示為B
  311.                 dis_smg[1] = smg_du[11] ;        //顯示為B
  312.                 dis_smg[2] = smg_du[nb_time % 10] ;                //顯示東西設置的時候
  313.                 dis_smg[3] = smg_du[nb_time / 10] ;        
  314.                 write_eeprom();         //保存數據               
  315.         }
  316. }


  317. /********************************************************************
  318. * 名稱 : main()
  319. * 功能 : 實現燈的閃爍
  320. * 輸入 : 無
  321. * 輸出 : 無
  322. ***********************************************************************/
  323. void main()
  324. {
  325.         time0_init();
  326.         init_eeprom();         ///開機自檢eeprom初始化
  327.         dx_s = nb_time;          //東西時間
  328.         while(1)
  329.         {
  330.                 key();
  331.                 if(key_can < 20)
  332.                         key_with();
  333. //                menu_dis();
  334.                 if((menu_1 == 0) && (flag_jdgz == 0))
  335.                         jiaotongdeng_dis();
  336.                 display();        
  337.         }
  338. }  

  339. /*********************定時器0中斷服務程序************************/
  340. void time0_int() interrupt 1  
  341. {                                                   
  342.         static uchar value;                         //定時10ms中斷一次
  343.         TH0 = 0x3c;
  344.         TL0 = 0xb0;     //50ms
  345.         value ++;
  346.         flag_5m_value++;
  347.         if(flag_5m_value % 10 == 0)
  348.                 flag_500ms = ~flag_500ms;
  349.         if(value >= 20)
  350.         {
  351.                 value = 0;
  352.                 flag_1s = 1;
  353.         }
  354. }
復制代碼


交通燈.zip

24.56 KB, 下載次數: 122, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +5 收起 理由
洛水神仙小童鞋 + 5 很給力!

查看全部評分

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

使用道具 舉報

沙發
ID:115772 發表于 2016-9-9 22:16 | 只看該作者
如果加個蜂鳴器在黃燈的時候響這個程序要怎么寫?
回復

使用道具 舉報

板凳
ID:160704 發表于 2017-1-8 22:58 | 只看該作者
源程序怎么運行不起呢
回復

使用道具 舉報

地板
ID:160733 發表于 2017-1-8 23:12 | 只看該作者
寫的很好
回復

使用道具 舉報

5#
ID:160932 發表于 2017-1-9 13:41 | 只看該作者
學習了!
回復

使用道具 舉報

6#
ID:151957 發表于 2017-1-9 14:08 | 只看該作者
怎么跟我我淘寶上買的一毛一樣
回復

使用道具 舉報

7#
ID:200712 發表于 2017-5-14 19:45 | 只看該作者
很棒!
回復

使用道具 舉報

8#
ID:200712 發表于 2017-5-14 20:54 | 只看該作者
超級贊!!!感謝!
回復

使用道具 舉報

9#
ID:110866 發表于 2017-6-24 18:49 | 只看該作者
這個不錯,是功能比較全的設計
回復

使用道具 舉報

10#
ID:233675 發表于 2017-9-17 17:15 | 只看該作者
很給力
回復

使用道具 舉報

11#
ID:233781 發表于 2017-9-18 10:27 | 只看該作者
完美 謝謝樓主
回復

使用道具 舉報

12#
ID:359106 發表于 2018-6-26 10:34 | 只看該作者
很有收獲
回復

使用道具 舉報

13#
ID:359038 發表于 2018-6-26 11:27 | 只看該作者
感謝感謝
回復

使用道具 舉報

14#
ID:301069 發表于 2018-6-26 13:19 | 只看該作者
不錯!
回復

使用道具 舉報

15#
ID:361814 發表于 2018-7-2 13:56 | 只看該作者
設置鍵為什么只能設置南北
回復

使用道具 舉報

16#
ID:364227 發表于 2018-7-3 18:17 | 只看該作者
沒有黑幣
回復

使用道具 舉報

17#
ID:363798 發表于 2018-7-9 10:22 | 只看該作者
只能設置南北
回復

使用道具 舉報

18#
ID:89072 發表于 2018-7-9 20:22 | 只看該作者
下來看看學習下,謝謝樓主
回復

使用道具 舉報

19#
ID:429365 發表于 2018-11-20 00:24 | 只看該作者
為什么沒反應運行起來?
回復

使用道具 舉報

20#
ID:430143 發表于 2018-11-20 20:01 | 只看該作者
樓主牛批!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 综合色久 | 成人三级av | 久久久久国色av免费观看性色 | 性色网站| 国产aa| 日韩久久网 | 在线色网 | 免费不卡av| 91一区二区 | 亚洲精品一区二区在线观看 | 久久精品亚洲欧美日韩久久 | 夜夜爽99久久国产综合精品女不卡 | 国产日韩久久 | 久久久www成人免费无遮挡大片 | 国产一区二区在线播放 | 欧美成人精品在线观看 | 一级日韩 | 中文字幕亚洲精品 | 国产欧美性成人精品午夜 | 欧美亚洲免费 | 亚洲成av人片在线观看无码 | 亚洲视频免费在线看 | 日韩在线一区二区 | 亚洲小视频在线观看 | 欧美视频日韩 | 香蕉视频91 | 久草视频在线播放 | 手机在线观看av | 欧美日产国产成人免费图片 | 国产福利91精品一区二区三区 | 亚洲精品二区 | 成人免费一区二区 | 国产电影一区二区 | 三级在线免费 | 免费在线观看av的网站 | 国产一区二区视频免费在线观看 | 黑人性hd | 日韩精品1区2区3区 爱爱综合网 | 99re6在线视频精品免费 | 欧美视频区 | 亚洲黄色av|