標(biāo)題: 51單片機pwm電風(fēng)扇DC設(shè)計 [打印本頁]

作者: jwx00781    時間: 2020-1-13 11:12
標(biāo)題: 51單片機pwm電風(fēng)扇DC設(shè)計
這是本人的單片機接口技術(shù)課程設(shè)計
題目如下:
通過89C51單片機控制家用電風(fēng)扇的運行。
1)電風(fēng)扇有三種風(fēng)速選擇:高、中、低;
2)運轉(zhuǎn)時間設(shè)定;
3)三種運行形式:
  (1)正常:電扇連續(xù)運轉(zhuǎn);
  (2)自然:電扇以運轉(zhuǎn)4秒、間斷4秒的方式工作,模擬產(chǎn)生自然風(fēng);
  (3)睡眠:指風(fēng)扇運轉(zhuǎn)斷8秒,間斷8秒,產(chǎn)生輕柔的微風(fēng)。
匯編語言和C語言代碼實現(xiàn)功能相同
以下是C語言代碼:
PROTEUS 仿真圖如圖所示:
完整工程在附件里面:
  1. #include<reg51.h>

  2. #define uint unsigned int

  3. #define uchar unsigned char


  4. sbit Motor=P2^0;// P2.0輸出pwm控制電機


  5. uchar time; // 定義占空比的變量
  6. uint time1;

  7. uchar speed;//定義速度變量
  8. uint worktime;//定義持續(xù)時間變量

  9. bit flag;


  10. void Delay_ms(unsigned int k)                         
  11. {
  12.         uchar i;
  13.         while(k--)
  14.         {
  15.                 for(i=0;i<125;i++);       
  16.         }                                                                                             
  17. }


  18. void key() //獨立按鍵程序
  19. {
  20.         static uchar key_new;
  21.         P1 |= 0xff;                     //對應(yīng)的按鍵IO口輸出為1
  22.         if((P1 & 0x3f) != 0x3f)                //按鍵按下
  23.         {
  24.                 Delay_ms(5);                    //按鍵消抖動

  25.                 if(((P1 & 0xff) != 0xff) && (key_new == 1))
  26.                 {                                                //確認是按鍵按下
  27.                         key_new = 0;                                                        //防止重復(fù)讀取按鍵

  28.                                                 if((~P1)&0x01){//速度調(diào)節(jié)
  29.                                                         speed=100;
  30.                                                         P0=~0x07;//全亮
  31.                                                         }                               
  32.                                                 if((~P1)&0x02){
  33.                                                         speed=50;
  34.                                                         P0=~0x03;//亮兩個
  35.                                                        
  36.                                                 }
  37.                                                 if((~P1)&0x04){
  38.                                                         speed=30;
  39.                                                         P0=~0x01;//亮一個
  40.                                                         }
  41.                                                
  42.                                                 if((~P1)&0x08){
  43.                                                         flag=1;
  44.                                                         ET0=0;//關(guān)閉定時器0中斷         
  45.                                                         TR0=0;//關(guān)閉定時器0
  46.                                                         P3=0x88;
  47.                                                         }

  48.                                                 if((~P1)&0x10){
  49.                                                         worktime=4000;//it means 4 sec

  50.                                                         ET0=1;//開定時器0中斷         
  51.                                                         TR0=1;//啟動定時器0
  52.                                                         P3=0x83;
  53.                                                        
  54.                                                         }


  55.                                                 if((~P1)&0x20){
  56.                                                         worktime=8000;//2 sec
  57.                                                         ET0=1;//開定時器0中斷         
  58.                                                         TR0=1;//啟動定時器0
  59.                                                         P3=0xc6;
  60.                                                         }


  61.                 }                       
  62.         }
  63.         else
  64.                 key_new = 1;      
  65. }



  66. void main(){



  67.                         TMOD=0x11;//定時器0工作方式1,定時器1工作方式1
  68.          
  69.                         TH1=0xff;//(65536-10)/256;//賦初值定時
  70.                          
  71.                         TL1=0xf6;//(65536-10)%256;//0.01ms

  72.                         TH0=0xfc;//(65536-1000)/256;//賦初值定時/用于定工作時間
  73.                          
  74.                         TL0=0x18;//(65536-1000)%256;//1ms
  75.                          
  76.                         EA=1;//開總中斷
  77.                          
  78.                         ET1=1;//開定時器1中斷         
  79.                         TR1=1;//啟動定時器1
  80.                        
  81.                         P0=0xff;//初始化按鍵
  82.                        
  83.                         speed=50;
  84.                         P0=0xa4;
  85.                         flag=1;
  86.                         P3=0x88;
  87.                
  88.                          
  89.                         while(1){
  90.                                 key();               
  91.                         }       
  92. }


  93. void tim1() interrupt 3

  94. {

  95.         TR1=0;//賦初值時,關(guān)閉定時器
  96.          
  97.         TH1=0xff;//(65536-10)/256;//賦初值定時
  98.          
  99.         TL1=0xf6;//(65536-10)%256;//0.01ms
  100.          
  101.         TR1=1;//打開定時器
  102.          
  103.          
  104.        
  105.          
  106.         if(time>=100) //1khz,方波頻率
  107.          
  108.         time=0;

  109.          
  110.                 if((time<=speed)&&flag) //占空比%30,可改
  111.                  
  112.                 Motor=1;
  113.                  
  114.                 else
  115.        
  116.                 Motor=0;
  117.                 time++;
  118. }


  119. void tim0() interrupt 1
  120. {
  121.                 TR0=0;//關(guān)閉定時器0

  122.                 TH0=0xfc;//(65536-1000)/256;//賦初值定時/用于定工作時間                 

  123.                 TL0=0x18;//(65536-1000)%256;//1ms

  124.                 TR0=1;//啟動定時器1
  125.                
  126.                 if(time1>=worktime) {
  127.                 time1=0;
  128.                 flag=~flag;

  129.                                                 }

  130.                 time1++;
  131. }

復(fù)制代碼
以下是匯編語言代碼:


  1.         ORG  0000H

  2.         lJMP MAIN

  3.         ORG  000BH

  4.         AJMP tim0

  5.         ORG  0001BH

  6.         AJMP tim1

  7.         ORG  0030H

  8.         Motor  bit  P2.0

  9.         HighSpeed bit P1.0
  10.         MediumSpeed bit P1.1
  11.         LowSpeed bit P1.2

  12.         NormalMode bit P1.3
  13.         NatureMode bit P1.4
  14.         SleepMode bit P1.5
  15.        
  16.        

  17.         speed EQU 31H

  18.         worktime EQU  32h

  19.         flag EQU  33h

  20. MAIN:                       
  21.                 MOV   SP,#60H;

  22.                 MOV   TMOD,#11H
  23.                
  24.                 MOV   TH1,#0FFH;time for frequency
  25.                 MOV   TL1,#0F6H
  26.                        
  27.                 MOV   TH0,#3CH;time for work basic 50ms(65536-50000)
  28.                 MOV   TL0,#0B0H


  29.                 MOV   P1,#0FFH; set io in mode
  30.                
  31.                 SETB  EA;
  32.                 SETB  ET1;
  33.                 SETB  TR1;
  34.                
  35.                 MOV  speed,#50;preset the mode
  36.                 MOV  flag,#0FFH

  37.                 mov  R0,#0
  38.                 mov  R1,#0

  39.                
  40.                 MOV P0,#04H;display the mode
  41.                 MOV P3,#088H

  42. LOOP0:
  43.             
  44.                 MOV R2,P1

  45.                 CJNE R2,#0FFH,processkey

  46.                 SJMP LOOP0       


  47. processkey:;read the key
  48.                 call DELAY

  49.                 MOV R2,P1
  50.                 CJNE R2,#0FFH,PROCESS;judge again

  51.                 SJMP LOOP0;if not go back to the main programm

  52. PROCESS:
  53.                 JB HighSpeed,K0

  54.                 MOV speed,#100
  55.                 MOV P0,#0H;all the led light up
  56.                
  57.         K0:        JB MediumSpeed,K1

  58.                 MOV speed,#50
  59.                 MOV P0,#04H;light up two lights
  60.        
  61.                
  62.         K1:       
  63.                 JB LowSpeed,K2;

  64.                 MOV speed,#20
  65.                 MOV P0,#06H;light up one light
  66.                
  67.         K2:       
  68.                 JB  NormalMode,K3
  69.                 MOV flag,#0ffH
  70.                 CLR ET0
  71.                 CLR TR0
  72.                 MOV P3,#88H
  73.                
  74.         K3:       
  75.                 JB  NatureMode,K4
  76.                 MOV worktime,#20;two seconds
  77.                 SETB ET0
  78.                 SETB TR0
  79.                 MOV P3,#83H

  80.                
  81.         K4:        JB SleepMode,LOOP0
  82.                 MOV worktime,#40;fout seconds
  83.                 SETB ET0
  84.                 SETB TR0
  85.                 MOV P3,#0C6H
  86.                
  87.                 SJMP LOOP0



  88. tim0:   ;generate the work time  
  89.         clr   tr0
  90.         MOV   TH0,#3CH;time for work basic 50ms(65536-50000)
  91.     MOV   TL0,#0B0H
  92.         setb  tr0
  93.        
  94.         PUSH ACC
  95.         MOV A, worktime
  96.        
  97.         SUBB A,R0
  98.                 jnc loop1
  99.                 mov R0,#0       
  100.        
  101.                 mov A,flag;
  102.                 cpl A
  103.                 mov flag,A
  104.                
  105.         loop1:
  106.                 inc R0;
  107.         POP ACC
  108.                 RETI
  109.                
  110.                
  111.                
  112. tim1:
  113.         clr   tr1
  114.         MOV   TH1,#0xff;time for pwm basic 0.01ms(65536-10)
  115.     MOV   TL1,#0xf6
  116.         setb  tr1
  117.        
  118.         PUSH ACC       
  119.         mov A,#100
  120.         subb A,R1
  121.         jnc loop2
  122.         mov R1,#0;       
  123. loop2:
  124.         mov A,flag;
  125.         jz loop3
  126.                 mov A,speed;
  127.                 subb A,R1;
  128.                 jnc loop4
  129. loop3:
  130.         clr Motor
  131.         SJMP OUT1       
  132. loop4:
  133.         setb Motor;
  134. OUT1:

  135.         POP ACC
  136.         inc R1
  137.         RETI

  138. DELAY:
  139.     MOV  R7,#10
  140. DE: MOV  R6,#10
  141.     DJNZ R6,$
  142.         DJNZ R7,DE
  143.         RET
  144.                
  145.         END
復(fù)制代碼



15家用電風(fēng)扇.zip

105.76 KB, 下載次數(shù): 155, 下載積分: 黑幣 -5

完整工程


作者: jwx00781    時間: 2020-1-13 11:15
仿真圖如下

1.png (81.76 KB, 下載次數(shù): 140)

1.png

作者: yrx0203    時間: 2020-1-14 13:51
請問一定要用l298n嗎
作者: LZTWW    時間: 2020-6-23 08:45
謝謝分享
作者: 感受感受不上班    時間: 2020-6-25 23:03
感覺有點摸不到頭緒,里面程序邏輯有點問題嗷
作者: Jeff_BlindCat    時間: 2020-6-26 15:15
路過幫頂,分享精神無限。
作者: rrrrwwop    時間: 2020-6-26 20:51
emmmmm這個里面沒啥,太失望了
作者: caokaiczl    時間: 2023-5-4 22:16
想知道如果使用單片機匯編語言,使用Keil uVision2軟件和protues一起使用該怎么做這個




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