C語言實現單片機中三種方式的流水燈

C語言實現單片機中三種方式的流水燈

流水燈,呃,高手默默的路過吧奮鬥

主要是記錄下來供自己參考參考,呵呵

這三種都是用C語言實現的。三種方式分別是:

1. 通過位操作實現

2.通過位移實現

3.通過循環位移實現

//源碼的具體實現需要配合相應硬件電路,本篇代碼基於電路如最後所示。如果有幸被參考,煩請調整硬件電路大笑

1.通過位操作。

這種辦法實現起來,代碼比較長,但是便於理解。

實現的代碼如下:

  1. #include<reg52 h="">  
  2. sbit LED0 = P1^0;  
  3. sbit LED1 = P1^1;  
  4. sbit LED2 = P1^2;  
  5. sbit LED3 = P1^3;  
  6. sbit LED4 = P1^4;  
  7. sbit LED5 = P1^5;  
  8. sbit LED6 = P1^6;  
  9. sbit LED7 = P1^7;  
  10.  void delayms(unsigned int xms) //參考郭天祥書上的延時函數  
  11. {  
  12.    unsigned int i,j;  
  13.    for(i=xms;i>0;i--)  
  14.      for(j=120;j>0;j--);//使用12MHZ晶振  
  15.  }  
  16. void main()  
  17. {  
  18.     while(1)  
  19.     {  
  20.        LED0 = 0;  
  21.        delayms(100);  
  22.       LED0 = 1;  
  23.         
  24.      LED1 = 0;  
  25.      delayms(100):  
  26.      LDE1 = 1;  
  27.        
  28.      LED2 = 0;  
  29.      delayms(100):  
  30.      LDE2 = 1;  
  31.   
  32.      LED3 = 0;  
  33.      delayms(100):  
  34.      LDE3 = 1;  
  35.   
  36.      LED4 = 0;  
  37.      delayms(100):  
  38.      LDE4 = 1;  
  39.   
  40.      LED5 = 0;  
  41.      delayms(100):  
  42.      LDE5 = 1;  
  43.   
  44.      LED6 = 0;  
  45.      delayms(100):  
  46.      LDE6 = 1;  
  47.   
  48.      LED7 = 0;  
  49.      delayms(100):  
  50.      LDE7 = 1;  
  51.    }  
  52.   
  53.  }</reg52>  
可以看到每個語句基本都是固定的。


2.通過位移實現

感謝C語言中的位運算,使通過位移操作可以實現流水燈。

具體代碼如下:

這個是僅能實現一次流水燈的效果。

  1. #include <reg52.h>  
  2. void delayms(unsigned int xms)  
  3. {  
  4.     unsigned int i,j;  
  5.     for(i=xms;i>0;i--)  
  6.          for(j=120;j>0;j--);  
  7. }  
  8. void main()  
  9. {  
  10. P1 = 0xfe;  
  11. delayms(400);  
  12. while(1)  
  13.    {  
  14.      unsigned int i;     
  15.      for(i=0;i<8;i++)  
  16.        {  
  17.             P1<<=1;  
  18.             P1=P1|0x01;  
  19.             delayms(400);  
  20.        }  
  21.     }  
  22. }  
看完視頻後,自己改成了循環的效果。主要改動就是每次循環重新賦初始值

  1. #include <reg52.h>  
  2. void delayms(unsigned int xms)  
  3. {  
  4.     unsigned int i,j;  
  5.     for(i=xms;i>0;i--)  
  6.          for(j=120;j>0;j--);  
  7. }  
  8. void main()  
  9. {  
  10. unsigned int i;  
  11. DS1302 =0;  
  12.   
  13. while(1)  
  14.    {            
  15.        P1 = 0xfe;  
  16.        delayms(400);  
  17.        i=0;  
  18.        for(;i<8;i++)  
  19.        {  
  20.             P1<<=1;  
  21.             P1=P1|0x01;  
  22.             delayms(400);  
  23.        }  
  24.          
  25.     }  
  26. }  
3.通過循環位移實現。

這種實現對我來說比較新,雖然知道循環位移,但是一直沒實現

  1. <span style="font-family:Comic Sans MS;font-size:18px;">#include <reg52.h>  
  2. void delayms (unsigned int xms);  
  3. void main()  
  4. {  
  5.     unsigned char a,b;  
  6.     P1 = 0xfe;   
  7.     while(1)  
  8.     {  
  9.         a = P1>>7;  
  10.         b = P1<<1;  
  11.         P1 = a|b;  
  12.         delayms(500);  
  13.     }  
  14. }  
  15.   
  16. void delayms(unsigned int xms)  
  17. {  
  18.     unsigned int i,j;  
  19.     for(i = xms; i > 0; i--)  
  20.         for(j = 120; j > 0; j--);  
  21. }</span>  
除了用邏輯實現,還可以直接調用函數實現。所調用的函數包含在intrins.h頭文件中。

具體代碼如下:

  1. <span style="font-family:Comic Sans MS;font-size:18px;">#include <reg52.h>  
  2. #include <intrins.h>   
  3. void delayms(unsigned int xms)  
  4. {  
  5.     unsigned int i,j;  
  6.     for(i=xms;i>0;i--)  
  7.         for(j=120;j>0;j--);  
  8. }  
  9. void main()  
  10. {  
  11.     P1 = 0xfe;  
  12.     while(1)  
  13.     {  
  14.         P1 = _crol_(P1,1);  
  15.         delayms(400);  
  16.     }  
  17. }</span>  
感覺自己實現的那個循環位移最好,呵呵。調用函數實現的最簡潔,但畢竟不是自己實現的循環函數:P

LED部分電路圖:

這個是買的別人的開發板HJ-C52.


發佈了1 篇原創文章 · 獲贊 26 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章