赞
踩
1、本设计是基于AT89C51/52单片机为核心的温控风扇系统,使用Proteus进行仿真分析。
2、由于上传后图片压缩,可以私信联系获取清晰图片。
3、本次为本人结课设计,整体比较简单,如有疑问欢迎大家交流讨论!
目录
【嵌入式开发-8051】详细:基于AT89C52单片机设计的温控风扇(Proteus仿真设计-含设计原理图、程序源码)
软件编程环境:Keil uVision5
硬件仿真环境:Proteus 8 Professional(Proteus 8.12 SP0)
在这里我不介绍软件详细的下载流程(网上有比较详细的流程可以参考),只提供相应的百度网盘链接供大家自取。
Keil5(C51及MDK版本):百度网盘 请输入提取码
Proteus 8.12 SP0:百度网盘 请输入提取码
整体系统框图如下图所示,系统的核心为AT89C51/52单片机,主要包括按键电路、数码管显示电路以及DS18B20温度传感器电路和LED报警和风扇电路四大模块。
1、利用温度传感器DS18B20检测环境温度并输出数字温度信号给单片机AT89C51/52进行处理,随后在LED数码管上显示当前环境温度值;
2、通过Proteus中的直流电机模拟风扇的转动;
3、通过三个按键来实现选择调节预设温度、提高预设温度值和降低预设温度值。
如果环境温度高于预设温度将会自动报警,这时LED灯亮起,风扇启动;当环境温度低于预设温度后将自动取消报警,这时LED灯熄灭,风扇停转。
2.2.1、AT89C51/52单片机
控制系统模块主要采用的是AT89C51/52作为微处理单元进行控制。AT89C51/52是一款低功耗、高性能、COMS八位微处理器,片内有4K字节在线可重复编程、快速擦除快速写入程序的存储器,能重复写入/擦除1000次,数据保存时间为10年。
AT89C51/52单片机引脚图如下图所示:
2.2.2、DS18B20数字温度传感器
DSB18B20的优势
DS18B20是常用的数字温度传感器,它具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,可直接将温度转化成串行数字信号供处理器处理。
相比传统的热敏电阻以及其他温度测量元器件,DS18B20的数据可直接读出,能通过编程实现12位的数字值读数方式。当DS18B20模块接收到温度转换指令时,会立马启动转换。转换完成后,温度值会以二进制补码形式储存在高速暂存存储器的前两个字节。
DS18B20温度转换原理
AT89C51单片机可以通过单线接口按照由低位到高位的顺序读出该数据,由于寄存器中存储的是二进制环境温度值,因此还需要经过转换才能得到实际环境温度值。首先将二进制数值转换为十进制数值,随后根据该数据的正负对数据进行处理,如果是正数,直接乘以0.0625,如果是负数,则进行取反加1,即可得到实际的温度值。
2.2.3、LED数码管
LED数码管的结构
LED数码管主要是由8段发光二极管组成,其中a~g为数字和字符显示段,dp为小数点的显示,通过a~g共7段发光二极管,可以显示0~9和A~F共16个数字和字母。
LED数码管可以分为共阴极和共阳极两种结构。共阴极结构将8个发光二极管阴极连在一起,共阳极结构把8个发光二极管阳极连在一起。
LED数码管的原理
通过单片机引脚输出高低电平,可使数码管显示相应的数字或字母,这种使数码管显示字形的数据称为段选码,如下表所示。
显示字符 | 共阴极段码 | 共阳极段码 | 显示字符 | 共阴极段码 | 共阳极段码 |
---|---|---|---|---|---|
0 | 0x3f | 0xbf | 8 | 0x7f | 0xff |
1 | 0x06 | 0x86 | 9 | 0x6f | 0xef |
2 | 0x5b | 0xdb | A | 0x77 | 0xf7 |
3 | 0x4f | 0xcf | B | 0x7c | 0xfc |
4 | 0x66 | 0xe6 | C | 0x39 | 0xb9 |
5 | 0x6d | 0xed | D | 0x5e | 0xde |
6 | 0x7d | 0xfd | E | 0x79 | 0xf9 |
7 | 0x07 | 0x87 | F | 0x71 | 0xf1 |
main.c
- #include<reg51.h>
- #include"ds18b20.h"
- #define uchar unsigned char
- #define uint unsigned int
-
- uint wendu; //温度变量
- uint sheding=20; //默认设定温度值
- uchar shi,ge; //数码管显示数值
- uint flag; //标记
- sbit motor=P3^7; //直流电机接口
- sbit key1=P1^0; //调整设定温度
- sbit key2=P1^3; //温度+
- sbit key3=P1^6; //温度-
- sbit w1=P2^0;
- sbit w2=P2^1; //数码管接口
- sbit led=P3^4; //LED接口
-
- //共阴数码管段选
- uchar table[16]={
- 0x3f,0x06,0x5b,0x4f, //0,1,2,3
- 0x66,0x6d,0x7d,0x07, //4,5,6,7
- 0x7f,0x6f,0x77,0x7c, //8,9,A,b
- 0x39,0x5e,0x79,0x71, //C,d,E,F
- };
-
- //显示与报警函数
- void display(){
- w1=0;
- P0=table[shi];
- delay(10); //第1位数码管显示数据
- P0=0x00;
- w1=1; //关闭显示消除动态扫描阴影
- w2=0;
- P0=table[ge];
- delay(10); //第2位数码管显示数据
- P0=0x00;
- w2=1; //关闭显示消除动态扫描阴影
- //当温度高于设定值,LED灯亮起
- if(wendu>sheding){
- led=0;
- motor=0;
- }
- else{
- led=1;
- motor=1;
- }
- }
-
- //按键事件
- void prebutton(){
- if(key1==0){ //按下key1,调整设定温度
- delay(30);
- if(key1==0)
- flag=1;
- while(key1==0); //松手检测
- }
- while(flag==1){
- shi=sheding/10;
- ge=sheding%10;
- display(); //显示设定温度值
- //再次按下key1时跳出循环
- if(key1==0){
- delay(30);
- if(key1==0)
- flag=0;
- while(key1==0);
- }
- //温度+
- if(key2==0){
- delay(30);
- if(key2==0)
- sheding+=1;
- while(key2==0);
- }
- //温度-
- if(key3==0){
- delay(30);
- if(key3==0)
- sheding-=1;
- while(key3==0);
- }
- }
- }
-
- //主函数
- void main(){
- uchar j;
- while(1){
- wendu=ReadTemperature();
- shi=wendu/10;
- ge=wendu%10;
- for(j=0;j<80;j++){
- prebutton();
- display();
- }
- }
- }
ds18b20.c
- #include "ds18b20.h"
-
- sbit DQ=P3^1; //数据传输线接单片机的相应的引脚
-
- //延时函数
- void delay(uint k){
- while(k--);
- }
-
- //DS18B20初始化函数
- void ds18b20_init(){
- uchar x=0;
- DQ=1; //DQ先置高
- delay(8); //稍做延时
- DQ=0; //发送复位脉冲
- delay(80); //延时大于480us
- DQ=1; //拉高总线
- delay(14);
- x=DQ; //稍做延时后,若x=0则初始化成功,x=1则初始化失败
- delay(20);
- }
-
- //字节读取函数
- uchar Read(){
- uchar i=0;
- uchar dat=0;
- for (i=8;i>0;i--){
- DQ=0; //给脉冲信号
- dat>>=1; //数据右移位
- DQ=1; //给脉冲信号
- if(DQ)
- dat|=0x80; //读取数据线得到对应状态
- delay(4);
- }
- return(dat);
- }
-
- //字节写入函数
- void Write(uchar dat){
- uchar i=0;
- for(i=8;i>0;i--){
- DQ=0;
- DQ=dat&0x01; //从低位开始发送数据
- delay(5);
- DQ=1;
- dat>>=1;
- }
- }
-
- //温度读取函数
- uint ReadTemperature(){
- uint temp; //温度变量
- uchar a=0; //寄存器温度低位
- uchar b=0; //寄存器温度高位
- ds18b20_init(); //DS18B20初始化
- Write(0xcc); //跳过读序列号的操作
- Write(0x44); //启动温度转换
- delay(100); //转换有一定的延时
- ds18b20_init(); //DS18B20初始化
- Write(0xCC); //跳过读序列号的操作
- Write(0xBE); //读取温度寄存器,前两位值分别为温度的低位和高位
- delay(100);
- a=Read(); //读取温度值低位
- b=Read(); //读取温度值高位
- //温度转换:实际上温度有正负之分,但是负温度的处理比较复杂,只完成了正温度的转换
- temp=((b*256+a)*0.0625);
- return temp;
- }
按下调整设定温度按钮,将设定温度调整为30℃后,再次按下调整设定温度按钮,完成设定温度的设置。
人为调整DS18B20测得的环境温度为35℃,此时环境温度高于设定温度30℃,系统会自动开启报警电路,此时LED灯亮起,直流电机开始转动。
随后人为调整DS18B20测得的环境温度为20℃,此时环境温度低于设定温度30℃,系统会自动关闭报警电路,此时LED灯熄灭,直流电机停止转动。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。