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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3877|回復: 6
收起左側

單片機交通燈調試的時候獨立按鍵按下去沒反應,其他正常 求各位前輩指教

[復制鏈接]
ID:473748 發表于 2019-2-1 17:20 | 顯示全部樓層 |閱讀模式
無按鍵按下時紅燈和綠燈倒計時時間為30s,黃燈時間為5s,按鍵1有兩種模式:第一種模式是改變寶田路時間,第二種模式(即再按一下按鍵1),改變前進路時間
按鍵2和按鍵3分別是在不同模式下時間加1和時間減1;按鍵4是交通管制時交通燈的不同狀態。
單片機程序在附件中
  1. /**************************************************************************************
  2. *                              交通燈實驗                                                                                                  *
  3. 實現現象:下載程序后,按照視頻操作正確接線,呈現交通燈現象
  4. 注意事項:                                                                                                                                                                  
  5. ***************************************************************************************/

  6. #include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器

  7. typedef unsigned int u16;          //對數據類型進行聲明定義
  8. typedef unsigned char u8;

  9. sbit LSA=P2^5;        //動態數碼管位選
  10. sbit LSB=P2^6;
  11. sbit LSC=P2^7;

  12. //--定義使用的IO口--//
  13. #define GPIO_DIG   P0          //數碼管段選

  14. #define GPIO_TRAFFIC P1                  
  15. #define        GPIO_TRAFFId P2

  16. sbit RED10   = P1^0;   //上人行道紅燈
  17. sbit GREEN10 = P1^1;   //上人行道綠燈
  18. sbit RED11   = P1^2;        //寶田路紅燈
  19. sbit YELLOW11= P1^3;        //寶田路黃燈
  20. sbit GREEN11 = P1^4;        //寶田路綠燈
  21. v

  22. sbit RED00   = P3^0;        //右人行道紅燈
  23. sbit GREEN00 = P3^1;        //右人行道綠燈
  24. sbit RED01   = P1^5;        //前進路紅燈
  25. sbit YELLOW01= P1^6;        //前進路黃燈
  26. sbit GREEN01 = P1^7;        //前進路綠燈
  27. u8 BT,QJ;
  28. u8 time=30;
  29. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  30.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
  31. u8 DisplayData[8];
  32. u8 Second;                                 //倒計時時間
  33. u8 key_can;                                  //獨立按鍵
  34. u8 men_1;                                   //按鍵模式
  35. u8  flag_jdgz;                           //交通管制



  36. /*******************************************************************************
  37. * 函 數 名         : delay
  38. * 函數功能                   : 延時函數,i=1時,大約延時10us
  39. *******************************************************************************/
  40. void delay(u16 i)
  41. {
  42.         while(i--);        
  43. }

  44. /*******************************************************************************
  45. * 函 數 名         : DigDisplay
  46. * 函數功能                   : 數碼管動態掃描函數,循環掃描8個數碼管顯示
  47. *******************************************************************************/
  48. void DigDisplay()
  49. {
  50.         u8 i;
  51.         for(i=0;i<8;i++)
  52.         {
  53.                 switch(i)         //位選,選擇點亮的數碼管,
  54.                 {
  55.                         case(0):
  56.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  57.                         case(1):
  58.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  59.                         case(2):
  60.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  61.                         case(3):
  62.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  63.                         case(4):
  64.                                 LSA=0;LSB=0;LSC=1; break;//顯示第4位
  65.                         case(5):
  66.                                 LSA=1;LSB=0;LSC=1; break;//顯示第5位
  67.                         case(6):
  68.                                 LSA=0;LSB=1;LSC=1; break;//顯示第6位
  69.                         case(7):
  70.                                 LSA=1;LSB=1;LSC=1; break;//顯示第7位        
  71.                 }
  72.                 GPIO_DIG=DisplayData[i];//發送段碼
  73.                 delay(100); //間隔一段時間掃描        
  74.                 GPIO_DIG=0x00;//消隱
  75.         }
  76. }


  77. /*******************************************************************************
  78. * 函 數 名         : Timer0Init
  79. * 函數功能                   : 定時器0初始化
  80. * 輸    入         : 無
  81. * 輸    出         : 無
  82. *******************************************************************************/
  83. void Timer0Init()
  84. {
  85.         TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。

  86.         TH0=0XFC;        //給定時器賦初值,定時1ms
  87.         TL0=0X18;        
  88.         ET0=1;//打開定時器0中斷允許
  89.         EA=1;//打開總中斷
  90.         TR0=1;//打開定時器                        
  91. }


  92. void jtdzc()                          //正常時交通燈控制函數
  93. {
  94.         if(Second == 70)
  95.         {
  96.                         Second = 1;
  97.         }

  98.         if(Second < 31)
  99.         {
  100.                         DisplayData[0] = 0x00;
  101.                         DisplayData[1] = 0x00;
  102.                         DisplayData[2] = smgduan[(30 - Second) % 100 / 10];
  103.                         DisplayData[3] = smgduan[(30 - Second) %10];
  104.                         DisplayData[4] = 0x00;
  105.                         DisplayData[5] = 0x00;
  106.                         DisplayData[6] = DisplayData[2];
  107.                         DisplayData[7] = DisplayData[3];
  108.                         DigDisplay();

  109.                         //--寶田路通行--//

  110.                         GPIO_TRAFFIC = 0xFF;  //將所有的燈熄滅
  111.                         RED00 = 1;
  112.                         GREEN00 = 1;

  113.                         GREEN11 = 0;    //寶田路綠燈亮                        
  114.                         GREEN10        = 0;    //上人行道綠燈亮

  115.                         RED01 = 0;      //前進路紅燈亮
  116.                         RED00 = 0;      //右人行紅燈亮
  117.                 }

  118.                 //--黃燈等待切換狀態,5秒--//
  119.                 else if(Second < 36)
  120.                 {
  121.                         DisplayData[0] = 0x00;
  122.                         DisplayData[1] = 0x00;
  123.                         DisplayData[2] = smgduan[(35 - Second) % 100 / 10];
  124.                         DisplayData[3] = smgduan[(35 - Second) %10];
  125.                         DisplayData[4] = 0x00;
  126.                         DisplayData[5] = 0x00;
  127.                         DisplayData[6] = DisplayData[2];
  128.                         DisplayData[7] = DisplayData[3];
  129.                         DigDisplay();

  130.                         //--黃燈階段--//

  131.                         GPIO_TRAFFIC = 0xFF;  //將所有的燈熄滅
  132.                         RED00 = 1;
  133.                         GREEN00 = 1;

  134.                         YELLOW11 = 0;    //寶田路黃燈亮                        
  135.                         RED10        = 0;     //上人行道紅燈亮

  136.                         YELLOW01 = 0;    //前進路紅燈亮
  137.                         RED00 = 0;       //右人行道紅燈亮
  138.                 }

  139.                 //--前進路通行--//
  140.                 else if(Second < 66)
  141.                 {
  142.                         DisplayData[0] = 0x00;
  143.                         DisplayData[1] = 0x00;
  144.                         DisplayData[2] = smgduan[(65 - Second) % 100 / 10];
  145.                         DisplayData[3] = smgduan[(65 - Second) %10];
  146.                         DisplayData[4] = 0x00;
  147.                         DisplayData[5] = 0x00;
  148.                         DisplayData[6] = DisplayData[2];
  149.                         DisplayData[7] = DisplayData[3];
  150.                         DigDisplay();

  151.                         //--黃燈階段--//

  152.                         GPIO_TRAFFIC = 0xFF;  //將所有的燈熄滅
  153.                         RED00 = 1;
  154.                         GREEN00 = 1;

  155.                         RED11 = 0;       //寶田路紅燈亮                        
  156.                         RED10 = 0;       //上人行道紅燈亮

  157.                         GREEN01 = 0;     //前進路綠燈亮
  158.                         GREEN00 = 0;     //右人行道綠燈亮
  159.                 }

  160.                 //--黃燈等待切換狀態,5秒--//
  161.                 else
  162.                 {
  163.                         DisplayData[0] = 0x00;
  164.                         DisplayData[1] = 0x00;
  165.                         DisplayData[2] = smgduan[(70 - Second) % 100 / 10];
  166.                         DisplayData[3] = smgduan[(70 - Second) %10];
  167.                         DisplayData[4] = 0x00;
  168.                         DisplayData[5] = 0x00;
  169.                         DisplayData[6] = DisplayData[2];
  170.                         DisplayData[7] = DisplayData[3];
  171.                         DigDisplay();

  172.                         //--黃燈階段--//

  173.                         GPIO_TRAFFIC = 0xFF;  //將所有的燈熄滅
  174.                         RED00 = 1;
  175.                         GREEN00 = 1;

  176.                         YELLOW11 = 0;    //寶田路黃燈亮                        
  177.                         RED10        = 0;     //上人行道紅燈亮

  178.                         YELLOW01 = 0;    //前進路紅燈亮
  179.                         RED00 = 0;       //右人行道紅燈亮
  180.                 }        
  181. }                                       

  182. void DULIANJIAN()               //獨立按鍵模塊
  183. {        
  184.         GPIO_TRAFFId|=0x1f;                        //P2口
  185.         if((GPIO_TRAFFId)&(0x0f)!=0x0f)                //判斷按鍵
  186.         {                                                                        //延時
  187.                 delay(100);
  188.                 if((GPIO_TRAFFId)&(0x1f)!=0x1f)
  189.                 {
  190.                         switch((GPIO_TRAFFId)&(0x1f))        //按鍵鍵位的確定
  191.                         {
  192.                                 case(0x0e):key_can=1;break;
  193.                                 case(0x0d):key_can=2;break;
  194.                                 case(0x0b):key_can=3;break;
  195.                                 case(0x07):key_can=4;break;

  196.                         }
  197.                
  198.                 }
  199.         }

  200. }
  201. void DULIANJIANCAOZUO()     //各按鍵所要執行的功能
  202. {
  203.         key_can=20;
  204.         
  205.         if(key_can==4)                   //交通管制狀態
  206.         {
  207.                 flag_jdgz ++;
  208.                 if(flag_jdgz>=5)
  209.                 {
  210.                         flag_jdgz=0;
  211.                 }
  212.                 if(flag_jdgz==1)
  213.                 {
  214.                         GPIO_TRAFFIC = 0xFF;  //將所有的燈熄滅
  215.                         RED00 = 1;
  216.                         GREEN00 = 1;


  217.                         RED10 = 0;       //各路所有紅燈亮
  218.                         RED11=0;         
  219.                         RED00=0;                 //
  220.                         RED01=0;
  221.                 }
  222.                 if(flag_jdgz==2)
  223.                 {
  224.                         GPIO_TRAFFIC = 0xFF;  //將所有的燈熄滅
  225.                         RED00 = 1;
  226.                         GREEN00 = 1;
  227.                         
  228.                         GREEN10=0;                           //上人行道綠燈亮
  229.                         GREEN11=0;                           //寶田路綠燈亮
  230.                         RED00=0;                           //右人行道紅燈
  231.                         RED01=0;                           //前進路紅燈
  232.                 }
  233.                 if(flag_jdgz==3)
  234.                 {
  235.                         GPIO_TRAFFIC = 0xFF;  //將所有的燈熄滅
  236.                         RED00 = 1;
  237.                         GREEN00 = 1;
  238.                         
  239.                         RED10=0;                          //上人行紅燈
  240.                         RED11=0;                          //寶田路紅燈
  241.                         GREEN00=0;                          //右人行道綠燈
  242.                         GREEN01=0;                           //前進路綠燈
  243.                 }
  244.                 if(flag_jdgz==4)
  245.                 {
  246.                         GPIO_TRAFFIC = 0xFF;  //將所有的燈熄滅
  247.                         RED00 = 1;
  248.                         GREEN00 = 1;
  249.                         
  250.                         GREEN10=0;                          //各路綠燈亮
  251.                         GREEN11=0;
  252.                         GREEN00=0;
  253.                         GREEN01=0;
  254.                 }
  255.                 if(flag_jdgz==5)
  256.                 {
  257.                         GPIO_TRAFFIC = 0xFF;  //將所有的燈熄滅
  258.                         RED00 = 1;
  259.                         GREEN00 = 1;
  260.                         
  261.                         RED10=0;                           //人行道紅燈 前進路寶田路黃燈
  262.                         YELLOW11=0;
  263.                         RED00=0;
  264.                         YELLOW01=0;                                
  265.                 }                        
  266.                         
  267.         
  268.         }
  269.         if(key_can==1)                                   //鍵值為1
  270.         {
  271.                
  272.                 men_1++;                                   //模式選擇
  273.                 if(men_1>=3)
  274.                 {
  275.                         men_1=0;
  276.                 }
  277.         }
  278.         if(men_1==1)                                   //模式為1時  
  279.         {                                                           //獨立按鍵2功能為寶田路倒計時時間加1
  280.                 if(key_can==2)
  281.                 {
  282.                         time++;
  283.                         if(time>99)
  284.                         {
  285.                                 time=0;
  286.                         }
  287.                 }
  288.                 if(key_can==3)                          //獨立按鍵3功能為寶田路倒計時時間減1
  289.                 {
  290.                         time--;
  291.                         if(time<10)
  292.                         {
  293.                                 time=10;
  294.                         }

  295.                 }
  296.                 DisplayData[0] = 0x00;                                         //顯示前進路調整后的時間
  297.                 DisplayData[1] = 0x00;
  298.                 DisplayData[2] = smgduan[time/10];
  299.                 DisplayData[3] = smgduan[time%10];
  300.                 DisplayData[4] = 0x00;
  301.                 DisplayData[5] = 0x00;
  302.                 DisplayData[6] = DisplayData[10];
  303.                 DisplayData[7] = DisplayData[10];
  304.                 DigDisplay();                        
  305.         }
  306.         if(men_1==2)                                                                   //模式2時
  307.         {                                                                                           //前進路時間加1
  308.                 if(key_can==2)
  309.                 {
  310.                         time++;
  311.                         if(time>99)
  312.                         {
  313.                                 time=0;
  314.                         }
  315.                 }
  316.                 if(key_can==3)                                                                //前進路時間減1
  317.                 {
  318.                         time--;
  319.                         if(time<10)
  320.                         {
  321.                                 time=10;
  322.                         }

  323.                 }
  324.                 DisplayData[0] = 0x00;                                                                           //顯示調整后的時間
  325.                 DisplayData[1] = 0x00;
  326.                 DisplayData[2] = smgduan[11];
  327.                 DisplayData[3] = smgduan[11];
  328.                 DisplayData[4] = 0x00;
  329.                 DisplayData[5] = 0x00;
  330.                 DisplayData[6] = DisplayData[time/10];
  331.                 DisplayData[7] = DisplayData[time%10];
  332.                 DigDisplay();                        
  333.         }

  334. }


  335. void main()
  336. {
  337.         Timer0Init();
  338.         while(1)
  339.         {
  340.                  if(key_can<20)
  341.                 {
  342.                         
  343.                         DULIANJIANCAOZUO();               
  344.                 }
  345.                
  346.                 if((men_1==0)&&(flag_jdgz == 0))
  347.                 {
  348.                         jtdzc();        
  349.                
  350.                 }
  351.                 DULIANJIAN();
  352.            
  353.         }        

  354. }




  355. /*******************************************************************************
  356. * 函 數 名         : void Timer0() interrupt 1
  357. * 函數功能                   : 定時器0中斷函數
  358. * 輸    入         : 無
  359. * 輸    出         : 無
  360. *******************************************************************************/

  361. void time0()interrupt 1
  362. {
  363.         static u16 i;
  364.         TH0=0XFC;        //給定時器賦初值,定時1ms
  365.         TL0=0X18;
  366.         i++;
  367.         if(i==1000)
  368.         {
  369.                 i=0;
  370.                 Second ++;        
  371.         }        
  372. }
復制代碼

交通燈.docx

16.33 KB, 下載次數: 8

回復

使用道具 舉報

ID:473186 發表于 2019-2-1 18:54 | 顯示全部樓層
電路圖也上上來看看,應該不難

評分

參與人數 3黑幣 +57 收起 理由
shuisheng60 + 35
找人PK + 12
sheng7533967 + 10

查看全部評分

回復

使用道具 舉報

ID:213173 發表于 2019-2-1 20:20 | 顯示全部樓層
void DULIANJIAN()               //獨立按鍵模塊
{        
        GPIO_TRAFFId=0x0f;                        //P2口
        if(GPIO_TRAFFId!=0x0f)                //判斷按鍵
        {                                 
                delay(100); //延時
                if(GPIO_TRAFFId!=0x0f)
                {
                        switch(GPIO_TRAFFId)        //按鍵鍵位的確定
                        {
                                case(0x0e):key_can=1;break;
                                case(0x0d):key_can=2;break;
                                case(0x0b):key_can=3;break;
                                case(0x07):key_can=4;break;
                        }
                        while(!GPIO_TRAFFId);
                }
        }
}
回復

使用道具 舉報

ID:473748 發表于 2019-2-3 14:46 | 顯示全部樓層
wulin 發表于 2019-2-1 20:20
void DULIANJIAN()               //獨立按鍵模塊
{        
        GPIO_TRAFFId=0x0f;                       ...

試過了還是不行,還是要感謝你,新春快樂
回復

使用道具 舉報

ID:473748 發表于 2019-2-3 14:55 | 顯示全部樓層
zhengchong60 發表于 2019-2-1 18:54
電路圖也上上來看看,應該不難

這是我的設計圖截屏   有點遲了,如果有時間的話請幫我看看,新春快樂!

QQ截圖20190203145108.png
回復

使用道具 舉報

ID:473748 發表于 2019-2-3 15:44 | 顯示全部樓層
zhengchong60 發表于 2019-2-1 18:54
電路圖也上上來看看,應該不難

這個是我仿照開發板的電路設計的,靜態數碼管,34位顯示寶田路時間,78位顯示前進路時間
回復

使用道具 舉報

ID:213173 發表于 2019-2-4 08:48 | 顯示全部樓層
lhblhb 發表于 2019-2-3 14:46
試過了還是不行,還是要感謝你,新春快樂

看了你的電路圖,P2高4位還有其他用途,所以判斷按鍵時不能隨意改變P2狀態。可以這樣寫:
void DULIANJIAN()                        //獨立按鍵模塊
{        
        u8 i;                                        //臨時變量
        i=GPIO_TRAFFId;                        //讀P2口賦值變量i
        i&=0x0f;                                 //高4位清0,保留低4位
        if(i!=0x0f)                                //判斷有鍵按下
        {
                delay(100);                        //延時
                if(i!=0x0f)                        //確認有鍵按下
                {
                        switch(i)                //按鍵鍵位的確定
                        {
                                case(0x0e):key_can=1;break;
                                case(0x0d):key_can=2;break;
                                case(0x0b):key_can=3;break;
                                case(0x07):key_can=4;break;
                        }
                }
        }
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩a视频| 国产精品一区在线观看你懂的 | 亚洲免费一区二区 | 日本精品一区二区在线观看 | 国产精品一区二区在线播放 | 看特级黄色片 | 精品国产一区二区三区免费 | 日日摸日日添日日躁av | 亚洲午夜视频在线观看 | 国产三级在线观看播放 | 九九亚洲| 日韩欧美手机在线 | 精品国产乱码久久久久久影片 | 国产视频91在线 | 中文字幕在线不卡 | 亚洲成av人影片在线观看 | 欧美综合在线观看 | 国产精品久久久久久婷婷天堂 | 日韩精品一区二区三区 | 国产一区二区精品在线 | 在线观看中文字幕视频 | 欧美黄色绿像 | 2020亚洲天堂 | 亚洲国产一区二区三区在线观看 | 中文字幕乱码一区二区三区 | 国产精品久久久久一区二区三区 | 久久国产精品-国产精品 | 98久久| 国产精品jizz在线观看老狼 | 新91视频网| 国产做a爱免费视频 | 欧美国产视频一区二区 | 黄网站免费在线看 | 呦呦在线视频 | 欧美一区二区久久 | 中文字幕av中文字幕 | 日本久久一区二区三区 | 在线亚洲免费 | 亚州精品天堂中文字幕 | 天堂网色| 一级毛片播放 |