标题:
单片机温控风扇Proteus仿真+代码
[打印本页]
作者:
a5880000
时间:
2019-5-14 12:45
标题:
单片机温控风扇Proteus仿真+代码
温控风扇仿真图
0.png
(29.17 KB, 下载次数: 73)
下载附件
2019-5-14 18:32 上传
单片机源程序如下:
#include<reg52.h> //头文件
#include<intrins.h>
#include "DS18b20.H"
#include "eeprom52.h"
#include "Nixie tube.h"
#define uchar unsigned char //宏定义
#define uint unsigned int
uchar code ss[]= //第一个数码管数组没有带小数点
{
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90
};
uchar code ss1[]= //这个数码管数组带小数点
{
0x40,0x79,0x24,0x30,0x19,
0x12,0x02,0x78,0x00,0x10,
0xc7,0x89,0xbf //0xc7=L 0x89=H 0xbf=- 负号
}; //0-9为带小数点的
uchar ms; //定义一个计数变量
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^3; //按键控制 P3^4设置切换 3.5上下限加 3.6上下限减
sbit led_0=P1^0; //上限温度报警灯
sbit led_2=P1^2; //下限温度报警灯
char H,L,T_ms; //用于设置上下限度 上下限度与要比较的数据类型最好相同 T_ms用于PWM调节
uchar flag,PWM_ON; //PWM_ON是风扇开关标志位
sbit Fan=P1^6; //风扇端口定义
bit voled=0; //voled用来判断风扇软启动
int temp; //存储读出来的温度,与H,L上下限度数据类型相同
void delay(uint T) //短延时
{
while(T--);
}
void display() //显示函数
{
if(flag==0&&temp>=0) //温度为正数时执行
{
if(temp>999) Nixietube(ss[temp/1000%10],ss[temp/100%10],ss1[temp/10%10],ss[temp%10]);
if(temp>99) Nixietube(0xff,ss[temp/100%10],ss1[temp/10%10],ss[temp%10]);
if(temp<99&&temp/100%10<=0) Nixietube(0xff,0xff,ss1[temp/10%10],ss[temp%10]);
}
if(flag==0&&temp<0) //温度为负数时
{
if(temp*-1/100%10<=0) Nixietube(0xff,ss1[12],ss1[temp*-1/10%10],ss[temp*-1%10]);
if(temp*-1/100%10>0) Nixietube(ss1[12],ss[temp*-1/100%10],ss1[temp*-1/10%10],ss[temp*-1%10]);
}
if(flag==1) //flag==0显示温度 =1 显示上限 =2 显示下限
{
if(H>99) Nixietube(ss1[11],ss[H/100],ss[H%100/10],ss[H%10]); //温度范围是125~-55 ,当上限值大于99时执行
if(H>=10&&H<=99) Nixietube(ss1[11],0xff,ss[H/10],ss[H%10]); //当上限值大于12小于99时执行 不显示最高位
if(H<10&&H>=0) Nixietube(ss1[11],0xff,0xff,ss[H%10]); //不显示百位 十位
if(H<0&&H>=-9) Nixietube(ss1[11],0xff,ss1[12],ss[H*-1%10]); //设置的为负数且介于0~-9之间时执行 不显示十位
if(H<0&&H<-9) Nixietube(ss1[11],ss1[12],ss[H*-1%100/10],ss[H*-1%10]); //最低可以到55
}
if(flag==2) //同上
{
if(L>99) Nixietube(ss1[10],ss[L/100],ss[L%100/10],ss[L%10]);
if(L>=10&&L<=99) Nixietube(ss1[10],0xff,ss[L/10],ss[L%10]);
if(L<10&&L>=0) Nixietube(ss1[10],0xff,0xff,ss[L%10]);
if(L<0&&L>=-9) Nixietube(ss1[10],0xff,ss1[12],ss[L*-1%10]);
if(L<0&&L<-9) Nixietube(ss1[10],ss1[12],ss[L*-1%100/10],ss[L*-1%10]);
}
}
void key() //按键处理
{
if(!key1) //设置上限
{
delay(500);
if(!key1)
{
while(!key1);//display();
if(flag==1)
{
if(H<125)H++;
SectorErase(0x2000); //每修改一次上下限数据就写进EEROM
byte_write(0x2000,H);
}
else if(flag==2)
{
if(L<H-1) L++; //原则是下限不超过上限
SectorErase(0x2200);
byte_write(0x2200,L);
}
}
}
if(!key2) //设置下限
{
delay(500);
if(!key2)
{
while(!key2);//display();
if(flag==1)
{
if(H>L+1) H--; //原则上限不低于下限
SectorErase(0x2000); //每修改一次上下限数据就写进EEROM
byte_write(0x2000,H);
}
else if (flag==2)
{
if(L>-55)L--;
SectorErase(0x2200);
byte_write(0x2200,L);
}
}
}
if(!key3) //设置上限下限切换按键
{
delay(1000);
if(!key3)
{
while(!key3);
flag=(flag+1)%3;
}
}
}
void alarm() //报警
{
if(temp/10>=H) //上限,当测得的值,大于等于设定值得时候,
{
led_0=0; PWM_ON=20; //上限警示灯亮,风扇PWM调节最大
}
else
{
led_0=1;
}
if((L<=temp/10)&&(temp/10<=H)) //当温度介于上下限之间时,风扇弱风转动
{
PWM_ON=4;
}
if(temp/10<=L) //如果温度在下限以下,那么风扇停止转动 下限指示灯亮
{
led_2=0; PWM_ON=0; voled=0;
Fan=1;
}
else
{
led_2=1;
}
}
void main() //主函数
{
do
{
temp=Temper();
}
while(temp==850); //因为DS18B20上电之后会读出来850,但不是温度值,所以等待读出温度值
H=byte_read(0x2000);
L=byte_read(0x2200); //读EEROM里面的数据
if((H>99)||(L>99)||(L>=H)) //如果数据不对,赋予初始值
{
H=35;
L=16;
}
TMOD=0x21; //使用两个定时器,0工作在方式1,用来定时读取与显示温度 1工作在方式2,用来模拟PWM
TH0=(65536-10000)/256;
TL0=(65536-10000)%256; //装入初始值,一次定时10MS
TH1 = 0x06;
TL1 = 0x06; //一次定时0.25ms
EA=1; // 打开总中断
ET0=1; //打开定时器0中断
TR0=1; //开始启动定时器0
ET1=1; //打开定时器1中断
TR1=1; //开始启动定时器1
while(1)
{
display(); //消影问题,仿真里对中断里的显示函数只执行一次,不能达到一直显示
//所以,在仿真时解除屏蔽此语句,屏蔽中断里的display();
key();
alarm();
}
}
void UART_1() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;; //一次定时10MS
ms++;
//display(); //显示函数 因为数码管存在消影问题,如果在电路上,不屏蔽此句子,如果需要仿真,屏蔽此句子,使用主函数里的显示函数
if(ms>100) //每1秒刷新一次温度数据
{
ms=0;
temp=Temper(); //读温度
}
}
void T1_time() interrupt 3
{
TH1 = 0x06;
TL1 = 0x06; //一次定时0.25ms
T_ms++;
if(voled==0&&temp/10>L) //软启动,因为电压太低,风扇不易启动/由温度低于下限的不启动到启动,电压太低也启动不了
{
voled=1;
Fan=0;
delay(3200);
Fan=1;
}
if(T_ms<PWM_ON)
{
Fan=0;
}
else
{
Fan=1;
}
if(T_ms>20)
{
T_ms=0;
}
}
复制代码
所有资料51hei提供下载:
Desktop1.zip
(334.04 KB, 下载次数: 86)
2019-5-14 12:44 上传
点击文件名下载附件
仿真图
下载积分: 黑币 -5
作者:
天外仙
时间:
2021-4-1 16:09
怎么感觉没用?测温测不准 ?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1