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

QQ登錄

只需一步,快速開始

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

帶緊急開關(guān)的51單片機(jī)十字路口交通燈的Proteus仿真+代碼設(shè)計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:447814 發(fā)表于 2018-12-17 11:33 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
利用51單片機(jī)對(duì)十字路口交通燈進(jìn)行設(shè)計(jì),東西方向和南北方向都為三十秒,分別設(shè)計(jì)三個(gè)按鍵進(jìn)行時(shí)間控制。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include<reg52.h>
  2. #include"delay.h"


  3. /*************************函數(shù)聲明**************************/
  4. void show();          //顯示函數(shù)
  5. void init();
  6. /************************端口定義**************************/
  7. sbit k1=P3^7;         //        K1  時(shí)間加
  8. sbit k2=P3^6;         //        K2  時(shí)間減
  9. sbit k3=P3^5;         //        K3  暫停,確認(rèn)

  10. sbit led_red_a=P2^0;         //        
  11. sbit led_red_b=P2^2;         //
  12. sbit led_green_a=P2^1;         //        
  13. sbit led_green_b=P2^3;         //

  14. sbit WX_a_1=P2^4;             //        
  15. sbit WX_a_2=P2^5;             //
  16. sbit WX_b_1=P2^6;             //        
  17. sbit WX_b_2=P2^7;             //
  18. /************************變量定義**************************/
  19. char temp1 = 30;          // 初始紅綠燈時(shí)間
  20. uchar temp2;          //產(chǎn)生1秒 計(jì)數(shù)變量
  21. uchar temp4=30;          //存儲(chǔ)時(shí)間更改變量

  22. uchar flag1=0;                  //a,b,兩個(gè)方向紅路燈切換標(biāo)志
  23. uchar flag2=0;                  //暫停標(biāo)志
  24. /**********************數(shù)組定義***************************/
  25. uchar tab_dx[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰,不帶小數(shù)點(diǎn)

  26. /************************顯示**************************/
  27. void show()
  28. {        
  29.          
  30.           if(flag1==0)                         //a  紅燈亮 綠燈滅       b        紅燈滅 綠燈亮
  31.            {  
  32.               led_red_a=0;               
  33.           led_red_b=1;         
  34.           led_green_a=1;         
  35.           led_green_b=0;         
  36.            }
  37.           else                                   //a  紅燈滅 綠燈亮        b        紅燈亮 綠燈滅
  38.            {
  39.               led_red_a=1;               
  40.           led_red_b=0;         
  41.           led_green_a=0;         
  42.           led_green_b=1;
  43.            }
  44.                         

  45.           if(flag1==0)
  46.           {
  47.                  WX_a_1=1;            
  48.              WX_a_2=1;            
  49.              WX_b_1=1;                     
  50.              WX_b_2=0;
  51.                                                         
  52.          P0=tab_dx[temp1%10];
  53.              delayxms(3);
  54.              P0=0x00;

  55.                  WX_a_1=1;            
  56.              WX_a_2=1;            
  57.              WX_b_1=0;                     
  58.              WX_b_2=1;
  59.          
  60.          P0=tab_dx[temp1/10];
  61.              delayxms(3);
  62.              P0=0x00;
  63.           }        
  64.           else
  65.           {
  66.                WX_a_1=1;            
  67.              WX_a_2=0;            
  68.              WX_b_1=1;                     
  69.              WX_b_2=1;
  70.                                                         
  71.          P0=tab_dx[temp1%10];
  72.              delayxms(3);
  73.              P0=0x00;

  74.                  WX_a_1=0;            
  75.              WX_a_2=1;            
  76.              WX_b_1=1;                     
  77.              WX_b_2=1;
  78.          
  79.          P0=tab_dx[temp1/10];
  80.              delayxms(3);
  81.              P0=0x00;
  82.          }                        
  83. }
  84. /************************顯示1**************************/
  85. void show_1()
  86. {        
  87.                  static uchar kk;
  88.          kk++;

  89.              led_red_a=0;               
  90.          led_red_b=0;         
  91.          led_green_a=1;         
  92.          led_green_b=1;         

  93.                  WX_a_1=1;            
  94.              WX_a_2=1;            
  95.              WX_b_1=1;                     
  96.              WX_b_2=0;
  97.                                                         
  98.          P0=tab_dx[temp4%10];
  99.              delayxms(kk/126);
  100.              P0=0x00;

  101.                  WX_a_1=1;            
  102.              WX_a_2=1;            
  103.              WX_b_1=0;                     
  104.              WX_b_2=1;
  105.          
  106.          P0=tab_dx[temp4/10];
  107.              delayxms(kk/126);
  108.              P0=0x00;
  109.          
  110.                WX_a_1=1;            
  111.              WX_a_2=0;            
  112.              WX_b_1=1;                     
  113.              WX_b_2=1;
  114.                                                         
  115.          P0=tab_dx[temp4%10];
  116.              delayxms(kk/126);
  117.              P0=0x00;

  118.                  WX_a_1=0;            
  119.              WX_a_2=1;            
  120.              WX_b_1=1;                     
  121.              WX_b_2=1;
  122.          
  123.          P0=tab_dx[temp4/10];
  124.              delayxms(kk/126);
  125.              P0=0x00;               
  126. }

  127. /************************按鍵檢測(cè)**************************/
  128. void key()
  129. {               
  130.                   if(k1==0)           //時(shí)間加
  131.            {
  132.                  delayxms(10);
  133.                  while(k1==0) ;
  134.                  temp4++;
  135.                  temp1=temp4;
  136.                  if(temp4==91)
  137.                   {
  138.                    temp4=0;
  139.                   }
  140.            }

  141.                    if(k2==0)         //          時(shí)間減
  142.            {
  143.                  delayxms(10);
  144.                  while(k2==0);
  145.                  temp4--;
  146.                  temp1=temp4;
  147.                  if(temp4==-1)
  148.                   {
  149.                    temp4=90;
  150.                   }
  151.            }

  152.            if(k3==0)                     // 暫停,確認(rèn)
  153.            {
  154.                  delayxms(10);
  155.                  while(k3==0);
  156.                  flag2=~flag2;
  157.            }
  158. }

  159. /************************中斷初始化**************************/
  160. void init()
  161. {
  162.       TMOD=0x11;              //設(shè)置定時(shí)器0,1為工作方式1
  163.           TH0=(65536-50000)/256;  //初值
  164.           TL0=(65536-50000)%256;
  165. //          TH1=(65536-50000)/256;  //初值
  166. //          TL1=(65536-50000)%256;
  167.           EA=1;                   //打開中斷總開關(guān)
  168.           ET0=1;                  //開定時(shí)器0中斷
  169. //          ET1=1;                                  //開定時(shí)器1中斷
  170.           TR0=1;                  //啟動(dòng)定時(shí)器0   
  171.           EX0 = 1;                /* 允許外部中斷0中斷 */
  172.       PX0 = 1;                /* 外部中斷0為高優(yōu)先級(jí) */
  173. }
  174. /************************************************************
  175.                    主函數(shù)
  176. *************************************************************/
  177. void main()
  178. {
  179.    init();  

  180.    while(1)
  181.         {
  182.            key();

  183.            if(flag2==0)
  184.            {   
  185.                TR0=1;
  186.                       show();  //顯示函數(shù)
  187.            }

  188.            else
  189.            {
  190.                TR0=0;
  191.                       show_1();  //顯示函數(shù)
  192.            }
  193.           }
  194. }

  195. /* ----------------- t0中斷函數(shù) ----------------- */
  196. void time1() interrupt 1                                               
  197. {

  198.   TH0=(65536-50000)/256;  //
  199.   TL0=(65536-50000)%256;

  200.   temp2++;
  201.   if(temp2 == 20)
  202.   {         
  203.      temp2=0;
  204.          temp1=temp1-1;
  205.          if(temp1==-1)  
  206.          {
  207.                  temp1=temp4;
  208.                  flag1=~flag1;
  209.          }
  210.    }  
  211.   
  212. }

  213. /* ----------------- 外部中斷函數(shù) ----------------- */
  214. int0_srv( ) interrupt 0 using 2
  215.   {
  216.     uchar a,b,c,d;

  217.     int i;
  218.         for (i = 0;i<10000;i++);

  219.         if ( INT0 ==0)
  220.         {
  221.          a=led_red_a;                 //保留指示燈狀態(tài)
  222.          b=led_red_b;         
  223.          c=led_green_a;         
  224.          d=led_green_b;
  225.            while(INT0==0)
  226.            {         
  227.              led_red_a=0;               
  228.          led_red_b=0;         
  229.          led_green_a=1;         
  230.          led_green_b=1;              /* 使兩邊亮起紅燈 */

  231.            if(flag1==0)
  232.           {
  233.                  WX_a_1=1;            
  234.              WX_a_2=1;            
  235.              WX_b_1=1;                     
  236.              WX_b_2=0;
  237.                                                         
  238.          P0=tab_dx[temp1%10];
  239.              delayxms(3);
  240.              P0=0x00;

  241.                  WX_a_1=1;            
  242.              WX_a_2=1;            
  243.              WX_b_1=0;                     
  244.              WX_b_2=1;
  245.          
  246. ……………………

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

所有資料51hei提供下載:
交通燈.zip (88.14 KB, 下載次數(shù): 56)


評(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ù) 返回頂部 返回列表