基于51单片机的温控风扇设计
//作者:何朋伟 19计科一班
//宏定义
#define uchar unsigned char
#define uint unsigned int//包含头文件
#include <reg52.h>
#include <18b20.h>
#include <stdlib.h>
#include <intrins.h>
#include <eeprom52.h>#define Imax 14000 //此处为晶振为11.0592时的取值,
#define Imin 8000 //如用其它频率的晶振时,
#define Inum1 1450 //要改变相应的取值。
#define Inum2 700
#define Inum3 3000 sbit K1=P1^1; //按键1定义
sbit K2=P1^2; //按键2定义
sbit K3=P1^3; //按键3定义sbit PWM=P3^6; //PWM输出
sbit BUZZ=P1^4; //蜂鸣器控制脚
sbit RSD=P2^0; //热释电引脚unsigned char Im[4]={0x00,0x00,0x00,0x00};
uchar displaydata[4]; //显示暂存数组
//全局变量
char f,dang,count,count1,a_a; //档位
unsigned long m,Tc;
unsigned char IrOK; //定义红外工作变量
void jisuan(); //声明计算函数
uchar mode;
char sec_b=0;
bit flag_b=0;
uint TH,TL; //上下限变量
uchar baif,suiji;
unsigned char code duan[17]={
0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0xCF,0xDA,0x98,0xDC,0x9B,0x8B}; //接线从高到低:g c dp d e b f a
//0、1、2、3、4、5、6、7、8、9、A、b、c、d、E、F的显示码 //
unsigned char code wei[8]={
//数码管的位选
0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7};uchar code zhuanhuan[4]={10,5,3,0};//转换数组
void write_eeprom()
//内部eeprom写函数
{SectorErase(0x2000);//清空SectorErase(0x2c00);//擦除ROM的倒数第二个扇区SectorErase(0x2e00);//扇区擦除第八个扇区byte_write(0x2c00,TH/256); byte_write(0x2c01,TH%256);//将下限数据保存到eeprombyte_write(0x2c02,TL/256);byte_write(0x2c03,TL%256);//将下限数据保存到eeprombyte_write(0x2c04,dang); byte_write(0x2c05,mode); byte_write(0x2060,0x01);//档位写入到eeprom}/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{mode = byte_read(0x2c05);dang = byte_read(0x2c04);TH = byte_read(0x2c00)*256+byte_read(0x2c01);TL = byte_read(0x2c02)*256+byte_read(0x2c03);a_a = byte_read(0x2060);
}/**************开机自检eeprom初始化*****************/
void init_eeprom()
{a_a = byte_read(0x2060);if(a_a != 1) //新的单片机初始单片机内问eeprom{a_a = 1;write_eeprom(); //保存数据}
}void delay(uint z) //延时函数
{uint z1,z2;for(z1=0;z1<z;z1++)for(z2=0;z2<110;z2++);
}void display() //显示函数
{uchar i;if(mode==0) //无极变速{displaydata[0]=0x00;displaydata[1]=duan[disdata[1]];displaydata[2]=duan[disdata[2]]|0x20;displaydata[3]=duan[disdata[3]];}else if(mode==1) //上限{displaydata[0]=0xce; //H 11001110displaydata[1]=duan[TH%1000/100];displaydata[2]=duan[TH%100/10]|0x20;displaydata[3]=duan[TH%10];}else if(mode==2) //下限{displaydata[0]=0x1a; //L 00111000displaydata[1]=duan[TL%1000/100];displaydata[2]=duan[TL%100/10]|0x20;displaydata[3]=duan[TL%10];}else if(mode==3) //档位0到3档{displaydata[0]=duan[dang];displaydata[1]=0x80; //01000000displaydata[2]=duan[disdata[1]];displaydata[3]=duan[disdata[2]];}else if(mode==4){displaydata[0]=0xda; //b自然风displaydata[1]=duan[disdata[1]];displaydata[2]=duan[disdata[2]]|0x20;displaydata[3]=duan[disdata[3]];}for(i=0;i<4;i++) //循环4次显示4位数码管{P2=wei[i]; //选中位P0=displaydata[i]; //送入显示码delay(3); //延时P2=0xff; //关闭位P0=0x00; //复位显示码}}
void key() //按键函数
{if(K1==0||(Im[2]==0x47&&IrOK==1)) //按键1按下或者遥控器上的按键按下{delay(5); //延时去抖if(K1==0||(Im[2]==0x47&&IrOK==1)) //再次判断按键按下{BUZZ=0;delay(20);BUZZ=1; //按键音mode++; //模式加if(mode>4) //模式加到大于4mode=0; //模式清零//Im[2]=0;IrOK=0; //变量清零write_eeprom(); //写入eeprom数据while(!K1); //按键释放}}if(K2==0||(Im[2]==0x40&&IrOK==1)) //按键2按下或者遥控器上的按键按下{delay(5);//延时去抖if(K2==0||(Im[2]==0x40&&IrOK==1))//再次判断按键按下{BUZZ=0;delay(20);BUZZ=1; //按键音if(mode==1) //模式等于1时{TH++; //上限加if(TH>999) //上限加到大于99.9度TH=TL+1; //上限等于下限加一}else if(mode==2) //模式等于2时{TL++; //下限加if(TL>=TH) //下限加到大于等于上限TL=TH-1; //下限等于上限减一}else if(mode==3) //模式等于3时{dang++; //档位加一if(dang>3) //档位大于3时dang=0; //档位清零}Im[2]=0;IrOK=0; //红外变量清零write_eeprom(); //写入eeprom数据while(!K2); //按键释放}}if(K3==0||(Im[2]==0x19&&IrOK==1))//按键3按下或者遥控器上的按键按下{delay(5);//延时去抖if(K3==0||(Im[2]==0x19&&IrOK==1))//再次判断按键按下{BUZZ=0;delay(20);BUZZ=1;//按键音if(mode==1)//模式等于1时{TH--;if(TH<=TL)TH=TL+1;//上限等于下限加一}else if(mode==2)//模式等于2时{TL--;if(TL>=TH)TL=TH-1;//上限等于下限减一}else if(mode==3)//模式等于3时{dang--;//档位减一if(dang<0)dang=3;//重新置为3}Im[2]=0;IrOK=0;//红外变量清零write_eeprom();//写入eeprom数据while(!K3); //按键释放}}
}
void jisuan() //计算函数
{if((mode==0||mode==1||mode==2)&&RSD==1) //模式0、1、2并且热释电有信号时{if(tvalue<=TL) //温度小于下限时PWM=1; //关闭输出,占空比0%else if(tvalue>=TH) //温度大于等于上限PWM=0; //打开输出,占空比100%else //其他状态时{baif=(((tvalue-TL)*50)/(TH-TL)); //占空比控制变量计算得到//计算方法:当前温度减去下限值乘以5再除以上限减下限if(count1>baif) //根据变量判断占空比大小PWM=1; //关闭风扇else PWM=0; //打开风扇}}else if(mode==3) //模式3时{if(count1>(zhuanhuan[dang]*5)) //根据档位计算出占空比PWM=0;elsePWM=1;}else if((mode==4&&flag_b==0)&&RSD==1) //模式4时,热释电有信号{suiji=rand(); //读随机函数suiji=suiji%23; //随机数计算if(suiji<10) //判断随机数是否小于10PWM=0; //输出开else //随机数大于等于10PWM=1; //输出关flag_b=1; //变量置1}if(RSD==0&&mode!=3) //热释电没有信号时PWM=1; //关闭输出
}
void main() //主函数
{ uint count; //定义变量EA=1; //打开中断总开关EX1=1; //打开外部中断1IT1=1; //下降沿有效TMOD=0x11; //定时器工作方式TR0=0; //关闭T0TH0=0;TL0=0; //初值0ET1=1; //T1允许中断TR1=1; //T1打开中断TH1=0xfc;TL1=0x18; //T1初值1msmode=0; //初始模式0TH=300;TL=200; //上下限初始值init_eeprom(); //初始化eepromread_eeprom(); //读取eeprom数据while(1) //进入循环{ jisuan(); //计算函数count++; //变量加if(count>200) //加到大于200{count=0; //清零TR1=0; //关闭定时器T1read_wendu(); //读取温度TR1=1; //打开定时器T1}jisuan(); //计算函数display(); //显示函数key(); //按键函数jisuan(); //计算函数}
}
void timer1() interrupt 3 //定时器T1工作函数
{TH1=0xfc;TL1=0x18; //重新赋初值count1++; //加1if(count1>50){count1=0;if(mode==4&&flag_b==1) //模式等于4时,变量为1{sec_b++; //变量加1if(sec_b>=8) //加到8时{sec_b=0; //清零flag_b=0; //清零}}}
}void intersvr1(void) interrupt 2 //红外工作函数
{TR0=1;Tc=TH0*256+TL0;//提取中断时间间隔时长TH0=0; TL0=0; //定时中断重新置零if((Tc>Imin)&&(Tc<Imax)){ m=0;f=1;return;} //找到启始码if(f==1){if(Tc>Inum1&&Tc<Inum3) {Im[m/8]=Im[m/8]>>1|0x80; m++; }if(Tc>Inum2&&Tc<Inum1) {Im[m/8]=Im[m/8]>>1; m++; //取码}if(m==32) {m=0; f=0;if(Im[2]==~Im[3]) {IrOK=1;TR0=0; }else{IrOK=0; //取码完成后判断读码是否正确}}//准备读下一码}
}
基于51单片机的温控风扇设计相关推荐
- 基于51单片机智能温控风扇设计PWM调速套件电子制作仿真
演示视频:http://v.youku.com/v_show/id_XMzk0OTM5Nzk5Ng==.html?spm=a2hzp.8244740.0.0 将链接复制至IE浏览器打开!!! 功能操作 ...
- S0011基于51单片机DS18B20温控风扇仿真设计
基于51单片机DS18B20温控风扇仿真设计 (仿真+原理图+源码+设计报告) 原理图:Altium Designer 仿真原版本:proteus 7.8 程序编译器:keil 4/keil 5 编程 ...
- 51单片机的温控风扇设计
一.硬件方案 系统采用51单片机作为控制平台对风扇转速进行控制.可由用户设置高.低温度值,测得温度值在高低温度之间时打开风扇弱风档,当温度升高超过所设定的温度时自动切换到大风档,当温度小于所设定的温度 ...
- 基于51单片机智能温控风扇LCD1602液晶显示红外遥控设计
视频演示地址:https://www.bilibili.com/video/BV1t5411u7qC/ 该设计是由AT89C51为主控芯片液晶LCD1602温度控制风扇档位变换PWM调速 没有按键情况 ...
- 51单片机PWM温控风扇定时关闭手动自动DS18B20测温LCD1602显示
实践制作DIY- GC0018-PWM温控风扇 一.功能说明: 基于51单片机设计-PWM温控风扇 功能介绍: 1. STC89C52单片机 +LCD1602 +多个按键+风扇+风扇驱动电路+DS18 ...
- 基于单片机的智能电子密码锁系统设计-基于51单片机酒精浓度检测仪设计-基于单片机的水缸加热温控控制系统设计-基于单片机蓝牙技术的温室监测系统设计-基于单片机智能PWM调光灯系统设计【毕设方案】
600基于单片机的智能电子密码锁系统设计-电路程序资料 本设计采用的是AT89C51单片机作为控制核心,控制外围电路工作的装置.在本次基于单片机的电子密码锁设计中,将采用AT89C51单片机作为控制核 ...
- 基于51单片机的温控系统
基于51单片机的温控系统 本文是基于STC89C52单片机的温度控制系统,主要由主控模块.显示模块及外围电路几个部分组成. 通过DS18B20检测外部温度,通过LCD1602显示,按键可调节上下限.当 ...
- matlab ds18b20 单片机,基于51单片机ds18b20温度检测————设计报告.doc
基于51单片机ds18b20温度检测----设计报告 课程名称: 微机原理课程设计 题 目: 温度检测课程设计 摘要 随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为 ...
- 基于51单片机的公交车安全智能检测系统、基于51单片机的金属探测仪控制设计、基于单片机的智能电子密码锁系统设计、基于51单片机酒精浓度检测仪设计【资料转发分享】
630基于51单片机的公交车安全智能检测系统-设计资料 本资料是基于单片机的公交车安全监测系统 具有如下功能: 1.监测环境的温度,超标报警.可以设置上下限 2.监测是否有火灾以及有毒气体,超标报警, ...
- 基于微型计算机系统的实时时钟设计,基于51单片机的实时时钟设计报告.doc
基于51单片机的实时时钟设计报告 PAGE PAGE 24 课程设计(论文)任务书 信息工程 学 院 信息工程 专 业 (2) 班 一.课程设计(论文)题目 嵌入式课程设计 二.课程设计(论文)工作自 ...
最新文章
- mysql数据库回滚日志_Mysql数据库应急响应中日志排查
- 2016年10月起微软更改了更新服务模型
- Visual formatting model(图)
- Linux——userdel删除用户不完全问题
- Jzoj4743 积木
- Jmeter之JSON Path Extractor的使用(JSON-handle下载安装和使用)
- 靠知识赚钱只是较高级的体力劳动,靠智慧赚钱才能真正的富有。
- 大数据分析入门小技巧
- web操作日志丢失_分享:有赞百亿级日志系统架构设计
- 硬盘转速和平均寻道时间
- 软件专业面试心理测试题,面试心理测试题目,据说很准
- 金蝶系统服务器名称填什么,金蝶怎样输入服务器地址
- EDG夺冠刷屏,电竞比赛离不开这个“智能网络大脑”
- html中背景色优先级,CSS背景颜色优先级
- 绝地求生 服务器无响应,绝地求生卡在登陆页面怎么办
- h5中performance.timing轻松获取网页各个数据 如dom加载时间 渲染时长 加载完触发时间...
- 如何使用数据库的SQLServer身份验证登陆
- MySQL课程设计2022 · 员工考勤管理系统
- 互联网大厂的年终奖(华为分红400亿,腾讯每人发股票 )
- JAVA的3DES加密代码转成oc_iOS之DES加密
热门文章
- 没了美国EDA软件,我们就不能做芯片?
- 三款常用IP发包工具介绍
- 单片机学习——定时器/计数器
- 微弱光信号检测MATLAB,微弱信号检测笔记(更新中... 2021年3月9日)
- SpringBoot 多语言切换
- matlab神经网络预测数据,Matlab神经网络预测复数
- 《信号与系统》(吴京)部分课后习题答案与解析——第四章(PART6)(周期信号的FT与时域抽样)
- [工具推荐] IPv4 和 IPv6 网站测速工具
- android 去掉google搜索,Android 7.1 去掉桌面上的谷歌搜索框
- android车载桌面,车载桌面Car Launcher Pro