//作者:何朋伟 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单片机的温控风扇设计相关推荐

  1. 基于51单片机智能温控风扇设计PWM调速套件电子制作仿真

    演示视频:http://v.youku.com/v_show/id_XMzk0OTM5Nzk5Ng==.html?spm=a2hzp.8244740.0.0 将链接复制至IE浏览器打开!!! 功能操作 ...

  2. S0011基于51单片机DS18B20温控风扇仿真设计

    基于51单片机DS18B20温控风扇仿真设计 (仿真+原理图+源码+设计报告) 原理图:Altium Designer 仿真原版本:proteus 7.8 程序编译器:keil 4/keil 5 编程 ...

  3. 51单片机的温控风扇设计

    一.硬件方案 系统采用51单片机作为控制平台对风扇转速进行控制.可由用户设置高.低温度值,测得温度值在高低温度之间时打开风扇弱风档,当温度升高超过所设定的温度时自动切换到大风档,当温度小于所设定的温度 ...

  4. 基于51单片机智能温控风扇LCD1602液晶显示红外遥控设计

    视频演示地址:https://www.bilibili.com/video/BV1t5411u7qC/ 该设计是由AT89C51为主控芯片液晶LCD1602温度控制风扇档位变换PWM调速 没有按键情况 ...

  5. 51单片机PWM温控风扇定时关闭手动自动DS18B20测温LCD1602显示

    实践制作DIY- GC0018-PWM温控风扇 一.功能说明: 基于51单片机设计-PWM温控风扇 功能介绍: 1. STC89C52单片机 +LCD1602 +多个按键+风扇+风扇驱动电路+DS18 ...

  6. 基于单片机的智能电子密码锁系统设计-基于51单片机酒精浓度检测仪设计-基于单片机的水缸加热温控控制系统设计-基于单片机蓝牙技术的温室监测系统设计-基于单片机智能PWM调光灯系统设计【毕设方案】

    600基于单片机的智能电子密码锁系统设计-电路程序资料 本设计采用的是AT89C51单片机作为控制核心,控制外围电路工作的装置.在本次基于单片机的电子密码锁设计中,将采用AT89C51单片机作为控制核 ...

  7. 基于51单片机的温控系统

    基于51单片机的温控系统 本文是基于STC89C52单片机的温度控制系统,主要由主控模块.显示模块及外围电路几个部分组成. 通过DS18B20检测外部温度,通过LCD1602显示,按键可调节上下限.当 ...

  8. matlab ds18b20 单片机,基于51单片机ds18b20温度检测————设计报告.doc

    基于51单片机ds18b20温度检测----设计报告 课程名称: 微机原理课程设计 题 目: 温度检测课程设计 摘要 随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为 ...

  9. 基于51单片机的公交车安全智能检测系统、基于51单片机的金属探测仪控制设计、基于单片机的智能电子密码锁系统设计、基于51单片机酒精浓度检测仪设计【资料转发分享】

    630基于51单片机的公交车安全智能检测系统-设计资料 本资料是基于单片机的公交车安全监测系统 具有如下功能: 1.监测环境的温度,超标报警.可以设置上下限 2.监测是否有火灾以及有毒气体,超标报警, ...

  10. 基于微型计算机系统的实时时钟设计,基于51单片机的实时时钟设计报告.doc

    基于51单片机的实时时钟设计报告 PAGE PAGE 24 课程设计(论文)任务书 信息工程 学 院 信息工程 专 业 (2) 班 一.课程设计(论文)题目 嵌入式课程设计 二.课程设计(论文)工作自 ...

最新文章

  1. mysql数据库回滚日志_Mysql数据库应急响应中日志排查
  2. 2016年10月起微软更改了更新服务模型
  3. Visual formatting model(图)
  4. Linux——userdel删除用户不完全问题
  5. Jzoj4743 积木
  6. Jmeter之JSON Path Extractor的使用(JSON-handle下载安装和使用)
  7. 靠知识赚钱只是较高级的体力劳动,靠智慧赚钱才能真正的富有。
  8. 大数据分析入门小技巧
  9. web操作日志丢失_分享:有赞百亿级日志系统架构设计
  10. 硬盘转速和平均寻道时间
  11. 软件专业面试心理测试题,面试心理测试题目,据说很准
  12. 金蝶系统服务器名称填什么,金蝶怎样输入服务器地址
  13. EDG夺冠刷屏,电竞比赛离不开这个“智能网络大脑”
  14. html中背景色优先级,CSS背景颜色优先级
  15. 绝地求生 服务器无响应,绝地求生卡在登陆页面怎么办
  16. h5中performance.timing轻松获取网页各个数据 如dom加载时间 渲染时长 加载完触发时间...
  17. 如何使用数据库的SQLServer身份验证登陆
  18. MySQL课程设计2022 · 员工考勤管理系统
  19. 互联网大厂的年终奖(华为分红400亿,腾讯每人发股票 )
  20. JAVA的3DES加密代码转成oc_iOS之DES加密

热门文章

  1. 没了美国EDA软件,我们就不能做芯片?
  2. 三款常用IP发包工具介绍
  3. 单片机学习——定时器/计数器
  4. 微弱光信号检测MATLAB,微弱信号检测笔记(更新中... 2021年3月9日)
  5. SpringBoot 多语言切换
  6. matlab神经网络预测数据,Matlab神经网络预测复数
  7. 《信号与系统》(吴京)部分课后习题答案与解析——第四章(PART6)(周期信号的FT与时域抽样)
  8. [工具推荐] IPv4 和 IPv6 网站测速工具
  9. android 去掉google搜索,Android 7.1 去掉桌面上的谷歌搜索框
  10. android车载桌面,车载桌面Car Launcher Pro