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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5903|回復(fù): 8
收起左側(cè)

基于51單片機(jī)做的交通燈最終版

  [復(fù)制鏈接]
ID:342565 發(fā)表于 2018-7-9 19:11 | 顯示全部樓層 |閱讀模式
單片機(jī)交通燈  含代碼和仿真
0_DFDF16YM`3`)J{Z0Y8.png 0.png

單片機(jī)源程序如下:
  1. #include        <reg51.h>        
  2. #define        uchar        unsigned char
  3. #define        uint        unsigned int
  4. /*****定義控制位**********************/
  5. sbit    Time_Show_LED2=P2^5;    //Time_Show_LED2控制位
  6. sbit    Time_Show_LED1=P2^4;    //Time_Show_LED1控制位
  7. sbit        EW_LED2=P2^3;                //EW_LED2控制位
  8. sbit        EW_LED1=P2^2;                //EW_LED1控制位
  9. sbit        SN_LED2=P2^1;                //SN_LED2控制位
  10. sbit        SN_LED1=P2^0;                //SN_LED1控制位
  11. sbit    SN_Yellow=P1^6;         //SN黃燈
  12. sbit    EW_Yellow=P1^2;         //EW黃燈
  13. sbit    EW_Red=P1^3;            //EW紅燈
  14. sbit    SN_Red=P1^7;            //SN紅燈
  15. sbit    SNleft_led=P2^7;                //南北左拐指示燈
  16. sbit    SNright_led=P2^6;                //南北右拐指示燈
  17. sbit    EWleft_led=P3^1;                //東西左拐指示燈
  18. sbit    EWright_led=P3^0;                //東西右拐指示燈


  19.        
  20. sbit    Add_Button=P3^4;        //時(shí)間加
  21. sbit    Reduces_Button=P3^5;    //時(shí)間減
  22. sbit    QZ_EW_Btton=P3^6;       //EW方向強(qiáng)制直行按鍵
  23. sbit    QZ_SN_Btton=P3^7;       //SN方向強(qiáng)制直行按鍵
  24. bit     Flag_SN_Yellow;         //SN黃燈標(biāo)志位
  25. bit     Flag_EW_Yellow;         //EW黃燈標(biāo)志位
  26. bit     QZ_EW;                                        //EW強(qiáng)制通行標(biāo)志
  27. bit     QZ_SN;                                        //SN強(qiáng)制通行標(biāo)志
  28. char        Time_EW;                //東西方向倒計(jì)時(shí)單元
  29. char        Time_SN;                //南北方向倒計(jì)時(shí)單元
  30. uchar EW=60,SN=40,EWL=19,SNL=19; //程序初始化賦值,正常模式
  31. uchar EW1=60,SN1=40,EWL1=19,SNL1=19;
  32.                                 //用于存放修改值的變量
  33. uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  34.                                 //0~~~~9段選碼
  35. uchar code LIGHT[8]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84};
  36.                                 //交通信號(hào)燈控制代碼
  37. /*****延時(shí)函數(shù)**********************/
  38. void        Delay(uchar         a)
  39.         {
  40.        
  41.                 while(a--);
  42.         }


  43. /*****顯示函數(shù),顯示倒計(jì)時(shí)的值**********************/
  44. void        Display(void)
  45.         {
  46.                 char h,l;
  47.                 h=Time_EW/10;                //EW方向計(jì)時(shí)的十位數(shù)
  48.                 l=Time_EW%10;                //EW方向計(jì)時(shí)的個(gè)位數(shù)
  49.               P0=table[l];                //顯示EW計(jì)時(shí)時(shí)間的低位
  50.                 EW_LED2=1;
  51.                 Delay(2);
  52.                 EW_LED2=0;
  53.             P0=table[h];                //顯示EW計(jì)時(shí)時(shí)間的高位
  54.                 EW_LED1=1;
  55.                 Delay(2);
  56.                 EW_LED1=0;

  57.                 h=Time_SN/10;                //SN方向計(jì)時(shí)的十位數(shù)
  58.                 l=Time_SN%10;                //SN方向計(jì)時(shí)的個(gè)位數(shù)
  59.                 P0=table[l];                //顯示SN計(jì)時(shí)時(shí)間的低位
  60.                 SN_LED2=1;
  61.                 Delay(2);
  62.                 SN_LED2=0;
  63.             P0=table[h];                //顯示SN計(jì)時(shí)時(shí)間的高位
  64.                 SN_LED1=1;
  65.                 Delay(2);
  66.                 SN_LED1=0;
  67.                

  68.                 h= EW1/10;                        //直行時(shí)間的十位
  69.                 l= EW1%10;                        //直行時(shí)間的個(gè)位
  70.                 P0=table[l];                //時(shí)間的個(gè)位顯示
  71.                 Time_Show_LED1=1;
  72.                 Delay(2);
  73.         Time_Show_LED1=0;
  74.                 P0=table[h];                //時(shí)間的十位顯示
  75.                 Time_Show_LED2=1;
  76.                 Delay(2);
  77.             Time_Show_LED2=0;
  78. }


  79. /*****外部中斷0,用來(lái)增加或減少通行時(shí)間值**********************/
  80. void        EXINT0(void) interrupt 0
  81.         {
  82.                 EA = 0;                    //關(guān)中斷
  83. if(Add_Button==0)                  //時(shí)間加
  84.        {
  85.             EW1+=5;                                   //通行時(shí)間加5s
  86.             SN1+=5;
  87.               if(EW1>=100)                   //通行時(shí)間不得大于100s,80s
  88.                            {
  89.                              EW1=99;
  90.                              SN1=79;
  91.                }
  92.             }
  93. if(Reduces_Button==0)             //時(shí)間減
  94.        {
  95.             EW1-=5;                              //通行時(shí)間減5s
  96.             SN1-=5;
  97.             if(EW1<=40)                      //通行時(shí)間不得小于40s,20s
  98.               {
  99.                              EW1=40;
  100.                  SN1=20;
  101.                }
  102.                     }                
  103.                 EA = 1;                  //開(kāi)中斷
  104.         }

  105. /*****外部中斷2,用來(lái)強(qiáng)制通行**********************/
  106. void EXINT1(void) interrupt 2
  107. {
  108. EA = 0;  

  109. if(QZ_EW_Btton==0)              //EW方向強(qiáng)制通行按鍵是否按下
  110.       {
  111.              Delay(2);
  112.                   if(QZ_EW_Btton==0)
  113.                    {            
  114.                         QZ_EW = ~QZ_EW;         //
  115.                         QZ_SN = 0;                                                                          
  116.                         }
  117.       }
  118. if(QZ_SN_Btton==0)             //測(cè)試按鍵是否按下,按下為特殊狀態(tài)
  119.         {
  120.                   Delay(2);
  121.                   if(QZ_SN_Btton==0)
  122.                    {
  123.                     QZ_SN = ~QZ_SN;
  124.                         QZ_EW = 0;         
  125.                    }
  126.             }                                      
  127. EA = 1;                         
  128. }


  129. /*****定時(shí)器中斷,用來(lái)為倒計(jì)時(shí)單元提供時(shí)鐘信號(hào)**********************/
  130.         void timer0(void)interrupt 1
  131. {
  132.         static uchar count;
  133.         TH0=(65536-20000)/256;
  134.         TL0=(65536-20000)%256;
  135.         count++;
  136.        
  137.         if(count==10)
  138.         {
  139.           if(Flag_SN_Yellow==1)       //測(cè)試SN黃燈標(biāo)志位
  140.           {SN_Yellow=~SN_Yellow;}
  141.           if(Flag_EW_Yellow==1)       //測(cè)試EW黃燈標(biāo)志位
  142.           {EW_Yellow=~EW_Yellow;}
  143.         }
  144.         if(count==20)
  145.         {
  146.         Time_EW--;
  147.         Time_SN--;
  148.         if(Flag_SN_Yellow==1)        //測(cè)試SN黃燈標(biāo)志位
  149.             {SN_Yellow=~SN_Yellow;}
  150.         if(Flag_EW_Yellow==1)        //測(cè)試EW黃燈標(biāo)志位
  151.             {EW_Yellow=~EW_Yellow;}
  152.         count=0;
  153.         }        
  154. }  

  155. /*****主函數(shù)**********************/
  156. void        main(void)

  157. {

  158.         QZ_EW = 0;
  159.         QZ_SN = 0;
  160.         IT0=1;                            //INT0負(fù)跳變觸發(fā)
  161.         IT1=1;                          //INT0負(fù)跳變觸發(fā)       
  162.     TMOD=0x01;                  //定時(shí)器工作于方式1
  163.         TH0=(65536-50000)/256;      //定時(shí)器賦初值
  164.         TL0=(65536-50000)%256;
  165.         EA=1;                       //CPU開(kāi)中斷總允許
  166.         ET0=1;                      //開(kāi)定時(shí)中斷
  167.         EX0=1;                      //開(kāi)外部INTO中斷
  168.         EX1=1;                      //開(kāi)外部INT1中斷
  169.     TR0=1;                      //啟動(dòng)定時(shí)

  170.      while(1)
  171. {                               
  172.                 /*******SN通行,EW紅燈*** ***************/
  173.                 Flag_EW_Yellow=0;             //EW關(guān)黃燈顯示信號(hào)
  174.                                 Time_EW=EW;       
  175.                                 Time_SN=SN;               
  176.                                 while(Time_SN>=5&QZ_EW == 0&QZ_SN == 0)
  177.                             {P1=LIGHT[0];                      //SN通行,EW紅燈
  178.                                  SNleft_led=0; SNright_led=0;
  179.                                  EWleft_led=0; EWright_led=0;
  180.                          Display();}
  181.                                 /*******SN黃燈亮,等待左拐信號(hào),EW紅燈***/
  182.                             P1=0x00;
  183.                                 while(Time_SN>=0&QZ_EW == 0&QZ_SN == 0)
  184.                            {Flag_SN_Yellow=1;                  //SN開(kāi)黃燈信號(hào)位
  185.                             EW_Red=1;                     //SN黃燈亮,等待左拐信號(hào),EW紅燈
  186.                                  SNleft_led=0; SNright_led=0;
  187.                                  EWleft_led=0; EWright_led=0;                                          
  188.                             Display();
  189.                                 }
  190.                                 /*******SN左拐綠燈亮,EW紅燈*************/
  191.                             Flag_SN_Yellow=0;             //SN關(guān)黃燈顯示信號(hào)
  192.                                 Time_SN=SNL;                                                                 
  193.                                 while(Time_SN>=15&QZ_EW == 0&QZ_SN == 0)
  194.                                 {P1=LIGHT[2];
  195.                                  SNleft_led=1; SNright_led=0;
  196.                                  EWleft_led=0; EWright_led=0;    //SN左拐綠燈亮,右拐紅燈亮,EW紅燈
  197.                                  Display();}
  198.                                 /*******SN黃燈亮,等待右拐信號(hào),EW紅燈***/
  199.                                 P1=0x00;
  200.                                 while(Time_SN>=10&QZ_EW == 0&QZ_SN == 0)
  201.                            {Flag_SN_Yellow=1;                  //SN開(kāi)黃燈信號(hào)位
  202.                             EW_Red=1;                     //SN黃燈亮,等待右拐信號(hào),EW紅燈       
  203.                                  SNleft_led=1; SNright_led=0;
  204.                                  EWleft_led=0; EWright_led=0;               //SN左拐綠燈亮,右拐紅燈亮,EW紅燈                          
  205.                             Display();}       

  206.                                  /*******SN右拐綠燈亮,EW紅燈*************/
  207.                                                          
  208.                                 while(Time_SN>=5&QZ_EW == 0&QZ_SN == 0)
  209.                                 {P1=LIGHT[2];
  210.                                  SNleft_led=0; SNright_led=1;
  211.                                  EWleft_led=0; EWright_led=0;               //SN右拐綠燈亮,左拐紅燈亮,EW紅燈
  212.                                  Display();}

  213.                           /*******SN黃燈亮,等待停止信號(hào),EW紅燈******/
  214.                                 P1=0x00;
  215.                                 while(Time_SN>=0&QZ_EW == 0&QZ_SN == 0)
  216.                            {Flag_SN_Yellow=1;                  //SN開(kāi)黃燈信號(hào)位
  217.                             EW_Red=1;                     //SN黃燈亮,等待停止信號(hào),EW紅燈       
  218.                                  SNleft_led=0; SNright_led=1;
  219.                                  EWleft_led=0; EWright_led=0;               //SN右拐綠燈亮,左拐紅燈亮,EW紅燈                          
  220.                             Display();}                  

  221.                            /***********賦值**********/
  222.                                 EW=EW1;
  223.                                 SN=SN1;
  224.                                 EWL=EWL1;
  225.                                 SNL=SNL1;

  226.                                 /*******EW通行,SN紅燈******************/
  227.                                 Flag_SN_Yellow=0;              //SN關(guān)黃燈顯示信號(hào)
  228.                                 Time_EW=SN;
  229.                                 Time_SN=EW;
  230.                             while(Time_EW>=5&QZ_EW == 0&QZ_SN == 0)
  231.                             {P1=LIGHT[4];                        //EW通行,SN紅燈
  232.                                   SNleft_led=0; SNright_led=0;
  233.                                   EWleft_led=0; EWright_led=0;
  234.                                  Display();}

  235.                                 /*****EW黃燈亮,等待左拐信號(hào),SN紅燈****/
  236.                                 P1=0X00;
  237.                                 while(Time_EW>=0&QZ_EW == 0&QZ_SN == 0)
  238.                            {Flag_EW_Yellow=1;               //EW開(kāi)黃燈信號(hào)位
  239.                             SN_Red=1;                       //EW黃燈亮,等待左拐信號(hào),SN紅燈
  240.                                  SNleft_led=0; SNright_led=0;
  241.                                  EWleft_led=0; EWright_led=0;       
  242.                             Display();}

  243.                                 /*******EW左拐綠燈亮,SN紅燈**********/
  244.                                 Flag_EW_Yellow=0;                    //EW關(guān)黃燈顯示信號(hào)
  245.                                 Time_EW=EWL;
  246.                                 while(Time_EW>=15&QZ_EW == 0&QZ_SN == 0)
  247.                                 {P1=LIGHT[6];
  248.                                  SNleft_led=0; SNright_led=0;
  249.                                  EWleft_led=1; EWright_led=0;                  //EW左拐綠燈亮,右拐紅燈亮,SN紅燈
  250.                                  Display();}
  251.                                
  252.                                 /*****EW黃燈亮,等待右拐信號(hào),SN紅燈****/
  253.                                 P1=0X00;                                                          
  254.                                 while(Time_EW>=10&QZ_EW == 0&QZ_SN == 0)
  255.                            {Flag_EW_Yellow=1;               //EW開(kāi)黃燈信號(hào)位
  256.                             SN_Red=1;                       //EW黃燈亮,等待右拐信號(hào),SN紅燈
  257.                                  SNleft_led=0; SNright_led=0;
  258.                                  EWleft_led=1; EWright_led=0;                 //EW左拐綠燈亮,右拐紅燈亮,SN紅燈       
  259.                             Display();}

  260.                                 /*******EW右拐綠燈亮,SN紅燈**********/
  261.                        
  262.                                 while(Time_EW>=5&QZ_EW == 0&QZ_SN == 0)
  263.                                 {P1=LIGHT[6];
  264.                                  SNleft_led=0; SNright_led=0;
  265.                                  EWleft_led=0; EWright_led=1;                 //EW右拐綠燈亮,左拐紅燈亮,SN紅燈
  266.                                  Display();}

  267.                                 /****EW黃燈亮,等待停止信號(hào),SN紅燈***/
  268. ……………………

  269. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
交通燈再修改.rar (89.4 KB, 下載次數(shù): 68)





評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:342565 發(fā)表于 2018-7-9 19:13 | 顯示全部樓層
可以看能不能用到
回復(fù)

使用道具 舉報(bào)

ID:342565 發(fā)表于 2018-7-9 20:53 | 顯示全部樓層
里面含代碼和仿真圖原理
回復(fù)

使用道具 舉報(bào)

ID:368765 發(fā)表于 2018-7-10 15:38 | 顯示全部樓層
很好用哦
回復(fù)

使用道具 舉報(bào)

ID:218113 發(fā)表于 2018-7-14 10:32 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:89286 發(fā)表于 2018-7-25 08:10 | 顯示全部樓層
thanks for sharing
回復(fù)

使用道具 舉報(bào)

ID:649259 發(fā)表于 2020-1-2 17:35 來(lái)自手機(jī) | 顯示全部樓層
可以看下你的程序流程圖嗎
回復(fù)

使用道具 舉報(bào)

ID:628175 發(fā)表于 2020-1-5 19:56 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:692480 發(fā)表于 2020-2-12 15:33 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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