欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機交通燈按鍵時間修改不管用 [打印本頁]

作者: 菊次郎的夏天    時間: 2017-11-23 22:56
標題: 單片機交通燈按鍵時間修改不管用
能進入修改模式加減修改時間,可是一旦退出修改模式后,數碼管還是按照修改前的時間倒計時,時間根本就沒變的,請問需要修改哪里呢?謝謝

單片機源程序:
  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. }
復制代碼



作者: yzwzfyz    時間: 2017-11-24 12:16
改完了存一下
作者: 菊次郎的夏天    時間: 2017-11-24 22:22
yzwzfyz 發表于 2017-11-24 12:16
改完了存一下

有道理
作者: 獅子及    時間: 2017-12-26 16:37
老哥,你這是怎么改的啊,我看了半天沒看出來,很難受
作者: fuyongqing    時間: 2017-12-26 17:04
不錯不錯不錯
作者: qq1105424012    時間: 2017-12-26 19:02
改完后,標志位IF 進去存下。
作者: ooyole    時間: 2017-12-27 12:44
不錯不錯,正在研究
作者: 獅子及    時間: 2017-12-27 15:00
有沒有老哥解釋下怎么保存啊,怎么有點看不懂,難受的不行
作者: 九幽幻辰    時間: 2019-5-2 10:10
qq1105424012 發表于 2017-12-26 19:02
改完后,標志位IF 進去存下。

怎么存啊,能解釋下嗎
作者: 18870442543    時間: 2021-12-28 11:15
網絡標號是不是標錯了啊,數碼管顯示不了



作者: 897024066    時間: 2021-12-28 15:04
改完再次編譯,重新開始調
作者: 18870442543    時間: 2021-12-29 10:14
897024066 發表于 2021-12-28 15:04
改完再次編譯,重新開始調

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


作者: 18870442543    時間: 2021-12-29 10:19
897024066 發表于 2021-12-28 15:04
改完再次編譯,重新開始調

為啥我的十位顯示不了啊

作者: lkc8210    時間: 2021-12-29 14:22
18870442543 發表于 2021-12-29 10:19
為啥我的十位顯示不了啊

代碼沒問題


請檢查仿真/硬體接線

作者: 18870442543    時間: 2021-12-30 08:33
lkc8210 發表于 2021-12-29 14:22
代碼沒問題

有根線沒連
作者: 18870442543    時間: 2021-12-31 01:10
三極管驅動模塊有啥作用啊



作者: 烈火    時間: 2021-12-31 08:47
代碼沒有問題,可能仿真軟件有問題。
作者: 11122x    時間: 2022-4-3 14:25
為什么我的p0口是不確定狀態





歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1