任务: 采用温度传感器和单片机等电路独立设计并制作一个简易数字式温度控制装置。
资源下载地址:
https://download.csdn.net/download/qq_40707685/10764080
单路温度
双路温度
部分代码:
#include<reg51.h>
#include<intrins.h>
#include <stdio.h>
#include<absacc.h>
#include<math.h>
#define PIN0 XBYTE[0X7FF8] //ADC0809的绝对地址
typedef unsigned char byte;
typedef unsigned int word;
unsigned char xuehao[]="000000000 ";
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //数码管熄灭
sbit int0=P3^2; //调整设定温度和显示当前温度转换
sbit green=P3^4; //加热电阻丝
sbit red=P3^5; //风扇
sbit ck=P2^4; //串口发送开关
sbit jia=P2^5;
sbit jian=P2^6;
byte l,m,flag1,flag2=0;
byte T,sdH=60,sdL=40; //设定温度
float result=0;
float result_reg;
byte i;
/*****************************************************
函数名:延时子函数
调 用:delay(?)
参 数:延时时长
返回值:无
结 果:延时
备 注:无
******************************************************/
void delay(int n)
{
while(n--);
}
/*****************************************************
函数名:初始化子函数
调 用:init()
参 数:无
返回值:无
结 果:对外部中断0,外部中断1,定时器中断0和串口寄存器进行初始化
备 注:无
*******************************************************/
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256; //定时器0计数初值设置,0.5秒定时
TL0=(65536-50000)%256;
EX0=1;
EX1=1;
ET0=1;
PX0=0;
PX1=0;
PT0=1;
PT1=1;
EA=1;
TR0=1;
IT1=1;
IT0=1;
}
/*****************************************************
函数名:AD采集电压子程序
调 用:samp()
参 数:无
返回值:采集到的电压值模拟量
结 果:采集电压
备 注:无
*******************************************************/
float samp()
{
PIN0=0xFF;
for(i=0;i<0x9f;i++);
result_reg=PIN0;
result=result_reg*5/255;
return result;
}
/*****************************************************
函数名:电压转换为温度子函数
调 用:jisuan(?)
参 数:采集的电压值
返回值:无
结 果:得到当前温度的十位和个位,以及设定温度的十位和个位
备 注:无
*******************************************************/
void jisuan(float result)
{
float T1,T2,T3=0.0;
// if(result>0.00&&result<1.416)
// {
// T=48.78*result-39.07;
// }
// else if(result>1.416&&result<2.968)
// {
// T=19.33*result+2.629;
// }
// else if(result>2.968&&result<3.418)
// {
// T=31.11*result-32.338;
// }
// else if(result>3.418&&result<5.00)
// {
// T=105.26*result-285.79;
// } //把电压转换为温度
T1 = 11.247*result*result;
T2 = 13.168*result;
T3 = T1+T2+25.689;
if(T3>100)
{T3 -= 59;}
else if(T3>80)
{T3 -= 40;}
else if(T3>60)
{T3 -= 20;}
else if(T3>50)
{T3 -= 10;}
else
{T3 -= 6;}
T=(char)T3;
}
/*****************************************************
函数名:继电器驱动发光二极管子函数
调 用:jidianqi()
参 数:无
返回值:无
结 果:当前温度>设定温度,红灯亮;当前温度<设定温度,绿灯亮
备 注:无
*******************************************************/
void jidianqi()
{ if(T>sdH){red=1;green=0;}
else if(T<sdL){red=0;green=1;}
else {red=0;green=0;}
}
/******************************************************
函数名:动态显示
调 用:display(?,?,?)
参 数:当前温度的十位,个位和大写C
返回值:无
结 果:数码管动态显示温度
备 注:无
*******************************************************/
void display(byte wendu)
{
unsigned char a,b;
a=wendu/10;
b=wendu%10;
P1=0xff;
P2=0xf7;
P1=tab[12];//显示大写'C'
delay(100);
P1=0xff;
P2=0xfb;
P1=0x9c;//显示'o'
delay(100);
P1=0xff;
P2=0xfd;
P1=tab[b];
delay(100);
P1=0xff;
P2=0xfe;
P1=tab[a];
delay(100);
P1=0xff;
}
void displayH(byte wendu)
{
unsigned char a,b;
a=wendu/10;
b=wendu%10;
P1=0xff;
P2=0xf7;
P1=0x89;//显示大写'H'
delay(100);
P1=0xff;
P2=0xfb;
P1=0xbf;//显示大写'-'
delay(100);
P1=0xff;
P2=0xfd;
P1=tab[b];
delay(100);
P1=0xff;
P2=0xfe;
P1=tab[a];
delay(100);
P1=0xff;
}
void displayL(byte wendu)
{
unsigned char a,b;
a=wendu/10;
b=wendu%10;
P1=0xff;
P2=0xf7;
P1=0xc7;//显示大写'L'
delay(100);
P1=0xff;
P2=0xfb;
P1=0xbf;//显示大写'-'
delay(100);
P1=0xff;
P2=0xfd;
P1=tab[b];
delay(100);
P1=0xff;
P2=0xfe;
P1=tab[a];
delay(100);
P1=0xff;
}
byte anjian(byte wendu)
{
if(jia==0)
{
delay(100);
if(jia==0)
{
wendu++;
if(wendu>90)
wendu=90;
}
}
while(!jia);
if(jian==0)
{
delay(100);
if(jian==0)
{
wendu--;
if(wendu<0)wendu=0;
}
}
while(!jian);
return wendu;
}
void chuankou(float wendu)
{
char t=0;
byte a,b;
if(ck==0)
{
delay(100);
if(ck==0)
{
TMOD=0x21;
SCON=0x40;
PCON=0;
TH1=0xFD;
TL1=0xFD;
TR1=1;
for(t=0;t<9;t++)
{SBUF=xuehao[t];while(!TI);TI=0;}
SBUF=':';while(!TI);TI=0;
a=(byte)wendu/10;
b=(byte)wendu%10;
SBUF=0x30+a;while(!TI);TI=0;
SBUF=0x30+b;while(!TI);TI=0;
SBUF='C';while(!TI);TI=0;
SBUF=' ';while(!TI);TI=0;
TR1=0;
}
while(!ck);
}
}
/******************************************************
函数名:主函数
调 用:main()
参 数:无
返回值:无
结 果:0.5秒采集电压,并显示,可调设定温度,按键发送当前温度给PC机
备 注:无
*******************************************************/
void main(void)
{
byte temp;
red=0;green=0;
l=10;
init();
while(1)
{
if(flag1==1)
{
flag1=0;
result=samp();
jisuan(result);
}
switch(flag2)
{
case 0: display(T);break;
case 1: displayH(sdH);
sdH=anjian(sdH);
break;
case 2: temp=sdL;
temp=anjian(temp);
if(temp>sdH)
{
displayL(temp);
sdL=sdH;
}
else
{
displayL(temp);
sdL=temp;
}
break;
}
jidianqi();
chuankou(T);
}
}
/******************************************************
函数名:t0定时器中断函数
参 数:无
返回值:无
结 果:0.5秒定时
备 注:无
*******************************************************/
void t0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
l--;
if(l==0)
{flag1=1;l=10;}
}
/******************************************************
函数名:外部中断0中断函数
参 数:无
返回值:无
结 果:模式选择
备 注:无
*******************************************************/
void int00() interrupt 0
{
if(int0==0)
{
delay(30);
if(int0==0)
{
flag2++;
if(flag2==3)
flag2=0;
}
}
}
完整资源截图:
资源下载地址:https://download.csdn.net/download/qq_40707685/10764080