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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機交通燈按鍵時間修改不管用

  [復制鏈接]
跳轉到指定樓層
樓主
能進入修改模式加減修改時間,可是一旦退出修改模式后,數碼管還是按照修改前的時間倒計時,時間根本就沒變的,請問需要修改哪里呢?謝謝

單片機源程序:
  1. #include <reg52.h>            
  2. #define uchar unsigned char   
  3. #define u8 unsigned char   
  4. #define uint  unsigned int      

  5. //上下南北主干道
  6. //左右東西輔干道

  7. u8 code DisplayOther[]={
  8. 0xff,         //  空
  9. 0x7f,        //   "."
  10. 0xbf,        //   "-"
  11. 0xa7         //  c
  12. };

  13. //數碼管段選定義   0    1    2     3      4      5       6      7        8      9        a      b        c       d         e       f        -
  14. uchar code smg_du[17] = {
  15. 0xc0,        //0
  16. 0xf9,        //1
  17. 0xa4,        //2
  18. 0xb0,        //3
  19. 0x99,        //4
  20. 0x92,        //5
  21. 0x82,        //6
  22. 0xf8,        //7
  23. 0x80,        //8
  24. 0x90,        //9
  25. 0x88,        //A
  26. 0x83,        //b
  27. 0xc6,        //C
  28. 0xa1,        //d
  29. 0x86,        //E
  30. 0x8e        //F
  31. };        
  32. uchar dis_smg[8 ] = {0xc0,0xf5,0x8c,0x94,0xb1,0x92,0x82,0xf4};        
  33. uchar smg_i = 4;    //顯示數碼管的個位數

  34. //數碼管位選定義
  35. sbit smg_we1 = P2^0;        //東西數碼管2
  36. sbit smg_we2 = P2^1;            //東西數碼管1
  37. sbit smg_we3 = P2^3;            //南北數碼管2
  38. sbit smg_we4 = P2^2;            //南北數碼管1


  39. char dx_s = 0;    //東西  南北 倒計時變量

  40. sbit nb_red    = P1^0;        //南北紅燈
  41. sbit nb_green  = P1^2;        //南北綠燈
  42. sbit nb_yellow = P1^1;        //南北黃燈    1

  43. sbit dx_red    = P1^3;        //東西紅燈
  44. sbit dx_green  = P1^5;        //東西綠燈1
  45. sbit dx_yellow = P1^4;        //東西黃燈1

  46. uchar flag_jtd_mode;  //交通燈的模式 根據時間
  47. bit flag_1s = 1;        //進入南北方向切換的標志位
  48. bit flag_500ms;
  49. bit flag_dx_nb;         //東西南北模式
  50. uchar flag_5m_value;
  51. uchar i;
  52. uchar flag_alarm;    //模式
  53. //uchar dx_time = 30,nb_time = 20;   //東西、南北的時間
  54. uchar dx_time = 20,nb_time = 30;   //東西、南北的時間
  55. uchar flag_jdgz ;     //交通管制

  56. /********************************************************************
  57. * 名稱 : u8 ChangeFor(u8 dat)
  58. * 功能 : 交換一個字節位的位置,用于數碼管顯示
  59. * 輸入 : 需要改變的數
  60. * 輸出 : 改變后的數
  61. ***********************************************************************/
  62. #define LED_a        6    //數碼管段選的a段接在段選IO口的第0位
  63. #define LED_b        5
  64. #define LED_c        0
  65. #define LED_d        2
  66. #define LED_e        1
  67. #define LED_f        4
  68. #define LED_g        3
  69. #define LED_dp    7

  70. u8 ChangeFor(u8 dat)
  71. {
  72.     u8 temp=0;
  73.     if(dat&0x01)        //判斷數據的第一位是否為1
  74.         temp|=0x01<<LED_a;//如果為1,放到控制數碼管a段的位置
  75.     if(dat&0x02)
  76.         temp|=0x01<<LED_b;
  77.     if(dat&0x04)
  78.         temp|=0x01<<LED_c;
  79.     if(dat&0x08)
  80.         temp|=0x01<<LED_d;
  81.     if(dat&0x10)
  82.         temp|=0x01<<LED_e;
  83.     if(dat&0x20)
  84.         temp|=0x01<<LED_f;
  85.     if(dat&0x40)
  86.         temp|=0x01<<LED_g;
  87.     if(dat&0x80)
  88.         temp|=0x01<<LED_dp;
  89.     return temp;
  90. }

  91. /***********************數碼位選函數*****************************/
  92. //i:    0,東西數碼管2
  93. //        1,東西數碼管1
  94. //        2,南北數碼管2
  95. //        3,南北數碼管1
  96. void smg_we_switch(uchar i)
  97. {
  98.     switch(i)
  99.     {
  100.         case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
  101.         case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;
  102.         case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
  103.         case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
  104.     }   
  105. }


  106. /********************************************************************
  107. * 名稱 : delay_1ms()
  108. * 功能 : 延時1ms函數
  109. * 輸入 : q
  110. * 輸出 : 無
  111. ***********************************************************************/
  112. void delay_1ms(uint q)
  113. {
  114.     uint i,j;
  115.     for(i=0;i<q;i++)
  116.         for(j=0;j<110;j++);
  117. }


  118. /********************************************************************
  119. * 名稱 : display()
  120. * 功能 : 數碼管顯示
  121. * 輸入 : 無
  122. * 輸出 : 無
  123. ***********************************************************************/
  124. void DisplayScan()
  125. {
  126.     static uchar i;
  127. //    if(T_MS_SCAN>=3)
  128.     {
  129.         {        
  130.         P0 = 0xff;              //消隱
  131.             smg_we_switch(i);                    //位選
  132.         P0 =    ChangeFor(dis_smg[i]);          //段選      
  133.         delay_1ms(3);
  134.         }
  135.         i++;
  136.         if(i>=4)
  137.             i=0;
  138. //        T_MS_SCAN=0;
  139.     }
  140. }
  141. /*********************定時器0、定時器1初始化******************/
  142. void time0_init()      
  143. {
  144.     TMOD = 0x01;                    //設置定時器0為工作模式1 (16-bit)
  145.     TL0 = 15536;                    //給定時器低位賦初始值        65536-15536=50000us=50ms,即50ms一個中斷
  146.     TH0 = 15536 >> 8;               //給定時器高位賦初始值
  147.     TR0 = 1;                        //開啟定時器0
  148.     ET0 = 1;                        //允許定時器0中斷
  149.     EA = 1;                         //開啟全局中斷
  150. }

  151. /*********************交通燈處理函數*********************************/
  152. void jiaotongdeng_dis()
  153. {
  154.     if(flag_1s == 1)//如果切換標志為1
  155.     {
  156.         flag_1s = 0;    //清零標志位
  157.         if(dx_s == 0)
  158.         {
  159.             if(flag_dx_nb == 1)
  160.                 dx_s = nb_time;      //南北時間
  161.             else
  162.                 dx_s = dx_time;      //東西時間
  163.             flag_dx_nb = ~flag_dx_nb;        //切換南北時間
  164.         }
  165.         dx_s --;
  166.     }

  167. /***********************南北時間*********************************/
  168.         if(flag_dx_nb == 0)  
  169.         {
  170.             if(dx_s > 3)
  171.             {
  172.                 dis_smg[0] = smg_du[dx_s % 10] ;
  173.                 dis_smg[1] = smg_du[dx_s / 10] ;
  174.                 dis_smg[2] = smg_du[(dx_s-3) % 10] ;
  175.                 dis_smg[3] = smg_du[(dx_s-3) / 10] ;

  176.                 dx_red    = 1;  //滅
  177.                 dx_yellow = 1;    //滅
  178.                 nb_green  =    1;    //滅
  179.                 nb_yellow = 1;    //滅
  180.                 dx_green  =    0;    //亮
  181.                 nb_red    = 0;  //亮
  182.                 flag_5m_value = 0;   
  183.             }else if(dx_s <= 3)         //當小于3秒時  黃燈要閃了
  184.             {
  185.                 dis_smg[0] = smg_du[dx_s % 10] ;
  186.                 dis_smg[1] = smg_du[dx_s / 10] ;
  187.                 dis_smg[2] = smg_du[dx_s % 10] ;
  188.                 dis_smg[3] = smg_du[dx_s / 10] ;

  189.                 dx_red    = 1;    //滅
  190.                 dx_green  =    1;      //滅
  191.                 nb_green  =    1;      //滅
  192.                 nb_yellow = 1;      //滅
  193.                 nb_red    = 0;    //亮
  194.                 if(flag_500ms == 0)
  195.                 {
  196.                     dx_yellow = 0;//亮   
  197.                 }
  198.                 else
  199.                 {
  200.                     dx_yellow = 1;//滅   
  201.                 }
  202.             }
  203.         }
  204. /***********************東西時間*********************************/
  205.         if(flag_dx_nb == 1)  
  206.         {
  207.             if(dx_s > 3)
  208.             {
  209.                 dis_smg[2] = smg_du[dx_s % 10] ;
  210.                 dis_smg[3] = smg_du[dx_s / 10] ;
  211.                 dis_smg[0] = smg_du[(dx_s-3) % 10] ;
  212.                 dis_smg[1] = smg_du[(dx_s-3) / 10] ;

  213.                 dx_red    = 0;     //亮
  214.                 nb_green  =    0;       //亮
  215.                 nb_yellow = 1;       //滅
  216.                 dx_green  =    1;       //滅
  217.                 dx_yellow = 1;       //滅
  218.                 nb_red    = 1;     //滅
  219.                 flag_5m_value = 0;   
  220.             }else if(dx_s <= 3)         //當小于3秒時  黃燈要閃了
  221.             {
  222.                 dis_smg[0] = smg_du[dx_s % 10] ;
  223.                 dis_smg[1] = smg_du[dx_s / 10] ;
  224.                 dis_smg[2] = smg_du[dx_s % 10] ;
  225.                 dis_smg[3] = smg_du[dx_s / 10] ;

  226.                 dx_red    = 0;     //滅
  227.                 dx_green  =    1;       //滅
  228.                 dx_yellow = 1;       //滅
  229.                 nb_red    = 1;     //滅
  230.                 nb_green  =    1;       //滅
  231.                 if(flag_500ms == 0)       //黃燈閃爍
  232.                 {
  233.                     nb_yellow = 0;    //亮   
  234.                 }
  235.                 else
  236.                 {
  237.                     nb_yellow = 1;    //滅   
  238.                 }
  239.             }
  240.     }            
  241. }
  242. uchar key_can;     //按鍵值

  243. //按鍵
  244. sbit Key1=P1^6;                 //設置鍵
  245. sbit Key2=P1^7;                 //加按鍵
  246. sbit Key3=P3^2;                 //減按鍵
  247. sbit Key4=P3^3;                 //交通管制鍵
  248. //========================================================================
  249. // 函數: u8 Key_Scan()
  250. // 應用: temp=u8 Key_Scan();
  251. // 描述: 按鍵掃描并返回按下的鍵值
  252. // 參數: NONE
  253. // 返回: 按下的鍵值
  254. // 備注: 該函數帶松手檢測,按下鍵返回一次鍵值后返回0,直至第二次按鍵按下
  255. //========================================================================
  256. u8 Key_Scan()
  257. {     
  258.     static u8 key_up=1;//按鍵按松開標志
  259.     if(key_up&&(Key1==0||Key2==0||Key3==0||Key4==0))
  260.     {
  261.         delay_1ms(10);//去抖動
  262.         key_up=0;
  263.         if(Key1==0)            return 1;
  264.         else if(Key2==0)return 2;
  265.         else if(Key3==0)return 3;
  266.         else if(Key4==0)return 4;
  267.     }
  268.     else if(Key1==1&&Key2==1&&Key3==1&&Key4==1)
  269.         key_up=1;         
  270.      return 0;// 無按鍵按下
  271. }


  272. uchar flag_s;
  273. uchar menu_1;//縱橫加減標示


  274. /********************設置函數*****************/
  275. void key_with()
  276. {
  277.     if(key_can == 4)   //交通管制按鍵
  278.     {
  279.         flag_jdgz ++;
  280.         if(flag_jdgz > 5)
  281.             flag_jdgz = 0;   
  282.         if(flag_jdgz == 1)     //  全部亮紅燈
  283.         {
  284.             dx_red    = 0;  //亮
  285.             nb_red    = 0;  //亮
  286.             dx_green  =    1;    //滅
  287.             dx_yellow = 1;    //滅
  288.             nb_green  =    1;    //滅
  289.             nb_yellow = 1;    //滅            
  290.         }
  291.         if(flag_jdgz == 2)     //  東西綠燈  南北紅燈
  292.         {
  293.             dx_red    = 0;  //亮
  294.             nb_green  =    0;    //亮
  295.             dx_green  =    1;    //滅
  296.             dx_yellow = 1;    //滅
  297.             nb_red    = 1;  //滅
  298.             nb_yellow = 1;    //滅            
  299.         }
  300.         if(flag_jdgz == 3)     //  南北綠燈  東西紅燈
  301.         {
  302.             dx_green  =    0;    //亮
  303.             nb_red    = 0;  //亮
  304.             dx_red    = 1;  //滅
  305.             dx_yellow = 1;    //滅
  306.             nb_green  =    1;    //滅
  307.             nb_yellow = 1;    //滅            
  308.         }
  309.         if(flag_jdgz == 4)     //  南北綠燈  東西綠燈
  310.         {
  311.             dx_green  =    0;    //亮
  312.             nb_green  =    0;    //亮
  313.             dx_red    = 1;  //滅
  314.             dx_yellow = 1;    //滅
  315.             nb_red    = 1;  //滅
  316.             nb_yellow = 1;    //滅            
  317.         }
  318.         if(flag_jdgz == 5)     //  南北黃燈  東西黃燈
  319.         {
  320.             dx_red    = 1;  //滅
  321.             dx_green  =    1;    //滅
  322.             nb_red    = 1;  //滅
  323.             nb_green  =    1;    //滅
  324.             nb_yellow = 0;    //亮            
  325.             dx_yellow = 0;    //亮
  326.         }
  327.     }
  328.     if(key_can == 1)      //設置鍵
  329.     {
  330.         menu_1 ++;
  331.         if(menu_1 >= 3)
  332.         {
  333.             menu_1  = 0;
  334.         }
  335.     }

  336.     if(menu_1 == 1)       //設置東西的時間
  337.     {
  338.         if(key_can == 2)
  339.         {
  340.             dx_time ++ ;        //加1
  341.             if(dx_time > 99)    //時間最大值為99s
  342.                 dx_time = 99;
  343.         }
  344.         if(key_can == 3)
  345.         {
  346.             dx_time -- ;        //減1
  347.             if(dx_time <= 5)//時間最小值為5s
  348.                 dx_time = 5;
  349.         }
  350.         dis_smg[0] = smg_du[(dx_time-1) % 10] ;    //顯示為A
  351.         dis_smg[1] = smg_du[(dx_time-1) / 10] ;    //顯示為A
  352.         dis_smg[2] = DisplayOther[2] ;        //顯示東西設置的時候
  353.         dis_smg[3] = DisplayOther[2] ;   
  354.     }
  355.    
  356.     if(menu_1 == 2)       //設置南北的時間
  357.     {
  358.         if(key_can == 2)
  359.         {
  360.             nb_time ++ ;        //加1
  361.             if(nb_time > 99)//時間最大值為99s
  362.                 nb_time = 99;
  363.         }
  364.         if(key_can == 3)
  365.         {
  366.             nb_time -- ;        //減1
  367.             if(nb_time <= 5)//時間最小值為5s
  368.                 nb_time = 5;
  369.         }
  370.         dis_smg[0] = DisplayOther[2] ;    //顯示為B
  371.         dis_smg[1] = DisplayOther[2] ;    //顯示為B
  372.         dis_smg[2] = smg_du[(nb_time-1) % 10] ;        //顯示東西設置的時候
  373.         dis_smg[3] = smg_du[(nb_time-1) / 10] ;   
  374.     }
  375. }

  376. /********************************************************************
  377. * 名稱 : main()
  378. * 功能 : 實現燈的閃爍
  379. * 輸入 : 無
  380. * 輸出 : 無
  381. ***********************************************************************/
  382. void main()
  383. {
  384.     time0_init();
  385.     dx_s = nb_time;      //東西時間
  386.     while(1)
  387.     {
  388.         key_can=Key_Scan();
  389.         if(key_can )
  390.             key_with();
  391.         if((menu_1 == 0) && (flag_jdgz == 0))
  392.             jiaotongdeng_dis();
  393.         DisplayScan();   
  394.     }
  395. }  

  396. /*********************定時器0中斷服務程序************************/
  397. void time0_int() interrupt 1  
  398. {                           
  399.     static uchar value;             //定時10ms中斷一次
  400.     TL0 = 15536;                    //給定時器低位重裝初始值        65536-15536=50000us=50ms,即50ms一個中斷
  401.     TH0 = 15536 >> 8;               //給定時器高位重裝初始值
  402.     value ++;
  403.     flag_5m_value++;
  404.     if(flag_5m_value % 10 == 0)
  405.         flag_500ms = ~flag_500ms;
  406.     if(value >= 20)
  407.     {
  408.         value = 0;
  409.         flag_1s = 1;
  410.     }
  411. }
復制代碼


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

使用道具 舉報

沙發
ID:123289 發表于 2017-11-24 12:16 | 只看該作者
改完了存一下
回復

使用道具 舉報

板凳
ID:242293 發表于 2017-11-24 22:22 | 只看該作者

有道理
回復

使用道具 舉報

地板
ID:267205 發表于 2017-12-26 16:37 | 只看該作者
老哥,你這是怎么改的啊,我看了半天沒看出來,很難受
回復

使用道具 舉報

5#
ID:267231 發表于 2017-12-26 17:04 | 只看該作者
不錯不錯不錯
回復

使用道具 舉報

6#
ID:84283 發表于 2017-12-26 19:02 | 只看該作者
改完后,標志位IF 進去存下。
回復

使用道具 舉報

7#
ID:267639 發表于 2017-12-27 12:44 | 只看該作者
不錯不錯,正在研究
回復

使用道具 舉報

8#
ID:267205 發表于 2017-12-27 15:00 | 只看該作者
有沒有老哥解釋下怎么保存啊,怎么有點看不懂,難受的不行
回復

使用道具 舉報

9#
ID:464230 發表于 2019-5-2 10:10 | 只看該作者
qq1105424012 發表于 2017-12-26 19:02
改完后,標志位IF 進去存下。

怎么存啊,能解釋下嗎
回復

使用道具 舉報

10#
ID:997689 發表于 2021-12-28 11:15 | 只看該作者
網絡標號是不是標錯了啊,數碼管顯示不了


回復

使用道具 舉報

11#
ID:988078 發表于 2021-12-28 15:04 | 只看該作者
改完再次編譯,重新開始調
回復

使用道具 舉報

12#
ID:997689 發表于 2021-12-29 10:14 | 只看該作者
897024066 發表于 2021-12-28 15:04
改完再次編譯,重新開始調

數碼管十位顯示不了怎么改啊

回復

使用道具 舉報

13#
ID:997689 發表于 2021-12-29 10:19 | 只看該作者
897024066 發表于 2021-12-28 15:04
改完再次編譯,重新開始調

為啥我的十位顯示不了啊
回復

使用道具 舉報

14#
ID:161164 發表于 2021-12-29 14:22 | 只看該作者
18870442543 發表于 2021-12-29 10:19
為啥我的十位顯示不了啊

代碼沒問題


請檢查仿真/硬體接線
回復

使用道具 舉報

15#
ID:997689 發表于 2021-12-30 08:33 | 只看該作者

有根線沒連
回復

使用道具 舉報

16#
ID:997689 發表于 2021-12-31 01:10 | 只看該作者
三極管驅動模塊有啥作用啊


回復

使用道具 舉報

17#
ID:744327 發表于 2021-12-31 08:47 | 只看該作者
代碼沒有問題,可能仿真軟件有問題。
回復

使用道具 舉報

18#
ID:869404 發表于 2022-4-3 14:25 | 只看該作者
為什么我的p0口是不確定狀態
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品1区2区3区 男女啪啪高潮无遮挡免费动态 | 成人av免费在线观看 | 日本久久精| 久久久精彩视频 | 69电影网| av黄色免费 | 午夜视频一区二区 | 99精品久久 | 久久69精品久久久久久久电影好 | a毛片 | 91精品久久久久久久久久入口 | 日本成人中文字幕在线观看 | 日韩欧美三级电影 | 国产成人叼嘿视频在线观看 | 99精品国产一区二区三区 | 国产丝袜一区二区三区免费视频 | 九九视频在线观看视频6 | 本道综合精品 | 一级欧美黄色片 | 久久专区 | 亚洲精品中文字幕在线 | 精品亚洲一区二区三区 | 波多野结衣在线观看一区二区三区 | 久草网站 | 久久精品久久久久久 | 亚洲巨乳自拍在线视频 | 粉嫩高清一区二区三区 | 在线视频一区二区三区 | av大全在线 | 色五月激情五月 | 国产激情精品视频 | 国产中文字幕在线 | 国产成人在线一区二区 | 亚洲视频一区二区三区四区 | 91精品国产777在线观看 | 一区二区三区电影网 | 人人澡人人射 | 色欧美片视频在线观看 | 国产一区二区三区 | 久久久综合久久 | 国产69精品久久99不卡免费版 |