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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的智能紅綠燈Proteus仿真代碼

[復制鏈接]
跳轉到指定樓層
樓主
單片機源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. uchar data a[4];
  5. uchar data time_dx=37;//東西數默認
  6. uchar data time_nb=37;//南北默認值        
  7. uchar data set_timedx=37;//存放設置的數值  
  8. uchar data set_timenb=37;               
  9. int n; uchar data b;//定時器中斷次數

  10. sbit k5=P3^4;//時間加按鍵
  11. sbit k6=P3^5;//時間減按鍵                 
  12. sbit k7=P3^6;//確認/恢復按鍵
  13. sbit k1=P3^0;//切換方向按鍵        
  14. sbit k2=P3^1;//緊急按鍵(都不通行60s)
  15. sbit k3=P3^2;//東西通行60s (使用外部中斷T0)
  16. sbit k4=P3^3;//南北通行60s (使用外部中斷T1)

  17. sbit Green_nbzx=P2^7; //往南北轉向綠燈
  18. sbit Green_dxzx=P2^0;//往東西轉向綠燈
  19. sbit Yellow_nb=P2^5; //南北黃燈
  20. sbit Yellow_dx=P2^2; //東西黃燈
  21. sbit Green_nb=P2^4; //南北綠燈
  22. sbit Green_dx=P2^1;//東西綠燈
  23. sbit Red_nb=P2^6;//南北紅燈
  24. sbit Red_dx=P2^3;//東西紅燈
  25. bit time=0;//燈狀態循環標志,實現燈自動切換
  26. bit set=1;//調時方向切換鍵標志
  27. uchar code table[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
  28.                        0x7d,0x07,0x7f,0x6f,0x00}; //共陰數碼管編碼

  29. void key();//按鍵掃描子程序
  30. void key_t1();//鍵處理子程序//加
  31. void key_t2();//減
  32. void key_t3(); //緊急
  33. void display();//顯示子程序
  34. void logo(); //開機 LOGO
  35. void delay(int ms);//延時子程序

  36. void main()
  37. {
  38.     TMOD=0X01;//使用定時器T0的模式1
  39.     TH0=0XD8; //定時器T0的高8位賦初值
  40.     TL0=0XF0;// 定時器T0的低8位賦初值
  41.     EA=1; //開總中斷
  42.     ET0=1;//定時器T0中斷允許
  43.     TR0=1;//開定時器
  44.     EX0=1;//開外部中斷0
  45.     EX1=1;//開外部中斷1
  46.         P1=0X00;
  47.     logo();//調用logo子程序,顯示開機logo
  48.     P2=0XBD;// 開始默認狀態,東西綠燈,南北紅燈,轉向燈不亮
  49.     time_nb=time_dx+23; //南北比東西大5s  //改過(5-23)
  50.     while(1)
  51.     {  
  52.         key(); //調用按鍵掃描程序
  53.                 display(); //調用顯示程序  
  54.     }
  55. }

  56. void key() //按鍵掃描子程序
  57. {
  58.             if(k1!=1) //k1切換方向
  59.         {  TR0=0;
  60.            delay(5);  
  61.            if(k1!=1)  
  62.            {while(k1!=1); set=!set;}//如果檢測到k1按下,則改變方向標志位set
  63.         }
  64.         if(k2!=1) //k2緊急按鍵,都不通行
  65.         {
  66.             delay(5);
  67.                 if(k2!=1)
  68.                 {
  69.                     while(k2!=1)//如果檢測到k2按下,則調用key_to3子程序
  70.                         key_t3();
  71.                 }
  72.         }
  73.                 if(k5!=1) //k5時間加
  74.         {  
  75.             delay(10);  
  76.                 if(k5!=1)  
  77.                 {
  78.                     while(k5!=1) //如果檢測到k5按下,則調用key_to1子程序
  79.                         {
  80.                             key_t1();
  81.                                 for(n=0;n<60;n++)//用一個循環,延時,以達到消抖,使每按一次按鈕只加一個數
  82.                                 { display();}
  83.                         }  
  84.                 }
  85.         }
  86.         if(k6!=1) //k6時間減
  87.         {  
  88.             delay(10);  
  89.                 if(k6!=1)  
  90.                 {
  91.                     while(k6!=1) //如果檢測到k6按下,則調用key_to2子程序
  92.                         {
  93.                             key_t2();
  94.                                 for(n=0;n<60;n++)//用一個循環,延時,以達到消抖,使每按一次按鍵只減一個數
  95.                                 { display();}
  96.                         }  
  97.                 }
  98.         }
  99.         if(k7!=1)//k7確認/恢復
  100.         {  
  101.                 TR0=1; //啟動定時器
  102.                 time_nb=set_timenb; //從中斷回復,顯示設置的數值
  103.                 time_dx=set_timedx;  
  104.                 if(time==0) //檢測燈循環標志位,若time=0,則東西綠燈,南北紅燈,并南北時間比東西大23s
  105.                 { P2=0xBD;time_nb=time_dx+23; }     //(18-99,5-23)
  106.                 else { P2=0XE7;time_dx=time_nb+23; }//否則南北綠燈,東西紅燈,并東西時間比南北大23s
  107.         }  

  108. }

  109. void key_t1() // 加時間
  110. {
  111.         TR0=0; //關定時器
  112.         if(set==0)
  113.             set_timenb++; //南北加 1S
  114.         else
  115.             set_timedx++; //東西加 1S
  116.         if(set_timenb==100)//加到 100時置 1   
  117.             set_timenb=1;
  118.         if(set_timedx==100)  
  119.             set_timedx=1;  
  120.         time_nb=set_timenb; //設置的數值賦給南北
  121.         time_dx=set_timedx;//設置的數值賦給東西
  122. }

  123. void key_t2() //減時間
  124. {
  125.     TR0=0; //關定時器
  126.         if(set==0)
  127.             set_timenb--; //南北減 1S
  128.     else
  129.             set_timedx--; //東西減 1S
  130.         if(set_timenb==0)  
  131.             set_timenb=99;
  132.         if(set_timedx==0)  
  133.                 set_timedx=99; //減到 1 時重置 99
  134.         time_nb=set_timenb ; //設置的數值賦給南北
  135.         time_dx=set_timedx;//設置的數值賦給東西
  136. }

  137. void key_t3() //緊急(都不通行)
  138. {
  139.     TR0=1; //打開定時器
  140.         P2=0XB7;
  141.         time_dx=60;
  142.         time_nb=60;
  143. }

  144. void display() //顯示子程序
  145. {  
  146.         a[0]=time_dx/10; //東西十位
  147.         a[1]=time_dx%10; //東西個位
  148.         a[2]=time_nb/10; //南北十位
  149.         a[3]=time_nb%10; //南北個位
  150.       
  151.         P0=0x00;
  152.         P1=0Xf4; //片選東西十位
  153.         P0=table[a[0]];
  154.         delay(1);  
  155.       
  156.         P0=0x00;
  157.         P1=0Xf5; //片選東西個位
  158.         P0=table[a[1]];
  159.         delay(1);
  160.       
  161.         P0=0x00;
  162.         P1=0xf0; //片選南北十位
  163.         P0=table[a[2]];
  164.         delay(1);  
  165.       
  166.         P0=0x00;  
  167.         P1=0xf1; //片選南北個位
  168.         P0=table[a[3]];
  169.         delay(1);
  170.         
  171. }

  172. void time0(void) interrupt 1 using 1 //定時中斷子程序         
  173. {
  174.     b++;
  175.         if(b==15) // 定時器中斷次數
  176.         {
  177.             b=0;  
  178.             time_dx--;  
  179.             time_nb--;  

  180.                            if(time_nb<=26&&time_nb>23&&time==0)          //東西直行最后3s綠閃
  181.                 {
  182.                                  Green_dx=!Green_dx;
  183.                                 }
  184.                                  if(time_dx<=26&&time_dx>23&&time==1)          // 南北直行最后3s綠閃
  185.                 {
  186.                                   Green_nb=!Green_nb;
  187.                                 }

  188.                                 if(time_nb<=23&&time_nb>20&&time==0)          //東西直行-黃閃
  189.                 {
  190.                                  Green_dx=1;Yellow_dx=!Yellow_dx;
  191.                                 }
  192.                             if(time_dx<=23&&time_dx>20&&time==1)          // 南北直行-黃閃
  193.                 {
  194.                                   Green_nb=1;Yellow_nb=!Yellow_nb;
  195.                                 }
  196.                                 if(time_dx==0&&time_nb==23)  //東西黃閃數碼管重新賦值
  197.                 time_dx=3;  
  198.                 if(time_nb==0&&time_dx==23)  //南北黃閃數碼管重新賦值
  199.                 time_nb=3;

  200.                                 if(time_nb<=20&&time_nb>6&&time==0)          //東西直行-黃閃-往東西轉向
  201.                 {
  202.                                  Green_dx=1;Yellow_dx=1;Green_dxzx=0;
  203.                                 }
  204.                             if(time_dx<=20&&time_dx>6&&time==1)          // 南北直行-黃閃-往南北轉向
  205.                 {
  206.                                  Green_nb=1;Yellow_nb=1;Green_nbzx=0;
  207.                                 }
  208.                                  if(time_dx==0&&time_nb==20)          //東西轉向綠數碼管重新賦值
  209.                 time_dx=17;  
  210.                 if(time_nb==0&&time_dx==20)  //東西轉向綠數碼管重新賦值
  211.                 time_nb=17;
  212.                                 if(time_nb<=6&&time_nb>3&&time==0)          //東西轉向最后3s綠閃
  213.                 {
  214.                                  Green_dxzx=!Green_dxzx;
  215.                                 }
  216.                                  if(time_dx<=6&&time_dx>3&&time==1)          // 南北轉向最后3s綠閃
  217.                 {
  218.                                   Green_nbzx=!Green_nbzx;
  219.                                 }
  220.                                 
  221.                                 if(time_nb<=3&&time==0) //東西黃燈閃     
  222.                 {   Green_dx=1;Green_dxzx=1;Yellow_dx=!Yellow_dx;}
  223.                 if(time_dx<=3&&time==1) //南北黃燈閃         
  224.                 {   Green_nb=1;Green_nbzx=1;Yellow_nb=!Yellow_nb;}
  225.                         if(time_dx==0&&time_nb==3)         // 東西黃閃數碼管重新賦值
  226.                 time_dx=3;  
  227.                 if(time_nb==0&&time_dx==3)  //南北黃閃數碼管重新賦值
  228.                 time_nb=3;

  229.                 if(time==0&&time_nb==0)           //燈置狀態循環標志且南北紅燈時間到,變綠燈
  230.                 {
  231.                 P2=0xE7;
  232.                                 time=!time;        
  233.                 time_nb=set_timenb;
  234.                 time_dx=set_timenb+23;
  235.                 }  
  236.                 if(time==1&&time_dx==0)//燈置狀態循環標志且東西紅燈時間到,變綠燈  
  237.                 {
  238.                  P2=0XBD;
  239.                  time=!time;
  240.                  time_dx=set_timedx;
  241.                  time_nb=set_timedx+23;
  242.             }  
  243.         }
  244. }

  245. void int0(void) interrupt 0 using 1  //使用外部中斷控制,東西通行,南北不通行
  246. {        
  247. if(k3!=1) //k3東西通行按鍵
  248.         {
  249.             delay(5);
  250.                 if(k3!=1)
  251.                 {
  252.                     while(k3!=1)//如果檢測到k3按下
  253.                    { TR0=1;//打開定時器
  254.                     P2=0XBD;//東西綠燈,南北紅燈  
  255.                     time_dx=60;
  256.                     time_nb=60;}      
  257.                 }
  258.         }
  259.    
  260. }

  261. void int1(void) interrupt 2 using 1  //使用外部中斷控制,南北通行,東西不通行
  262. {
  263. if(k4!=1) //k4南北通行按鍵,都不通行
  264.         {
  265.             delay(5);
  266.                 if(k4!=1)
  267.                 {
  268.                     while(k4!=1)//如果檢測到k4按下
  269.                    { TR0=1; //打開定時器
  270.                      P2=0XE7;//南北綠燈,東西紅燈   
  271.                      time_nb=60;
  272.                      time_dx=60; }      
  273.                 }
  274.         }
  275.    
  276. }

  277. void logo()//開機顯示"- -"
  278. {
  279.     for(n=0;n<100;n++)
  280.         {
  281.                 P0=0x40;
  282.           P1=0xf0;
  283.           delay(1);
  284.           P1=0xf1;
  285.           delay(1);
  286.           P1=0Xf4;
  287.           delay(1);
  288.           P1=0Xf5;
  289.           delay(1);
  290.          
  291.           }
  292. }

  293. void delay(int ms) //延時子程序
  294. {
  295.     uint j,k;
  296.         for(j=0;j<ms;j++)
  297.         for(k=0;k<124;k++);
  298. }        
復制代碼


代碼經過本人實踐可使用

W}WAU}]][T7$S4R){NDA}`9.png (127.8 KB, 下載次數: 69)

整體系統仿真

整體系統仿真

23GfD[{BZ0}T$X9%NBQ1Q.png (76.17 KB, 下載次數: 88)

按鈕對應要求

按鈕對應要求

Q_Z4W5D$W}$AH{I8A7~[{BH.png (58.75 KB, 下載次數: 82)

系統要求

系統要求

60CH_OAEZSEHN]~C351hei`BLU.png (47.66 KB, 下載次數: 143)

零件表

零件表

804B9ALZZHEWR5{P[1(LGQ9.png (88.99 KB, 下載次數: 77)

主程序流程圖

主程序流程圖

1T2V]%I1YZDC}FWTIAAGWIE.png (38.4 KB, 下載次數: 68)

外部中斷

外部中斷

紅綠燈交通燈.zip

118.24 KB, 下載次數: 21, 下載積分: 黑幣 -5

c語言編程及仿真 2個文件下載

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕一区二区三区在线观看 | 成人免费观看男女羞羞视频 | 激情五月婷婷在线 | 欧美video| 亚洲成人av| 精品一区二区在线观看 | 日韩在线播放中文字幕 | 国产精品毛片av一区 | 国产一区二区三区久久久久久久久 | 毛片一级片 | 91视频在线| 精品国产青草久久久久96 | 黑人巨大精品欧美黑白配亚洲 | 亚洲一区二区精品视频 | 精品久久久久久亚洲综合网 | 亚洲一区三区在线观看 | 亚洲一区视频在线 | 激情福利视频 | 999热视频| 亚洲视频在线观看一区二区三区 | 久久久久国产精品一区二区 | 国产一区二区高清在线 | 国产亚洲精品美女久久久久久久久久 | 精品久久久久一区二区国产 | 中文字幕免费在线 | 国产成人aⅴ | 亚洲视频在线看 | 日韩视频在线一区 | 日本午夜网 | 91亚洲精品久久久电影 | 欧美一区二区小视频 | 精一区二区 | 欧美2区| 成人在线播放 | 日本福利视频免费观看 | 97精品超碰一区二区三区 | 久久精品91久久久久久再现 | 视频在线观看亚洲 | 欧美色综合天天久久综合精品 | 亚洲精品在线观看视频 | 中文字幕三区 |