找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機四項交通燈程序,帶按鍵

  [復制鏈接]
跳轉到指定樓層
樓主
ID:734690 發(fā)表于 2020-11-9 13:37 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我做的51單片機交通燈設計。
用了一個多星期,
里面包含了keil源代碼和proteus的仿真圖。






交通燈.rar (97.68 KB, 下載次數(shù): 160)
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

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

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

  17. sbit Yellow_nb=P2^5; //南北黃燈
  18. sbit Yellow_dx=P2^2; //東西黃燈
  19. sbit Green_nb=P2^4; //東西綠燈
  20. sbit Green_dx=P2^1;//南北綠燈
  21. sbit Red_nb=P2^6;//南北紅燈
  22. sbit Red_dx=P2^3;//東西紅燈
  23. bit time=0;//燈狀態(tài)循環(huán)標志
  24. bit set=1;//調(diào)時方向切換鍵標志
  25. uchar code table[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
  26.                        0x7d,0x07,0x7f,0x6f,0x00}; //共陰數(shù)碼管編碼

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

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

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

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

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

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

  141. void display() //顯示子程序
  142. {  
  143.      a[0]=time_dx/10; //東西十位
  144.         a[1]=time_dx%10; //東西個位
  145.         a[2]=time_nb/10; //南北十位
  146.         a[3]=time_nb%10; //南北個位
  147.         P1=0xff; // 初始燈為滅的
  148.         P0=0x00;
  149.         P1=0xfe; //片選 LCD1
  150.         P0=table[a[0]];
  151.         delay(1);  
  152.         P1=0xff;
  153.         P0=0x00;
  154.         P1=0xfd; //片選 LCD2
  155.         P0=table[a[1]];
  156.         delay(1);
  157.         P1=0xff;
  158.         P0=0x00;
  159.         P1=0Xfb; //片選 LCD3  
  160.         P0=table[a[2]];
  161.         delay(1);  
  162.         P1=0xff;
  163.         P0=0x00;  
  164.         P1=0Xf7;  
  165.         P0=table[a[3]]; //片選 LCD4
  166.         delay(1);
  167. }

  168. void time0(void) interrupt 1 using 1 //定時中斷子程序
  169. {
  170.     b++;
  171.         if(b==19) // 定時器中斷次數(shù)
  172.         {
  173.             b=0;  
  174.                 time_dx--;  
  175.                 time_nb--;  
  176.                 if(time_nb<=5&&time==0) //東西黃燈閃
  177.                 {   Green_dx=0;Yellow_dx=!Yellow_dx;}
  178.                 if(time_dx<=5&&time==1) //南北黃燈閃
  179.                 {   Green_nb=0;Yellow_nb=!Yellow_nb;}
  180.         if(time_dx==0&&time_nb==5)  
  181.                 time_dx=5;  
  182.             if(time_nb==0&&time_dx==5)  
  183.                 time_nb=5;
  184.             if(time==0&&time_nb==0)
  185.             {
  186.                 P2=0x99;time=!time;
  187.                     time_nb=set_timenb;
  188.                     time_dx=set_timenb+5;
  189.             }  
  190.             if(time==1&&time_dx==0)  
  191.             {
  192.                 P2=0Xc3;
  193.                     time=!time;
  194.                     time_dx=set_timedx;
  195.                     time_nb=set_timedx+5;
  196.             }  
  197.         }
  198. }

  199. void int0(void) interrupt 0 using 1  //使用外部中斷控制,東西通行,南北不通行
  200. {
  201.     TR0=1;//打開定時器
  202.         P2=0Xc3;//東西綠燈,南北紅燈  
  203.         time_dx=60;
  204.         time_nb=60;
  205. }

  206. void int1(void) interrupt 2 using 1  //使用外部中斷控制,南北通行,東西不通行
  207. {
  208.     TR0=1; //打開定時器
  209.         P2=0X99;//南北綠燈,東西紅燈  
  210.         time_nb=60;
  211.         time_dx=60;
  212. }

  213. void logo()//開機顯示"- -"
  214. {
  215.     for(n=0;n<50;n++)
  216.         { P0=0x40;
  217.       P1=0xfe;
  218.           delay(1);
  219.           P1=0xfd;
  220.           delay(1);
  221.           P1=0Xfb;
  222.           delay(1);
  223.           P1=0Xf7;
  224.           delay(1);
  225.           P1 = 0xff;
  226.           }
  227. }

  228. void delay(int ms) //延時子程序
  229. {
  230.     uint j,k;
  231.         for(j=0;j<ms;j++)
  232.         for(k=0;k<124;k++);
  233. }        
復制代碼



請大家多多指教。

評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:863537 發(fā)表于 2020-12-19 17:40 來自手機 | 只看該作者
謝謝了 最近正在做單片機設計 學習!
回復

使用道具 舉報

板凳
ID:79544 發(fā)表于 2021-11-16 17:16 | 只看該作者
樓主辛苦感謝分享。。。。。!
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表