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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2840|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機(jī)按鍵控制LED流水程序問(wèn)題 非常感謝

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
大家好:
   我寫一個(gè) 2種LED流水的方式,想通過(guò)K1按鍵進(jìn)行切換,怎么按下一次,能開(kāi)啟一種模式,按下K1第二次,怎么也不能開(kāi)啟,幫忙看下,謝謝!



單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. uchar temp,num,aa,flag;

  6. sbit D1=P1^0;
  7. sbit D2=P1^1;
  8. sbit D3=P1^2;
  9. sbit D4=P1^3;
  10. sbit D5=P1^4;
  11. sbit D6=P1^5;
  12. sbit D7=P1^6;
  13. sbit D8=P1^7;

  14. void delay(uint z);
  15. void LEDInit();
  16. void LED1_Stys();
  17. void LED2_Stys();
  18. void key1();

  19. void delay1(uchar z)
  20. {
  21.         uchar x,y;
  22.         for(x=z;x>0;x--)
  23.         for(y=110;y>0;y--);        
  24. }

  25. sbit K1          = P3^0;        //啟動(dòng)模式1
  26. sbit K2   =        P3^1;        //啟動(dòng)模式2


  27. void LEDInit()
  28. {

  29.         TMOD=0x01;  //確定定時(shí)器0 的工作方式為1,16 位定時(shí)器
  30.         TH0=0XFC;   //設(shè)定1000us(1MS) 的定時(shí)器初值 65536-1000=64536 ,64536 的16進(jìn)制為FC18
  31.         TL0=0X18;     
  32.         EA=1;//開(kāi)總中斷
  33.         ET0=1;//開(kāi)啟定時(shí)器0中斷
  34.         TR0=1;//啟動(dòng)定時(shí)器0
  35. }

  36. void LED1_Stys()
  37. {
  38.        LEDInit();
  39.         while(1)
  40.         {}
  41. }

  42. void LED2_Stys()
  43. {
  44.     temp=0x01;
  45.     P1=temp;        
  46.     while(1)
  47.     {
  48.     delay(1000);
  49.     temp=_crol_(temp,1);
  50.     P1=temp;
  51.     }
  52. }

  53. void key1()   
  54. {

  55. if(K1==0)
  56.         {
  57.                 delay1(5);         
  58.                 if(K1==0)        
  59.                 {
  60.                         num++;            
  61.                         while(!K1);               
  62.                         if(num==1)         
  63.                         {
  64.                         LED1_Stys();
  65.                         }
  66.             
  67.             if(num==2)         
  68.                         {
  69.             num=0;
  70.                         LED2_Stys();
  71.                         }

  72.         }
  73.     }

  74. }
  75.    



  76. void main()
  77. {
  78. key1();  
  79. }   
  80.   
  81.    


  82. void Time0() interrupt 1
  83. {
  84.     uint i;
  85.     TH0=0XFC;   //設(shè)定1000us 的定時(shí)器初值 65536-1000=64536 ,64536 的16進(jìn)制為FC18
  86.     TL0=0X18;
  87.     i++;
  88.     if(i==40)  // 40*1000us=40000us=40MS
  89.     {
  90.      D1=~D1;
  91.     }
  92.    
  93.     if(i==80)  
  94.     {
  95.      D2=~D2;
  96.     }
  97.    
  98.     if(i==120)  
  99.     {
  100.      D3=~D3;
  101.     }
  102.    
  103.     if(i==160)  
  104.     {
  105.      D4=~D4;
  106.     }
  107.    
  108.     if(i==200)  
  109.     {
  110.      D5=~D5;
  111.     }
  112.    
  113.     if(i==240)  
  114.     {
  115.      D6=~D6;
  116.     }
  117.    
  118.     if(i==280)  
  119.     {
  120.      D7=~D7;
  121.     }
  122.    
  123.     if(i==320)
  124.     {   
  125.      D8=~D8;
  126.     }
  127.    
  128.     if(i==360)
  129.     {
  130.      i=0;
  131.      P1=~P1;
  132.     }
  133.       
  134. }

  135. void  delay(uint z)
  136. {
  137.                 uint x,y;
  138.                 for(x=z;x>0;x--);
  139.                 for(y=35000;y>0;y--);        
  140. }

  141. // 用按鍵 切換 2 種LED 流水模式
復(fù)制代碼
LED-2種流水-獨(dú)立按鍵切換.rar (14.23 KB, 下載次數(shù): 10)

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

使用道具 舉報(bào)

沙發(fā)
ID:849376 發(fā)表于 2021-8-13 16:44 | 只看該作者
用定時(shí)器中斷比較好實(shí)現(xiàn),延時(shí)就別用了
回復(fù)

使用道具 舉報(bào)

板凳
ID:849376 發(fā)表于 2021-8-13 16:46 | 只看該作者
你的main里面沒(méi)有定時(shí)器初始化和while
回復(fù)

使用道具 舉報(bào)

地板
ID:849376 發(fā)表于 2021-8-13 16:48 | 只看該作者
LED1_Stys()和LED2_Stys()里面的while也會(huì)卡死在里面
回復(fù)

使用道具 舉報(bào)

5#
ID:161164 發(fā)表于 2021-8-13 17:45 | 只看該作者
本帖最后由 lkc8210 于 2021-8-13 22:47 編輯

好可怕的代碼
四點(diǎn)建議
1.不要在大循環(huán)以外的其它地方用while(1)
2.就算很有需要,也要加離開(kāi)條件
3.編程盡量模組化,一個(gè)函數(shù)負(fù)責(zé)按鍵掃描,另一個(gè)函數(shù)負(fù)責(zé)流水燈控制,他們之間用標(biāo)致位交流
4.中斷內(nèi)不要干太多情,有機(jī)會(huì)超時(shí)

現(xiàn)在最簡(jiǎn)單的改法,就是建議2:
  1. void LED1_Stys()
  2. {
  3.     LEDInit();
  4.     while(1)
  5.     {
  6.         if(!K1) {
  7.             TR0=0;
  8.             P1=0xFF;
  9.             break;
  10.         }
  11.     }
  12. }

  13. void LED2_Stys()
  14. {
  15.     temp=0x01;
  16.     P1=temp;
  17.     while(1)
  18.     {
  19.         delay(1000);
  20.         temp=_crol_(temp,1);
  21.         P1=temp;
  22.         if(!K1) {
  23.             P1=0xFF;
  24.             break;
  25.         }
  26.     }
  27. }
  28. void main()
  29. {
  30.         while (1)
  31.   {
  32.     key1();
  33.   }
  34. }
復(fù)制代碼







回復(fù)

使用道具 舉報(bào)

6#
ID:332444 發(fā)表于 2021-8-13 17:55 | 只看該作者
其一8個(gè)流水燈不用逐一定義,只有單一使用才逐一定義如定義的2個(gè)按鍵是應(yīng)該的,其二中斷代碼盡量少否則日后也這樣寫估計(jì)被人看到不會(huì)用這樣的人.其三有了定時(shí)器可不用死循環(huán)延時(shí)否則日后也這樣寫估計(jì)被人看到會(huì)被人議論的.
回復(fù)

使用道具 舉報(bào)

7#
ID:877522 發(fā)表于 2021-8-13 18:10 | 只看該作者
lkc8210 發(fā)表于 2021-8-13 17:45
好可怕的代碼
四點(diǎn)建議
1.不要在大循環(huán)以外的其它地方用while(1)

謝謝 你的建議  能否幫忙修改一下  感謝
回復(fù)

使用道具 舉報(bào)

8#
ID:877522 發(fā)表于 2021-8-13 20:55 來(lái)自手機(jī) | 只看該作者
Letitia 發(fā)表于 2021-8-13 16:48
LED1_Stys()和LED2_Stys()里面的while也會(huì)卡死在里面

是的,只能進(jìn)去一個(gè),不能切換,能否指點(diǎn)一下怎么修改
回復(fù)

使用道具 舉報(bào)

9#
ID:914633 發(fā)表于 2021-8-13 21:20 | 只看該作者
1.LED1_Stys()和LED2_Stys()這兩個(gè)隨便進(jìn)一個(gè)就一直在while循環(huán)里了出不來(lái)了,按鍵不起作用了
2.你第一種狀態(tài)是用定時(shí)器中斷做的吧,切換至第二個(gè)狀態(tài)時(shí),你沒(méi)關(guān)定時(shí)器中斷,第一個(gè)狀態(tài)仍然會(huì)存在,第二個(gè)狀態(tài)會(huì)受影響
回復(fù)

使用道具 舉報(bào)

10#
ID:877522 發(fā)表于 2021-8-16 08:23 | 只看該作者
lkc8210 發(fā)表于 2021-8-13 17:45
好可怕的代碼
四點(diǎn)建議
1.不要在大循環(huán)以外的其它地方用while(1)

非常感謝 !用你寫的代碼可以了正常切換了
回復(fù)

使用道具 舉報(bào)

11#
ID:877522 發(fā)表于 2021-8-16 08:24 | 只看該作者
hoodieboi 發(fā)表于 2021-8-13 21:20
1.LED1_Stys()和LED2_Stys()這兩個(gè)隨便進(jìn)一個(gè)就一直在while循環(huán)里了出不來(lái)了,按鍵不起作用了
2.你第一種 ...

是的,謝謝提醒,
回復(fù)

使用道具 舉報(bào)

12#
ID:877522 發(fā)表于 2021-8-16 12:30 | 只看該作者
lkc8210 發(fā)表于 2021-8-13 17:45
好可怕的代碼
四點(diǎn)建議
1.不要在大循環(huán)以外的其它地方用while(1)

您好,現(xiàn)在可以切換了,按下K1 先是LED 按照方式1 流水,然后按下K1 按照方式2流水,然后在按下還是按照方式1 流水,可是這時(shí)的流水跟第一次不一致了,效果有差異,我在LED 初始化增加了 P1=0xff  還是一樣的,能否幫忙在分析一下,非常感謝!代碼如下



  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. uchar temp,num,aa,flag;


  6. sbit D1=P1^0;
  7. sbit D2=P1^1;
  8. sbit D3=P1^2;
  9. sbit D4=P1^3;
  10. sbit D5=P1^4;
  11. sbit D6=P1^5;
  12. sbit D7=P1^6;
  13. sbit D8=P1^7;

  14. void delay(uint z);

  15. void LEDInit();
  16. void LED_2Init();
  17. void LED1_Stys();
  18. void LED2_Stys();
  19. void key1();

  20. void delay1(uchar z)
  21. {
  22.         uchar x,y;
  23.         for(x=z;x>0;x--)
  24.         for(y=110;y>0;y--);       
  25. }

  26. sbit K1          = P3^0;        //啟動(dòng)模式1
  27. sbit K2   =        P3^1;        //啟動(dòng)模式2

  28. void LEDInit()    //內(nèi)部定時(shí)器0初始化程序  (序號(hào)1)
  29. {

  30.         TMOD=0x01;  //確定定時(shí)器0 的工作方式為1,16 位定時(shí)器
  31.         TH0=0XFC;   //設(shè)定1000us(1MS) 的定時(shí)器初值 65536-1000=64536 ,64536 的16進(jìn)制為FC18
  32.         TL0=0X18;     
  33.         EA=1;//開(kāi)總中斷
  34.         ET0=1;//開(kāi)啟定時(shí)器0中斷
  35.         TR0=1;//啟動(dòng)定時(shí)器0
  36.         P1=0xFF;
  37. }

  38. void LED1_Stys()     //LED 流水方式1
  39. {
  40.    
  41.        LEDInit();
  42.         while(1)
  43.         {
  44.         if(!K1)
  45.         {
  46.             TR0=0;
  47.             P1=0xFF;
  48.             break;
  49.         }
  50.         }
  51.         
  52.      
  53. }

  54. void LED2_Stys()   //LED 流水方式2
  55. {
  56.    
  57.     temp=0x01;
  58.     P1=temp;        
  59.     while(1)
  60.     {
  61.     delay(1000);
  62.     temp=_crol_(temp,1);
  63.     P1=temp;
  64.       
  65.         if(!K1)
  66.         {
  67.        P1=0xff;
  68.        break;
  69.         }
  70.          
  71.       
  72.     }
  73. }

  74. void key1()   
  75. {

  76.    if(K1==0)
  77.         {
  78.                 delay1(5);          
  79.                 if(K1==0)       
  80.                 {
  81.                         num++;             
  82.                         while(!K1);               
  83.                         if(num==1)         
  84.                         {
  85.                         LED1_Stys();
  86.                         }
  87.             
  88.             if(num==2)         
  89.                         {
  90.             num=0;
  91.                         LED2_Stys();
  92.                         }
  93.    
  94.         }
  95.     }

  96.       
  97.      
  98. }
  99.    

  100. void main()
  101. {
  102. while(1)
  103. {
  104. key1();
  105. }   
  106. }   
  107.   
  108.   
  109. void Time0() interrupt 1
  110. {
  111.     uint i;
  112.     TH0=0XFC;   //設(shè)定1000us 的定時(shí)器初值 65536-1000=64536 ,64536 的16進(jìn)制為FC18
  113.     TL0=0X18;
  114.     i++;
  115.     if(i==40)  // 40*1000us=40000us=40MS
  116.     {
  117.      D1=~D1;
  118.     }
  119.    
  120.     if(i==80)  
  121.     {
  122.      D2=~D2;
  123.     }
  124.    
  125.     if(i==120)  
  126.     {
  127.      D3=~D3;
  128.     }
  129.    
  130.     if(i==160)  
  131.     {
  132.      D4=~D4;
  133.     }
  134.    
  135.     if(i==200)  
  136.     {
  137.      D5=~D5;
  138.     }
  139.    
  140.     if(i==240)  
  141.     {
  142.      D6=~D6;
  143.     }
  144.    
  145.     if(i==280)  
  146.     {
  147.      D7=~D7;
  148.     }
  149.    
  150.     if(i==320)
  151.     {   
  152.      D8=~D8;
  153.     }
  154.    
  155.     if(i==360)
  156.     {
  157.      i=0;
  158.      P1=~P1;
  159.     }
  160.       
  161. }

  162. void  delay(uint z)
  163. {
  164.                 uint x,y;
  165.                 for(x=z;x>0;x--);
  166.                 for(y=35000;y>0;y--);       
  167. }

  168. // 用按鍵 切換 2 種LED 流水模式

  169. //void LED_2Init()  //外部定時(shí)器0初始化程序 (序號(hào)0)

  170. //{
  171. //EA=1;
  172. //EX0=1;
  173. //IT0=1;
  174. //}
  175. //  


  176. // void Time1() interrupt 0
  177. // {
  178. // LED2_Stys();
  179. //
  180. // }
  181. //     
  182. //LED_2Init();
  183. //while(1);
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

13#
ID:161164 發(fā)表于 2021-8-16 13:53 | 只看該作者
SGW2020 發(fā)表于 2021-8-16 12:30
您好,現(xiàn)在可以切換了,按下K1 先是LED 按照方式1 流水,然后按下K1 按照方式2流水,然后在按下還是按照 ...

把中斷內(nèi)的uint i; 移到頂
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. uchar temp,num,aa,flag;

  6.     uint i;//<<<<<<<<<<<<<<<<<<<<<<<<<<
復(fù)制代碼

在LED 初始化里再加i=0;
  1. void LEDInit()    //內(nèi)部定時(shí)器0初始化程序  (序號(hào)1)
  2. {

  3.     TMOD=0x01;  //確定定時(shí)器0 的工作方式為1,16 位定時(shí)器
  4.     TH0=0XFC;   //設(shè)定1000us(1MS) 的定時(shí)器初值 65536-1000=64536 ,64536 的16進(jìn)制為FC18
  5.     TL0=0X18;
  6.     EA=1;//開(kāi)總中斷
  7.     ET0=1;//開(kāi)啟定時(shí)器0中斷
  8.     TR0=1;//啟動(dòng)定時(shí)器0
  9.     P1=0xFF;
  10.                 i=0;//<<<<<<<<<<<<<<<<<<<<<
  11. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

14#
ID:877522 發(fā)表于 2021-8-17 08:30 | 只看該作者
lkc8210 發(fā)表于 2021-8-16 13:53
把中斷內(nèi)的uint i; 移到頂

在LED 初始化里再加i=0;

好的 ,非常感謝,我把中斷里面的 非 改為,P1=0XFe 之類的 也可以了,謝謝!
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. uchar temp,num,aa,flag;

  6. void delay(uint z);

  7. void LEDInit();
  8. void LED_2Init();
  9. void LED1_Stys();
  10. void LED2_Stys();
  11. void key1();

  12. void delay1(uchar z)
  13. {
  14.         uchar x,y;
  15.         for(x=z;x>0;x--)
  16.         for(y=110;y>0;y--);       
  17. }

  18. sbit K1          = P3^0;        //啟動(dòng)模式1
  19. sbit K2   =        P3^1;        //啟動(dòng)模式2

  20. void LEDInit()    //內(nèi)部定時(shí)器0初始化程序  (序號(hào)1)
  21. {

  22.         TMOD=0x01;  //確定定時(shí)器0 的工作方式為1,16 位定時(shí)器
  23.         TH0=0XFC;   //設(shè)定1000us(1MS) 的定時(shí)器初值 65536-1000=64536 ,64536 的16進(jìn)制為FC18
  24.         TL0=0X18;     
  25.         EA=1;//開(kāi)總中斷
  26.         ET0=1;//開(kāi)啟定時(shí)器0中斷
  27.         TR0=1;//啟動(dòng)定時(shí)器0

  28. }

  29. void LED1_Stys()     //LED 流水方式1 通過(guò)定時(shí)器中斷 流水
  30. {
  31.    
  32.        LEDInit();
  33.         while(1)
  34.         {
  35.         if(!K1)
  36.         {
  37.             TR0=0;
  38.             P1=0xFF;
  39.             break;
  40.         }
  41.         }
  42.         
  43.      
  44. }

  45. void LED2_Stys()   //LED 流水方式2  通過(guò)程序定時(shí)逐一流水
  46. {
  47.    
  48.     temp=0x01;
  49.     P1=temp;        
  50.     while(1)
  51.     {
  52.     delay(1000);
  53.     temp=_crol_(temp,1);
  54.     P1=temp;
  55.       
  56.         if(!K1)
  57.         {
  58.        P1=0xff;
  59.        break;
  60.         }
  61.          
  62.       
  63.     }
  64. }

  65. void key1()     // 鍵盤 掃描程序
  66. {

  67.    if(K1==0)
  68.         {
  69.                 delay1(5);          
  70.                 if(K1==0)       
  71.                 {
  72.                         num++;             
  73.                         while(!K1);               
  74.                         if(num==1)         
  75.                         {
  76.                         LED1_Stys();
  77.                         }
  78.             
  79.             if(num==2)         
  80.                         {         
  81.                         LED2_Stys();
  82.                         }
  83.            if(num==3)         
  84.                         {
  85.             num=0;
  86.                         P1=0X0;
  87.                         }
  88.                        
  89.         }
  90.     }
  91.    
  92. }


  93. void main()    // 主程序
  94. {
  95. while(1)
  96. {
  97. key1();
  98. }   
  99. }   
  100.   
  101.   
  102. void Time0() interrupt 1   //內(nèi)部定時(shí)器0 (序號(hào)為1)
  103. {
  104.     uint i;
  105.     TH0=0XFC;   //設(shè)定1000us 的定時(shí)器初值 65536-1000=64536 ,64536 的16進(jìn)制為FC18
  106.     TL0=0X18;
  107.     i++;
  108.     if(i==40)  // 40*1000us=40000us=40MS
  109.     {
  110.      P1=0xfe;
  111.     }
  112.    
  113.     if(i==80)  
  114.     {
  115.      P1=0xfc;
  116.     }
  117.    
  118.     if(i==120)  
  119.     {
  120.      P1=0xf8;
  121.     }
  122.    
  123.     if(i==160)  
  124.     {
  125.      P1=0xf0;
  126.     }
  127.    
  128.     if(i==200)  
  129.     {
  130.      P1=0xe0;
  131.     }
  132.    
  133.     if(i==240)  
  134.     {
  135.      P1=0xc0;
  136.     }
  137.    
  138.     if(i==280)  
  139.     {
  140.      P1=0x80;
  141.     }
  142.    
  143.     if(i==320)
  144.     {   
  145.      P1=0x00;
  146.     }
  147.    
  148.     if(i==360)
  149.     {
  150.      i=0;
  151.      P1=0xff;
  152.     }
  153.       
  154. }

  155. void  delay(uint z)
  156. {
  157.                 uint x,y;
  158.                 for(x=z;x>0;x--);
  159.                 for(y=35000;y>0;y--);       
  160. }

  161. // 用按鍵 切換 2 種LED 流水模式 程序OK


復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

15#
ID:401564 發(fā)表于 2021-8-17 16:53 | 只看該作者
我感覺(jué)一個(gè)流水燈程序是沒(méi)有必要問(wèn)的
有學(xué)習(xí)板也沒(méi)有必要仿真的
我學(xué)了十來(lái)天的C語(yǔ)言,到現(xiàn)在,BMP280,ADXL345,OLED(SH1106驅(qū)動(dòng))都寫過(guò)了,暫時(shí)還沒(méi)有遇上一定要發(fā)帖問(wèn)的問(wèn)題,自己解決問(wèn)題可能用的時(shí)間久一點(diǎn),但印象更加深刻
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久久国产一级毛片高清网站 | 国内精品视频 | 精品久久国产视频 | 精品国产乱码久久久久久丨区2区 | 一区二区免费在线观看 | www.国产日本 | 91精品久久久 | 久久久av | 日本aa毛片a级毛片免费观看 | 欧美一区二区三区在线看 | 91亚洲免费 | 自拍偷拍精品 | 国产成人精品福利 | 日韩在线观看中文字幕 | 女朋友的闺蜜3韩国三级 | 三级视频在线观看 | 狠狠影院| 久久免费小视频 | 日韩福利 | 日韩av在线一区 | 青娱乐自拍 | 97精品超碰一区二区三区 | 尹人av | 97视频在线观看免费 | 婷婷激情在线 | 欧美一级免费片 | 免费在线看a | 中文字幕在线观看一区 | 欧美激情久久久 | 精品国产高清一区二区三区 | 亚洲巨乳自拍在线视频 | 蜜桃在线一区二区三区 | 超碰精品在线观看 | 亚洲综合在线播放 | 国产精品美女久久久久久免费 | 日韩视频免费在线 | 亚洲网站在线观看 | 在线日韩精品视频 | 国产精品久久久久久一区二区三区 | 成人国产精品久久久 | 国产欧美一区二区精品忘忧草 |