深圳市航顺芯片技术研发有限公司
直播中

郭中

10年用户 1003经验值
擅长:存储技术
私信 关注
[问答]

模拟风扇控制系统有哪几种工作模式

模拟风扇控制系统主要由哪几部分组成?
模拟风扇控制系统有哪几种工作模式?

回帖(1)

陈思远

2021-10-25 16:38:13
  1、试题
  (1)功能简述
  “模拟风扇控制系统”能够模拟电风扇工作,通过按键控制风扇的转动速度和定时时间,数码管实时显示风扇的工作模式,动态倒计时显示剩余的定时时间,系统主要由数码管显示、单片机最小系统、按键输入和电机控制保护电路组成,系统框图如图 1 所示:
  
  (2)设计任务及要求
  1、工作模式
  设备具有“睡眠风”、“自然风”和“常风”三种工作模式可以通过按键切换,通过单片机 P34 引脚输出脉宽调制信号控制电机运行状态,信号频率为 1KHz。
  1.1 “睡眠风”模式下,对应 PWM 占空比为 20%;
  1.2 “自然风”模式下,对应 PWM 占空比为 30%;
  1.3 “常风”模式下,对应 PWM 占空比为 70%;
  2、数码管显示
  数码管实时显示设备当前工作模式和剩余工作时间(倒计时),如图 2 所示。
  
  “睡眠风”状态下,对应数码管显示数值为 1,自然风模式下,显示数值为 2,常风模式下,显示数值为 3。
  3.、按键控制
  使用 S4、S5、S6、S7 四个按键完成按键控制功能。
  3.1 按键 S4 定义为工作模式切换按键,每次按下 S4,设备循环切换三种工作模式。工作过程如下:
  
  3.2 按键 S5 定义为“定时按键”每次按下 S5,定时时间增加 1 分钟,设备的剩余工作时间重置为当前定时时间,重新开始倒计时,工作过程如下:
  
  3.3 按键 S6 定义为“停止”按键,按下 S6 按键,立即清零剩余工作时间,PWM信号停止输出,直到通过 S5 重新设置定时时间。
  3.4 按键 S7 定义为“室温”按键,按下 S7,通过数码管显示当前室温,数码管显示格式如图 3 所示,再次按下 S7,返回图 2 所示的工作模式和剩余工作时间显示界面,如此往复。
  
  室温测量、显示功能不应影响设备正在执行的 PWM 信号输出、停止、模式切换和计时等功能。
  4、LED 指示灯
  “睡眠风”模式下,L1 点亮,“自然风”模式下 L2 点亮,“常风”模式下 L3 点亮;按下停止按键或倒计时结束时,LED 全部熄灭。
  5、电路原理图设计
  电机过热检测及驱动电路设计:假定设备使用的是 12V 直流电机,过热检测传感器输出为小电压信号 Vs,设计过热检测及电机驱动电路,当检测到 Vs 信号幅度大于 10mV 时,电机停止转动,简述电路的工作原理与设计思路,并绘制出电路原理图。
  2、试题分析
  
  对于DS18B20芯片,温度传感器来说,只需知道温度读取函数:
  unsigned char Get_wendu(){
  unsigned char high,low;
  unsigned char temp;
  Init_DS18B20();
  Write_DS18B20(0XCC);
  Write_DS18B20(0X44);
  Delay_OneWire(200);
  Init_DS18B20();
  Write_DS18B20(0XCC);
  Write_DS18B20(0XBE);
  low=Read_DS18B20();
  high=Read_DS18B20();
  temp=(low》》4)|(high《《4);
  return temp;
  }
  按键、数码管、LED灯都是省赛必考项,对于他们之间的连接不再多说。
  
  PWM控制占空比,通过P34口输出。信号频率为1000HZ=0.001s=1ms=1000us。
  可以通过定时器0每次定时100us,总计10次;
  如果PWM占空比为20%,说明在一个PWM周期内,P34口高电平占20%,其余同理。
  如果发现数码管用显示的字符用眼睛可以看出闪动时,说明延时过长,可以修改下延时函数。通过程序发现:
  void display12(uchar f1,uchar f2){
  P2=0XC0;P0=0X01;P2=0XFF;P0=tab[f1];
  delay();
  P2=0XC0;P0=0X02;P2=0XFF;P0=tab[f2];
  delay();
  }
  void delay(){
  uchar i,j;
  for(i=10;i》0;i--)
  for(j=200;j》0;j--);
  }
  这个延时对于数码管的显示比较理想。
  3、实现代码
  onewire.c
  #include “onewire.h”
  //单总线延时函数
  void Delay_OneWire(unsigned int t)
  {
  t=12*t;
  while(t--);
  }
  //DS18B20芯片初始化
  bit Init_DS18B20(void)
  {
  bit initflag = 0;
  DQ = 1;
  Delay_OneWire(12);
  DQ = 0;
  Delay_OneWire(80);
  DQ = 1;
  Delay_OneWire(10);
  initflag = DQ;
  Delay_OneWire(5);
  return initflag;
  }
  //通过单总线向DS18B20写一个字节
  void Write_DS18B20(unsigned char dat)
  {
  unsigned char i;
  for(i=0;i《8;i++)
  {
  DQ = 0;
  DQ = dat&0x01;
  Delay_OneWire(5);
  DQ = 1;
  dat 》》= 1;
  }
  Delay_OneWire(5);
  }
  //从DS18B20读取一个字节
  unsigned char Read_DS18B20(void)
  {
  unsigned char i;
  unsigned char dat;
  for(i=0;i《8;i++)
  {
  DQ = 0;
  dat 》》= 1;
  DQ = 1;
  if(DQ)
  {
  dat |= 0x80;
  }
  Delay_OneWire(5);
  }
  return dat;
  }
  unsigned char Get_wendu(){
  unsigned char high,low;
  unsigned char temp;
  Init_DS18B20();
  Write_DS18B20(0XCC);
  Write_DS18B20(0X44);
  Delay_OneWire(200);
  Init_DS18B20();
  Write_DS18B20(0XCC);
  Write_DS18B20(0XBE);
  low=Read_DS18B20();
  high=Read_DS18B20();
  temp=(low》》4)|(high《《4);
  return temp;
  }
  onewire.h
  #ifndef _ONEWIRE_H
  #define _ONEWIRE_H
  #include “stc15f2k60s2.h”
  #define OW_SKIP_ROM 0xcc
  #define DS18B20_CONVERT 0x44
  #define DS18B20_READ 0xbe
  //IC引脚定义
  ***it DQ = P1^4;
  //函数声明
  void Delay_OneWire(unsigned int t);
  void Write_DS18B20(unsigned char dat);
  bit Init_DS18B20(void);
  unsigned char Read_DS18B20(void);
  unsigned char Get_wendu();
  #endif
  text.c
  #include《stc15f2k60s2.h》
  #include “onewire.h”
  #define uchar unsigned char
  #define uint unsigned int
  uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF,0XC6};
  uchar f1,f2,f3,f4,f5,f6,f7,f8;
  uchar moshi=1;
  uchar wendu;
  uchar dingshi=0;
  uchar flag=0;
  uchar pwm_zhankongbi=0;
  uchar n=0;
  uint count=0;
  void delayms(uchar ms);
  void display12(uchar f1,uchar f2);
  void display34(uchar f3,uchar f4);
  void display56(uchar f5,uchar f6);
  void display78(uchar f7,uchar f8);
  void allinit();
  void Time0_init();
  void keyscan();
  void delay();
  void main(){
  allinit();
  Time0_init();
  f1=11;f2=11;f3=11;f4=11;f5=11;f6=11;f7=11;f8=11;
  while(1)
  {
  wendu=Get_wendu();
  if(flag==0)
  {
  f1=10;f2=moshi;f3=10;f4=11;f5=0;f6=dingshi/100;f7=dingshi%100/10;f8=dingshi%10;
  }
  else if(flag==1)
  {
  f1=10;f2=4;f3=10;f4=11;f5=11;f6=wendu/10;f7=wendu%10;f8=12;
  }
  if(dingshi》0)
  {
  if(moshi==1)
  {
  P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
  P00=0;
  }
  else if(moshi==2)
  {
  P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
  P01=0;
  }
  else if(moshi==3)
  {
  P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
  P02=0;
  }
  }
  else if(dingshi==0)
  {
  P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
  P0=0XFF;
  }
  keyscan();
  display12(f1,f2);
  display34(f3,f4);
  display56(f5,f6);
  display78(f7,f8);
  }
  }
  void keyscan(){
  if(P33==0) //切换转换模式
  {
  delayms(5);
  if(P33==0)
  {
  if(moshi==1)
  {
  moshi=2;
  }
  else if(moshi==2)
  {
  moshi=3;
  }
  else if(moshi==3)
  {
  moshi=1;
  }
  }
  while(!P33);
  }
  if(P32==0) //定时设置
  {
  delayms(5);
  if(P32==0)
  {
  if(dingshi==0)
  {
  dingshi=60;
  }
  else if(dingshi《=60)
  {
  dingshi=120;
  }
  else if(dingshi《=120)
  {
  dingshi=0;
  }
  }
  while(!P32);
  }
  if(P31==0) //清零剩余工作时间
  {
  delayms(5);
  if(P31==0)
  {
  dingshi=0;
  }
  while(!P31);
  }
  if(P30==0) //温度和剩余工作时间转换
  {
  delayms(5);
  if(P30==0)
  {
  if(flag==0)
  {
  flag=1;
  }
  else if(flag==1)
  {
  flag=0;
  }
  }
  while(!P30);
  }
  }
  //1000hz=0.001s=1ms=1000us,每次定时100us。
  void Time0_init(){
  TMOD=0X01;
  TH0=(65536-100)/256;
  TL0=(65536-100)%256;
  TR0=1;
  ET0=1;
  EA=1;
  }
  void Time0_service() interrupt 1
  {
  TH0=(65536-100)/256;
  TL0=(65536-100)%256;
  n++;
  count++;
  pwm_zhankongbi++;
  if(count==10000)
  {
  count=0;
  if(dingshi》0)
  {
  dingshi--;
  }
  }
  if(dingshi》0)
  {
  if(moshi==1)
  {
  if(pwm_zhankongbi==3)
  {
  P34=1;
  }
  else
  {
  P34=0;
  }
  }
  else if(moshi==2)
  {
  if(pwm_zhankongbi==4)
  {
  P34=1;
  }
  else
  {
  P34=0;
  }
  }
  else if(moshi==3)
  {
  if(pwm_zhankongbi==8)
  {
  P34=1;
  }
  else
  {
  P34=0;
  }
  }
  }
  if(n==11)
  {
  n=0;
  pwm_zhankongbi=0;
  }
  }
  void delayms(uchar ms){
  uchar i,j,k;
  for(k=ms;k》0;k--){
  i=12;
  j=169;
  do
  {
  while(j--);
  }
  while(i--);
  }
  }
  void allinit(){
  P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
  P2=0XC0;P0=0XFF;P2=0XFF;P0=0XFF;
  }
  void display12(uchar f1,uchar f2){
  P2=0XC0;P0=0X01;P2=0XFF;P0=tab[f1];
  delay();
  P2=0XC0;P0=0X02;P2=0XFF;P0=tab[f2];
  delay();
  }
  void display34(uchar f3,uchar f4){
  P2=0XC0;P0=0X04;P2=0XFF;P0=tab[f3];
  delay();
  P2=0XC0;P0=0X08;P2=0XFF;P0=tab[f4];
  delay();
  }
  void display56(uchar f5,uchar f6){
  P2=0XC0;P0=0X10;P2=0XFF;P0=tab[f5];
  delay();
  P2=0XC0;P0=0X20;P2=0XFF;P0=tab[f6];
  delay();
  }
  void display78(uchar f7,uchar f8){
  P2=0XC0;P0=0X40;P2=0XFF;P0=tab[f7];
  delay();
  P2=0XC0;P0=0X80;P2=0XFF;P0=tab[f8];
  delay();
  }
  void delay(){
  uchar i,j;
  for(i=10;i》0;i--)
  for(j=200;j》0;j--);
  }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分