基于STC51单片机的风扇

发布者:SereneSerenity最新更新时间:2024-04-15 来源: elecfans关键字:STC51  单片机  风扇 手机看文章 扫描二维码
随时随地手机看文章

设计要求:#

利用直流电机充当风扇


键盘可以调整风扇的转速


设计概述:#

按照设计要求,风扇的开与关需要用到独立键盘,转速控制需要用到PWM技术。所需要的单片机芯片为STC89C52,所用的硬件工具是由华清远见开发的基于STC89C52的智能小车。该小车配备所需要的独立按键模块和直流电机模块,独立按键模块由P3口控制,直流电机模块由P1口控制。STC89C52是一种低功耗,高性能的8位微控制器,是加强版的80C51单片机,但是与80C51单片机一样不具备PWM硬件模块,所以我们需要自己写一个程序来软件模拟PWM方波。


PWM是一种方波,可以实现数字信号控制模拟电路,它有两个重要参数周期或频率,占空比。占空比 = 高电平时间/周期,最小为0%,最大为100%,通过调整占空比来控制高电平,低电平所占比例,进而控制直流电机的转速。


直流电机驱动:该电机使能端P1.4口为高电平有效,使用直流电机前必须将电机使能端置1;电机的正向转动和反向转动由P1.2口和P1.3口的电平状态共同决定,电机正转P1.2口置1,P1.3口置0,电机反转P1.2口置0,P1.3口置1。

独立键盘驱动:独立键盘有s2,s3,s4,s5四个按键,分别由P3.0口,P3.1口,P3.2口,P3.3口控制,将按键按下后P3口导通为低电平。当给P3.0口1置0时表示按键按下,置1时表示按键松开,其他三个按键也是如此。

风扇档速:风扇的档速这里设两档。

源代码:#

#include




sbit key_s2 = P3^0;//风扇一档转速按钮


sbit key_s3 = P3^1;//风扇二挡转速按钮


sbit key_s4 = P3^2;//关闭风扇按钮




sbit EN1 = P1^4;//为1 电机使能


sbit IN1 = P1^2;//为1 电机正转


sbit IN2 = P1^3;//为1 电机反转






/*风扇一档转速*/


void fan_motor1()


{


   //定义一个变量pwm,通过对pwm的累加来调控PWM的占空比


   unsigned int pwm;


   while(1)


   {


      for(pwm = 0;pwm <= 1000;pwm++)


  {


  if(pwm == 700)


{


EN1 = 1;


            IN1 = 1;


            IN2 = 0;


}


else if(pwm == 1000)


{


    EN1 = 0;


}


  }


       //按下其中一个键后跳出循环,然后执行与其对应的代码部分


  if(key_s3 == 0 || key_s4 == 0)


      break;


   }




}




/*风扇二挡转速函数*/


void fan_motor2()


{


   EN1 = 1;


   IN1 = 1;


   IN2 = 0;


}




/*关闭风扇函数*/


void fan_motor_stop()


{


   EN1 = 0;


}




/*延时函数*/


void delays(unsigned int ms)


{


   //如果不加volatile,则编译器会自动忽略无循环体的for循环


   volatile unsigned int i,j;


   for(i=ms;i>0;i--)


   {


      for(j=110;j>0;j--)


   ;


   }


}




/*定时器中断服务函数*/


void timer0 () interrupt 1


{


if(key_s2 == 0)//检测按键是否按下


{


   delays(10);//延时去抖动


   if(key_s2 == 0)//确认按键已经按下


   {    


      fan_motor1();//开一档


   }


}


else if(key_s3 == 0)


{


   delays(10);


   if(key_s3 == 0)


   {    


      fan_motor2();//开二挡


   }    


   while(!key_s3);//等待按键释放


}


else if(key_s4 == 0)


{


   delays(10);


   if(key_s4 == 0)


   {    


      fan_motor_stop();//关闭风扇


   }


   while(!key_s4);


}


}




void main()


{


   TMOD |= 1<<1;   //通过移位运算符'<<'来改变位的状态


   TMOD &= ~(1<<0); //置定时器/计数器的工作方式为方式2




   TMOD &= ~(1<<2);   //选择定时工作方式


   TMOD &= ~(1<<3);   //门控位:由运行控制位TR启动定时器




   TL0 = 156;    


   TH0 = 156;    //100us进入一次中断,0.1毫秒




   ET0 = 1;   //定时器0开中断


   EA = 1;    //CPU开中断


   TR0 = 1;   //启动


   while(1) //防止程序跑飞


        ;


}

小车部分模块原理图:#

image
image


关键字:STC51  单片机  风扇 引用地址:基于STC51单片机的风扇

上一篇:基于STC51单片机的计数器
下一篇:C51_单片机开发_XBYTE的使用

推荐阅读最新更新时间:2024-11-06 22:46

四维图新MCU芯片正在全力做市场推广
四维图新日前接受机构调研时表示,公司AMP芯片已经在2017年底量产出货,2018年是上量阶段;MCU芯片正在全力做市场推广,力争尽快实现量产。
[半导体设计/制造]
基于MCU的家庭防盗报警系统
   从实际出发,设计一种家庭用、与电话线连接、操作简单、工作稳定可靠的远程智能防盗报警装置。当人们外出时,往往希望实施自动监测报警以使家庭财产免受损失。针对这一需求,研制出了一系列自动报警系统,如门磁式、触摸式和红外线监测自动报警系统等。本文将介绍的远程智能防盗报警装置,可同时监视多个重要点(如门、窗等),发现盗情及时拨叫号码,并能利用普通电话线进行告警信号呼叫,其性能稳定可靠,实用性、适用性强,且具有较高的灵活性。   基本工作原理   如图1所示,远程智能防盗报警装置由信号检测电路、复位电路、电话号码输入电路、89C51单片机、语音电路、模拟摘机挂机电路、DTMF编码发送电路、铃流信号检测电路和忙音信号检测电路等构
[应用]
STC1256xxAD 系列 MCU 的 A/D 转换程序
// ADC DEMO_56xx 程序演示 STC1256xxAD 系列 MCU 的 A/D 转换功能。时钟 18.432MHz // 转换结果以 16 进制形式输出到串行口,可以用串行口调试程序观察输出结果。 //--------------------------------------------------------------------- #include STC12C5620AD.H //--------------------------------------------------------------------- typedef unsigned char INT8U; typedef un
[单片机]
PIC16C5X单片机数据存储器
程序计数器f2(PC) 程序计数器给出片内2048x12的ROM地址,不同的型号程序计数器与它们的两层堆栈为9-11位寛,如表1所示。 表1 程序计数器PC与堆栈大小 型号 PC宽度/位 堆栈宽度/位 PIC16C54/55 9 9 PIC16C56 10 10 PIC16C57 11 11 系统复位后,PC为全 1 ,程序执行每一条指令PC自动加 1 ,除非程序指令本身改变PC的内容(例如程序跳转,中断服务等),下面的指令将改变PC的值。 . GOTO 指令:允许直接装入程序
[单片机]
基于SPCE061A单片机汇编语实现的流水灯
//====================================================================// //名称:流水灯 //功能描述:发光二极管单向循环点亮。SPCE061A单片机汇编语言实现 //===================================================================// .include SPCE061A.inc //包含头文件 .ram .var R_LEDControl //定义LED控制变量 .var R_DaleyControl /
[单片机]
单片机小白学步(14) 点亮第一个LED的程序分析
本篇我们将分析上一篇所写的程序代码。未来学习单片机的大部分精力,我们也将放在程序代码的编写上。但是不用担心,我会非常详细的介绍每个程序的编写思路和各种注意事项等。 之前我们写的程序如下: #include sbit LED = P1^0; void main() { LED = 0; while(1); } 头文件 第一行包含头文件,这个和C语言编写HelloWorld时的#include 一样。头文件reg52.h中定义了单片机的一些寄存器,如P0~P3等。至于什么是寄存器,将在原理篇中具体介绍,现在我们只要把它想象成C语言中常说的内存就好了。有兴趣的读者可以右击reg52.h打开头文件看一看。 C51
[单片机]
采用AVR Flash微控制器的电动车窗防夹系统
     汽车上可自动关闭的电动车窗或车门设备潜藏着卡死,挤压以及可能伤人的危险。它们必须能够反向移动以防止马达所施加的力超出正常限制。这种特性意味着必须持续监视速度、电流和玻璃的位置。        由于成本和简化的原因,本文所描述的系统使用普通的带有霍尔效应传感器的刷式马达。基于速度和扭矩导数的检测算法已通过健壮性和容错性的验证。该算法可用于所有带有A/D 转换器和通过变化引发中断的I/O 口的AtmelAVR Flash 微控制器。本文描述的是基本原理,Atmel网站上的应用笔记有关于实现的详细描述。        现代汽车中的电动设备        目前,在高端客用汽车中电子组件和系统在成本中已占20%以上。增
[嵌入式]
如何排查GD32 MCU复位是由哪个复位源导致的?
上期为大家讲解了GD32 MCU复位包括电源复位和系统复位,其中系统复位还包括独立看门狗复位、内核软复位、窗口看门狗复位等,在一个GD32系统中,如果莫名其妙产生了MCU复位,如何排查具体是由哪个复位源导致的呢? GD32 MCU贴心的为大家提供了一个查看复位源的寄存器,如下图所示,该寄存器的bit26-bit31显示各种复位状态,其中LPRSTF表示发生过低功耗复位、WWDGTRSTF表示发上过窗口看门狗复位、FWDGTRSTF表示发生过独立看门狗复位、SWRSTF表示发生过系统软复位、PORRSTF表示发生过POR电源复位、EPRSTF表示发生过NRST引脚复位,这几个状态标志位为只读标志位,如果希望清除复位标志,可以通过
[单片机]
如何排查GD32 <font color='red'>MCU</font>复位是由哪个复位源导致的?
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved