找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5647|回复: 7
打印 上一主题 下一主题
收起左侧

51单片机pwm电风扇DC设计

  [复制链接]
跳转到指定楼层
楼主
这是本人的单片机接口技术课程设计
题目如下:
通过89C51单片机控制家用电风扇的运行。
1)电风扇有三种风速选择:高、中、低;
2)运转时间设定;
3)三种运行形式:
  (1)正常:电扇连续运转;
  (2)自然:电扇以运转4秒、间断4秒的方式工作,模拟产生自然风;
  (3)睡眠:指风扇运转断8秒,间断8秒,产生轻柔的微风。
汇编语言和C语言代码实现功能相同
以下是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;//定义持续时间变量

  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;                     //对应的按键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;                                                        //防止重复读取按键

  28.                                                 if((~P1)&0x01){//速度调节
  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;//关闭定时器0中断         
  45.                                                         TR0=0;//关闭定时器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;//赋初值时,关闭定时器
  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;//关闭定时器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. }

复制代码
以下是汇编语言代码:


  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
复制代码



15家用电风扇.zip

105.76 KB, 下载次数: 145, 下载积分: 黑币 -5

完整工程

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏9 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:403791 发表于 2020-1-13 11:15 | 只看该作者
仿真图如下

1.png (81.76 KB, 下载次数: 101)

1.png
回复

使用道具 举报

板凳
ID:684871 发表于 2020-1-14 13:51 来自手机 | 只看该作者
请问一定要用l298n吗
回复

使用道具 举报

地板
ID:783281 发表于 2020-6-23 08:45 | 只看该作者
谢谢分享
回复

使用道具 举报

5#
ID:635522 发表于 2020-6-25 23:03 | 只看该作者
感觉有点摸不到头绪,里面程序逻辑有点问题嗷
回复

使用道具 举报

6#
ID:495287 发表于 2020-6-26 15:15 | 只看该作者
路过帮顶,分享精神无限。
回复

使用道具 举报

7#
ID:768612 发表于 2020-6-26 20:51 | 只看该作者
emmmmm这个里面没啥,太失望了
回复

使用道具 举报

8#
ID:1075366 发表于 2023-5-4 22:16 | 只看该作者
想知道如果使用单片机汇编语言,使用Keil uVision2软件和protues一起使用该怎么做这个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表