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

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

QQ登錄

只需一步,快速開始

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

基于51單片機(jī)交通燈的程序設(shè)計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1059216 發(fā)表于 2022-12-28 10:35 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本設(shè)計(jì)以單片機(jī)為控制核心,采用模塊化設(shè)計(jì),共分以下幾個(gè)功能模塊:?jiǎn)纹瑱C(jī)控制系統(tǒng)、鍵盤及狀態(tài)顯示、倒計(jì)時(shí)模塊等。
單片機(jī)作為整個(gè)硬件系統(tǒng)的核心,它既是協(xié)調(diào)整機(jī)工作的控制器,又是數(shù)據(jù)處理器。它由單片機(jī)振蕩電路、復(fù)位電路等組成。
系統(tǒng)采用雙數(shù)碼管倒計(jì)時(shí)計(jì)數(shù)功能,最大顯示數(shù)字99。
友好的人機(jī)界面、靈活的控制方式、優(yōu)化的物理結(jié)構(gòu)是本設(shè)計(jì)的亮點(diǎn)。
源程序代碼
  1. #include <reg52.h>                 //調(diào)用單片機(jī)頭文件
  2. #define uchar unsigned char   //宏定義"uchar"代替"unsigned char"。
  3. #define uint  unsigned int          //宏定義"uint"用來定義無符號(hào)整型數(shù)。

  4. ////數(shù)碼管段選定義  0   1    2    3    4    5         6         7          8           9        
  5. uchar smg_du[]={0x6f,0x03,0x3d,0x3b,0x53,0x7a,0x7e,0x23,0x7f,0x7b};         //斷碼

  6. uchar dis_smg[4] = {0};        

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


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

  13. sbit dx_red    = P2^7;            //東西紅燈
  14. sbit dx_yellow = P2^6;                //東西黃燈
  15. sbit dx_green  = P2^5;                //東西綠燈

  16. sbit nb_red    = P2^4;                //南北紅燈
  17. sbit nb_yellow = P2^3;                //南北黃燈        
  18. sbit nb_green  = P2^2;                //南北綠燈

  19. bit flag_1s = 0;
  20. bit flag_500ms;
  21. bit flag_dx_nb = 0;                 //東西南北模式
  22. uchar flag_5m_value;
  23. uchar dx_time = 30,nb_time = 20;   //東西、南北的時(shí)間
  24. uchar yellow_time = 5;
  25. uchar flag_jdgz ;     //交通管制

  26. /***********************數(shù)碼位選函數(shù)*****************************/
  27. void smg_we_switch(uchar i)
  28. {
  29.         switch(i)
  30.         {
  31.                 case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
  32.                 case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;
  33.                 case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
  34.                 case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
  35.         }        
  36. }

  37. /********************************************************************
  38. * 名稱 : delay_1ms()
  39. * 功能 : 延時(shí)1ms函數(shù)
  40. * 輸入 : q
  41. * 輸出 : 無
  42. ***********************************************************************/
  43. void delay_1ms(uint q)
  44. {
  45.         uint i,j;
  46.         for(i=0;i<q;i++)
  47.                 for(j=0;j<110;j++);
  48. }


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

  66. /*********************定時(shí)器0、定時(shí)器1初始化******************/
  67. void time0_init()         
  68. {
  69.         EA  = 1;                   //開總中斷
  70.         TMOD = 0X11;          //定時(shí)器0、定時(shí)器1工作方式1
  71.         ET0 = 1;                  //開定時(shí)器0中斷
  72.         TR0 = 1;                  //允許定時(shí)器0定時(shí)
  73. }

  74. /*********************交通燈處理函數(shù)*********************************/
  75. void jiaotongdeng_dis()
  76. {
  77.         if(flag_1s == 1)
  78.         {
  79.                 flag_1s = 0;
  80.                 if(flag_dx_nb == 0)           //南北時(shí)間
  81.                 {
  82.                         dx_s --;
  83.                         nb_s --;
  84.                         if(dx_s == yellow_time)
  85.                                 nb_s = yellow_time;
  86.                 }
  87.                 if(flag_dx_nb == 1)           //東西時(shí)間
  88.                 {
  89.                         dx_s --;
  90.                         nb_s --;
  91.                         if(nb_s == yellow_time)
  92.                                 dx_s = yellow_time;
  93.                 }
  94.                 if(dx_s <= 0)
  95.                 {
  96.                         flag_dx_nb = ~flag_dx_nb;
  97.                         if(flag_dx_nb == 1)
  98.                         {
  99.                                 dx_s = dx_time;          //東西時(shí)間
  100.                                 nb_s = dx_time + yellow_time;
  101.                         }
  102.                         else
  103.                         {
  104.                                 dx_s = nb_time + yellow_time;        
  105.                                 nb_s = nb_time;          //南北時(shí)間
  106.                         }
  107.                 }
  108.         }
  109.         dis_smg[0] = smg_du[dx_s % 10] ;
  110.         dis_smg[1] = smg_du[dx_s / 10] ;
  111.         dis_smg[2] = smg_du[nb_s % 10] ;
  112.         dis_smg[3] = smg_du[nb_s / 10] ;

  113. /***********************南北時(shí)間*********************************/
  114.                 if(flag_dx_nb == 0)  
  115.                 {
  116.                         if(dx_s > yellow_time)
  117.                         {
  118.                                 dx_red    = 0;     //亮
  119.                                 dx_green  =        1;           //滅
  120.                                 dx_yellow = 1;           //滅
  121.                                 nb_red    = 1;     //滅
  122.                                 nb_green  =        0;           //亮
  123.                                 nb_yellow = 1;           //滅

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

  169.                         }
  170.         }                        
  171. }

  172. /********************獨(dú)立按鍵程序*****************/
  173. uchar key_can;         //按鍵值

  174. void key()         //獨(dú)立按鍵程序
  175. {
  176.         static uchar key_new;
  177.         key_can = 0;                   //按鍵值還原
  178.         P1 |= 0x0f;
  179.         if((P1 & 0x0f) != 0x0f)                //按鍵按下
  180.         {
  181.                 delay_1ms(1);                     //按鍵消抖動(dòng)
  182.                 if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
  183.                 {                                                //確認(rèn)是按鍵按下
  184.                         key_new = 0;
  185.                         switch(P1 & 0x0f)
  186.                         {
  187.                                 case 0x0e:  key_can = 1;  break;         //得到按鍵值
  188.                                 case 0x0d:  key_can = 2;  break;         //得到按鍵值
  189.                                 case 0x0b:  key_can = 3;  break;         //得到按鍵值
  190.                                 case 0x07:  key_can = 4;  break;         //得到按鍵值
  191.                         }
  192.                 }                        
  193.         }
  194.         else
  195.                 key_new = 1;        
  196. }

  197. uchar menu_1,flag_s;


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

  246.         }
  247.         if(key_can == 1)          //設(shè)置鍵
  248.         {
  249.                 menu_1 ++;
  250.                 if(menu_1 > 3)
  251.                 {
  252.                         menu_1  = 0;
  253.                 }
  254.         }

  255.         if(menu_1 == 1)           //設(shè)置東西的時(shí)間
  256.         {
  257.                 if(key_can == 2)
  258.                 {
  259.                         dx_time ++ ;                //加1
  260.                         if(dx_time > 99)
  261.                                 dx_time = 99;
  262.                 }
  263.                 if(key_can == 3)
  264.                 {
  265.                         dx_time -- ;                //減1
  266.                         if(dx_time <= 5)
  267.                                 dx_time = 5;
  268.                 }
  269.                 dis_smg[0] = smg_du[dx_time % 10] ;                //顯示東西設(shè)置的時(shí)候
  270.                 dis_smg[1] = smg_du[dx_time / 10] ;        
  271.                 dis_smg[2] = 0x00 ;        //不顯示
  272.                 dis_smg[3] = 0x00 ;        //不顯示
  273.         }        
  274.         if(menu_1 == 2)           //設(shè)置南北的時(shí)間
  275.         {
  276.                 if(key_can == 2)
  277.                 {
  278.                         nb_time ++ ;                //加1
  279.                         if(nb_time > 99)
  280.                                 nb_time = 99;
  281.                 }
  282.                 if(key_can == 3)
  283.                 {
  284.                         nb_time -- ;                //減1
  285.                         if(nb_time <= 5)
  286.                                 nb_time = 5;
  287.                 }
  288.                 dis_smg[0] = 0x00 ;        //不顯示
  289.                 dis_smg[1] = 0x00 ;        //不顯示
  290.                 dis_smg[2] = smg_du[nb_time % 10] ;                //顯示東西設(shè)置的時(shí)候
  291.                 dis_smg[3] = smg_du[nb_time / 10] ;        
  292.         }
  293.         if(menu_1 == 3)           //設(shè)置黃燈的時(shí)間
  294.         {
  295.                 if(key_can == 2)
  296.                 {
  297.                         yellow_time ++ ;                //加1
  298.                         if(yellow_time > 99)
  299.                                 yellow_time = 99;
  300.                 }
  301.                 if(key_can == 3)
  302.                 {
  303.                         yellow_time -- ;                //減1
  304.                         if(yellow_time <= 1)
  305.                                 yellow_time = 1;
  306.                 }
  307.                 dis_smg[0] = smg_du[yellow_time % 10] ;                //顯示黃燈時(shí)間
  308.                 dis_smg[1] = smg_du[yellow_time / 10] ;        
  309.                 dis_smg[2] = smg_du[yellow_time % 10] ;                //顯示黃燈時(shí)間
  310.                 dis_smg[3] = smg_du[yellow_time / 10] ;        
  311.         }
  312. }


  313. /********************************************************************
  314. * 名稱 : main()
  315. * 功能 : 實(shí)現(xiàn)燈的閃爍
  316. * 輸入 : 無
  317. * 輸出 : 無
  318. ***********************************************************************/
  319. void main()
  320. {
  321.         P0 = P1 = P2 = P3 = 0XFF;    //IO口全部輸出為1
  322.         time0_init();
  323.         dx_s = nb_time + yellow_time;          //南北時(shí)間
  324.         nb_s = nb_time ;
  325.         while(1)
  326.         {
  327.                 key();
  328.                 if(key_can != 0)
  329.                         key_with();
  330.                 if((menu_1 == 0) && (flag_jdgz == 0))
  331.                         jiaotongdeng_dis();
  332.                 if(flag_jdgz == 2)        //夜間模式
  333.                         if(flag_500ms == 1)
  334.                         {
  335.                                 flag_500ms = 0;
  336.                                 nb_yellow = ~nb_yellow;
  337.                                 dx_yellow = ~dx_yellow;
  338.                         }        
  339.                 display();        
  340.         }
  341. }  

  342. /*********************定時(shí)器0中斷服務(wù)程序************************/
  343. void time0_int() interrupt 1  
  344. {                                                   
  345.         static uchar value;                         //定時(shí)10ms中斷一次
  346.         TH0 = 0x3c;
  347.         TL0 = 0xb0;     //50ms
  348.         value ++;
  349.         flag_5m_value++;
  350.         if(flag_5m_value % 10 == 0)
  351.                 flag_500ms = ~flag_500ms;
  352.         if(value >= 20)
  353.         {
  354.                 value = 0;
  355.                 flag_1s = 1;
  356.         }
  357. }
復(fù)制代碼
僅提供wrod文檔下載(不含其他資料,僅供參考)
Word文檔僅供參考(如有錯(cuò)誤請(qǐng)指出): 車行交通燈設(shè)計(jì).doc (294.5 KB, 下載次數(shù): 17)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  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ù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美视频一区二区三区 | 午夜在线免费观看 | 一级做a爰片性色毛片16美国 | 自拍偷拍亚洲一区 | 日韩在线一区二区三区 | 国产欧美日韩一区 | 国产精品国色综合久久 | 久久久久久国产精品免费免费 | 欧美黄色录像 | 麻豆久久 | 男人的天堂在线视频 | 欧美成视频在线观看 | 麻豆a级片 | 黄色一级毛片 | 亚洲成人高清 | 欧美一区二区三区在线播放 | 久久免费精品视频 | 日本在线视 | 国产99视频精品免费播放照片 | 国产精品亚洲综合 | www.国产日本| 日日干夜夜操 | 国产在线激情视频 | 在线第一页| 亚洲一区日韩 | 伊人狠狠 | 午夜丁香视频在线观看 | 91在线网站| 国产一区二区三区四区五区加勒比 | 精品国产乱码久久久久久牛牛 | 麻豆精品国产91久久久久久 | 亚洲国产高清高潮精品美女 | 91亚洲精华国产 | 狠狠综合久久av一区二区小说 | 国产操操操 | 成人免费片 | av网站免费在线观看 | 羞羞色视频 | 久久国产一区二区三区 | 久久亚洲国产精品 | 欧美日韩一区二区视频在线观看 |