登錄|立即注冊|使用QQ帳號登錄
論壇 > 51單片機
發(fā)帖|
看8003|回1|收藏
樓主 ID:301474 只看他
2018-4-3 14:48
基于單片機與PWM的呼吸燈設(shè)計
本設(shè)計是基于單片機的原理與接口設(shè)計,采用單片機I/O口,加以C語言編程實現(xiàn)LED漸亮再漸暗類似人的呼吸一樣的效果。
關(guān)  鍵  詞
AT89C51,PWM(脈寬調(diào)制)
100403cp0chvvllyfiu2lc.gif
一、設(shè)計要求:
呼吸燈就是讓LED燈的閃爍像呼吸一樣,時呼時吸,時亮?xí)r暗,利用LED的余輝和人眼的暫留效應(yīng),看上去和人的呼吸一樣。
二、設(shè)計原理:
用C語言編程實現(xiàn)PWM(脈寬調(diào)制)輸出驅(qū)動LED,逐漸增加PWM的占空比從而實現(xiàn)LED模擬呼吸的過程,即漸亮再漸暗再漸亮再漸暗……如此往復(fù),再利用LED的余輝和人眼的暫留效應(yīng),看上去就和人的呼吸一樣。
三、整體方案設(shè)計
8個LED按照順序逐個實現(xiàn)呼吸效果。加以其他閃爍花樣增加更炫彩的效果。
四、實驗元件及器材
(1)元件: LED(發(fā)光二極管)                            8個
                               1KΩ電阻                                                                                   8個
                               1nf電容                                                                                   2個
                               晶振                                                                                                 1個
                               AT89C51芯片                                                       1個
(2)器件:Atmega128開發(fā)板                                          1塊
                                                        計算機                                                                                   1臺
  • 硬件原理
  • 主電路:8個LED分別連接AT89C51的P1口,使用共陽方式,并加以1kΩ的電阻接入電源。
主電路
(2)時鐘電路:外部時鐘方式是使用外部振蕩脈沖信號。
  • 軟件設(shè)計及系統(tǒng)仿真調(diào)試
  • 調(diào)試方法:利用keil軟件進行C語言程序編寫及調(diào)試,利用Proteus仿真軟件進行仿真實驗。
  • 調(diào)試過程所遇問題:

1、由于呼吸燈的程序在仿真軟件Proteus中實現(xiàn)的效果不明顯,很難辨別LED是否具有呼吸的效果。所以邊用keil調(diào)試程序邊用STC燒寫軟件直接寫入開發(fā)板,從而很明顯看出LED是否具有呼吸效果;

2、程序運行時,出現(xiàn)LED閃爍過快,由于人眼的暫留效應(yīng)看似LED全部一直亮著,經(jīng)調(diào)試,修改延時時間,實現(xiàn)呼吸效果。
七、結(jié)論與心得
在本次設(shè)計中,C語言程序在開發(fā)板中得以實現(xiàn)應(yīng)有的功能。在調(diào)試過程中,發(fā)現(xiàn)很多問題都是由于不細(xì)心導(dǎo)致的,因此在以后的設(shè)計方案中,要集中精力,莫粗心大意。再者就是知識量的不足,雖然是一個小小的設(shè)計方案,但是查閱了很多相關(guān)資料,在日后,要多充足自己的知識量,保證C程序的編寫質(zhì)量。
參考文獻
[1]郭天祥,《新概念51單片機C語言教程》,電子工業(yè)出版社,2009年1月
[2]徐愛鈞,《單片機高級語言C51應(yīng)用程序設(shè)計》,電子工業(yè)出版社,2000年5月
附件A:呼吸燈設(shè)計電路圖


附件B:C語言程序清單

代碼:

  1. #include<reg51.h>
  2. /*-----------定義單片機引腳-----*/
  3. sbit LED0=P1^0;
  4. sbit LED1=P1^1;
  5. sbit LED2=P1^2;
  6. sbit LED3=P1^3;
  7. sbit LED4=P1^4;
  8. sbit LED5=P1^5;
  9. sbit LED6=P1^6;
  10. sbit LED7=P1^7;

  11. void Delay(unsigned int t); //函數(shù)聲明
  12. unsigned int z,y;
  13. void main (void)//主函數(shù)
  14. {
  15.               unsigned int CYCLE=500,PWM_LOW=0;//定義周期并賦值
  16.               while (1)         //主循環(huán)
  17.               {

  18. /*--------整排LED燈呼吸---------*/
  19.                             P1=0x00;
  20.                             Delay(500);                                                                                                                 //加延時,可以看到熄滅的過程(下面程序同理)
  21.                             for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)                 //PWM_LOW表示低
  22.                                           {
  23.                                                         P1=0x00;                                                               
  24.                                                         Delay(PWM_LOW);
  25.                                                         P1=0xff;
  26.                                                         Delay(CYCLE-PWM_LOW);
  27.                                           }
  28.                             P1=0xff;                                                                                                                                          
  29.                             for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)               //與逐漸變亮相反的過程
  30.                                           {
  31.                                                            P1=0x00;                                                                                                  //點亮LED
  32.                                                            Delay(PWM_LOW);
  33.                                                            P1=0xff;                                                                                                  //熄滅LED
  34.                                                           Delay(CYCLE-PWM_LOW);                                                        //主循環(huán)中添加其他需要一直工作的程序,延時長度,600次循環(huán)中從599減至1
  35.                                           }


  36. /*--------第一顆LED燈呼吸---------*/
  37.                             LED0=1;
  38.                             Delay(500);        
  39.                             for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)               
  40.                                           {
  41.                                                         LED0=0;                                                                                          
  42.                                                         Delay(PWM_LOW);
  43.                                                         LED0=1;                                                                                          
  44.                                                         Delay(CYCLE-PWM_LOW);
  45.                                           }
  46.                             LED0=0;                                                                                                                                          
  47.                             for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)   
  48.                                           {
  49.                                                            LED0=0;
  50.                                                            Delay(PWM_LOW);
  51.                                                            LED0=1;
  52.                                                           Delay(CYCLE-PWM_LOW);                                            
  53.                                           }


  54. /*--------第二顆LED燈呼吸----------*/
  55.                             LED1=1;
  56.                             Delay(500);      
  57.                             for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)   
  58.                                           {
  59.                                                            LED1=0;
  60.                                                            Delay(PWM_LOW);
  61.                                                            LED1=1;      
  62.                                                           Delay(CYCLE-PWM_LOW);
  63.                                           }
  64.                             LED1=0;
  65.                             for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
  66.                                           {
  67.                                                         LED1=0;
  68.                                                         Delay(PWM_LOW);
  69.                                                         LED1=1;
  70.                                                         Delay(CYCLE-PWM_LOW);
  71.                                           }


  72. /*--------第三顆LED燈呼吸----------*/
  73.                             LED2=1;
  74.                             Delay(500);
  75.                             for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
  76.                                           {
  77.                                                            LED2=0;      
  78.                                                            Delay(PWM_LOW);
  79.                                                         LED2=1;   
  80.                                                         Delay(CYCLE-PWM_LOW);                  
  81.                                           }
  82.                             LED2=0;
  83.                             for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
  84.                                           {
  85.                                                            LED2=0;
  86.                                                            Delay(PWM_LOW);
  87.                                                            LED2=1;
  88.                                                 Delay(CYCLE-PWM_LOW);
  89.                                              }

  90. /*--------第四顆LED燈呼吸----------*/
  91.                             LED3=1;
  92.                             Delay(500);
  93.                             for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
  94.                                           {
  95.                                                           LED3=0;      
  96.                                                         Delay(PWM_LOW);
  97.                                                         LED3=1;
  98.                                               Delay(CYCLE-PWM_LOW);
  99.                                           }
  100.                             LED3=0;
  101.                             for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
  102.                                           {
  103.                                                            LED3=0;
  104.                                                            Delay(PWM_LOW);
  105.                                                            LED3=1;
  106.                                                 Delay(CYCLE-PWM_LOW);
  107.                                 }

  108. /*--------第五顆LED燈呼吸----------*/
  109.                             LED4=1;
  110.                             Delay(500);   
  111.                             for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
  112.                                           {
  113.                                                            LED4=0;      
  114.                                                            Delay(PWM_LOW);
  115.                                                            LED4=1;      
  116.                                                 Delay(CYCLE-PWM_LOW);
  117.                                 }
  118.                             LED4=0;
  119.                             for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
  120.                                           {
  121.                                                            LED4=0;
  122.                                                            Delay(PWM_LOW);
  123.                                                            LED4=1;
  124.                                                 Delay(CYCLE-PWM_LOW);
  125.                                 }

  126. /*--------第六顆LED燈呼吸----------*/
  127.                             LED5=1;
  128.                             Delay(500);     
  129.                             for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
  130.                                           {
  131.                                                            LED5=0;     
  132.                                                            Delay(PWM_LOW);
  133.                                                            LED5=1;      
  134.                                                 Delay(CYCLE-PWM_LOW);
  135.                                 }
  136.                             LED5=0;
  137.                             for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
  138.                                           {
  139.                                                            LED5=0;
  140.                                                            Delay(PWM_LOW);
  141.                                                            LED5=1;
  142.                                                 Delay(CYCLE-PWM_LOW);
  143.                                 }

  144. /*--------第七顆LED燈呼吸----------*/
  145.                             LED6=1;
  146.                             Delay(500);     
  147.                             for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
  148.                                           {
  149.                                                            LED6=0;  
  150.                                                            Delay(PWM_LOW);
  151.                                                            LED6=1;      
  152.                                                 Delay(CYCLE-PWM_LOW);
  153.                                 }
  154.                             LED6=0;
  155.                             for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
  156.                                           {
  157.                                                            LED6=0;
  158.                                                            Delay(PWM_LOW);
  159.                                                            LED6=1;
  160.                                                 Delay(CYCLE-PWM_LOW);
  161.                                 }

  162. /*--------第八顆LED燈呼吸----------*/
  163.                             LED7=1;
  164.                             Delay(500);   
  165.                             for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
  166.                                           {
  167.                                                            LED7=0;   
  168.                                                            Delay(PWM_LOW);
  169.                                                            LED7=1;
  170.                                                 Delay(CYCLE-PWM_LOW);
  171.                                 }
  172.                             LED7=0;
  173.                             for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
  174.                                           {
  175. ……………………

  176. …………限于本文篇幅 余下代碼請從51黑下載附件…………


完整的Word格式文檔51黑下載地址:
呼吸燈報告.doc (339 KB)
(下載次數(shù): 43, 2018-4-3 14:48 上傳)

下載積分: 黑幣 -5




沙發(fā) ID:301752 只看他
2018-4-11 17:29
用不了,沒啥用,連線之后一點反應(yīng)都沒

51黑電子論壇

Powered by Discuz! X3.1

首頁|標(biāo)準(zhǔn)版|觸屏版|電腦版