基于51的温度控制系统设计C语言源程序Word格式.docx
《基于51的温度控制系统设计C语言源程序Word格式.docx》由会员分享,可在线阅读,更多相关《基于51的温度控制系统设计C语言源程序Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
II高温指示灯
led_ok=P2A5;
II温度正常指
示灯
led_work=戸2八4;
II工作指示
灯
set=戸3八7;
〃设置按键
add=P3A4;
II加一按键
dec=P3A5;
II减一按键
〃定义变量和常量intcount=0;
存器
//按键次数寄
inth;
//主函数用
循环计数器
uinttemp;
ucharr;
数形式
ucharhigh=35,low=20;
//温度值
〃温度值整
//上下限初值
〃共阳LED段码表
"
3"
"
4"
5"
6"
7"
0"
1"
2"
8"
9"
不亮"
ucharcodeLED_code[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
ucharcodeLED_code1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0X06,0X06,0X07,0X08,0X08,0X09,0X09};
小数部分转换码表
uchardatatemp_data[2]={0x00,0x00};
/存储从
传感器读出的温度值
uchardatadp[5]={0x00,0x00,0x00,0x00,0x00};
//
显示单元数据,共4个数据和一个运算
〃子函数声明
voidds_reset();
始化函数一
//DS18B20初
voiddswrite(uchardswrdata);
数据函数
//DS18B20写
uchardsread();
读数据函数
//DS18B20
readtemp();
//读取温度
函数
voidchange_temp(uinttem);
//温度数据
处理
voidxianshi(inthorl);
//温度显示转
换
voiddisplay。
;
//数码管显示
voidkeyscan();
//按键查询
voidwarn_led();
//超限报警
voiddelay(uintt);
单次25us
//延时函数,
*******************
voidmain()
{
LED=0x00;
口
led1=0;
Ied2=0;
Ied3=0;
Ied4=0;
for(h=0;
h<
4;
h++)
{dp[h]=8;
}
while⑴
温度读取
{uchari;
for(i=0;
i<
200;
i++){warn_led();
display。
keyscan();
//初始化显示端
//循环执行显示和
//指示灯控制
//显示
//按键扫描
change_temp(read_temp());
/温度数据读取和处理
*****/
ds_reset()
/*函数名称:
DS18B20初始化
/*函数功能:
/*入口参数:
/*输出参数:
delay();
_nop_();
/*调用函数:
/*全局变量:
presence
/*局部变量:
*//******************************************
*****/voidds_reset(void)
charpresence=1;
while(presence){while(presence){
DQ=1;
先置高电平
_nop_();
_nop_();
DQ=0;
从高电平拉到低电平
delay(50);
DQ=1;
delay(6);
presence=DQ;
续下一步
}delay(45);
presence=~DQ;
//传感器数据段
//适当延时
//延时
//再置高电平
//初始化成功,继
//拉高电平
//开工作指示灯
led_work=0;
*****//*函数名称:
ds_write()
*/_
向DS18B20写数据*/
/*入口参数:
ds_wrdata
无
/*调用函数:
*****/voidds_write(uchards_wrdata)
{一一
uchari;
for(i=8;
i>
0;
i--){
DQ=0;
DQ=ds_wrdata&
0X01;
II最低位移出
delay(6);
ds_wrdata=ds_wrdata/2;
II右移1位
}一一
delay
(1);
I*函数名称:
ds_read()
I*函数功能:
从DS18B20读数据
I*入口参数:
I*输出参数:
value
I*调用函数:
i;
value;
帰*****************************************
*****/uchards_read(void)
{_
ucharvalue=0;
value>
>
=1;
if(DQ)value|=0x80;
return(value);
/*函数名称:
read_temp()
读温度数据数据
/*输出参数:
yemp
ds_reset();
ds_write();
ds_read();
*/
temp
temp_data[];
//传感器初始
//发跳过读取
//发温度转换
〃读18B20中
//读温度值的
〃两字节合成
//返回温度值
化_
delay(200);
ds_write(0xcc);
序列号命令
ds_write(0x44);
命令
ds_write(0xcc);
ds_write(0xbe);
存储器
temp_data[0]=ds_read();
低字节命令
temp_data[1]=ds_read();
高字节一一
temp=temp_data[1];
tempvv=8;
temp=temp|temp_data[0];
一个整型变量
returntemp;
chang_temp()
将温度传感器中独到的数据进行转换*/
tem
dp[]
/*全局变量:
dp[];
ditab[];
r;
*****/voidchange_temp(uinttem)
//温度值正
ucharn=0;
if(tem>
6348)
负判断
tem=65536-tem;
//负温度求补码
n=1;
〃标志位置1
dp[4]=tem&
0x0f;
分的值
dp[0]=ditab[dp[4]];
分显示值
dp[4]=tem>
位,即整数部分的值
dp[3]=dp[4]/100;
dp[1]=dp[4]%100;
数据
dp[2]=dp[1]/10;
dp[1]=dp[1]%10;
r=dp[1]+dp[2]*10+dp[3]*100;
(十进制)
if(!
dp[3])
断
{dp[3]=0x0a;
不显示
dp[2]){dp[2]=0x0a;
//取小数部
//存入小数部
//取中间八
//取百位数据
//取后两位
//取十位数据
//个位
//实际温度值
//符号位显示判
//最高位为0时
//次高位为0时不
显示
if何
{dp[3]=0x0b;
//负温度时最高位显示
IIII
xianshi()
温度数据转换成显示所需LED段码
horl
dp[];
n;
voidxianshi(inthorl){
intn=0;
if(horl>
128){
horl=256-horl;
n=1;
}dp[3]=horl/100;
dp[3]=dp[3]&
dp[2]=horl%100/10;
dp[1]=horl%10;
dp[0]=0;
dp[3]){
dp[3]=0x0a;
if(!
dp[2]){
dp[2]=0x0a;
}if(n){
//负数补码转换
//百位
〃十位
〃小数位
//高位为零不显示
〃负数最高位显示
dp[3]=0x0b;
display。
数码管显示
delay()
LED_code[];
LED_code1[];
*//*
Ied1;
led2;
led3;
led4;
j;
f******************************************
*****/voiddisplay。
{
intj;
for(j=0;
j<
j++)〃4位LED扫描
控制
switch(j)
case0:
LED=LED_code[dp[0]];
led4=1;
delay(450);
led4=0;
break;
〃小数位
case1:
LED=LED_code1[dp[1]];
led3=1;
led3=0;
〃个位
case2:
LED=LED_code[dp[2]];
led2=1;
led2=0;
〃十位
case3:
LED=LED_code[dp[3]];
led1=1;
〃百位
keyscan()
按键查询
display();
xianshi();
count;
high;
low;
//set键按下
voidkeyscan(){
if(set==0)
{while
(1){
delay(500);
if(set==0){count++;
while(!
set)面内容
}if(count==1){xianshi(high);
并显示
if(add==0){while(!
add)并显示
high+=1;
}if(dec==0){while(!
dec)并显示
high-=1;
//延时去抖动
〃重新判断set键是否按下
//按键弹起继续显示前
//set按下一次执行此段
//转换上限温度为段码
//add键是否按下
//弹起时上限温度加一
//dec键是否按下
//弹起时上限温度减一
if(count==2)//set键按下两次执行此
段
xianshi(low);
//转换下限温度为段码并显示
if(add==0)//add键是否按下{
while(!
add)//弹起时下限温度加一并显示
low+=1;
}//dec键是否按下
if(dec==0)
dec)//弹起时下限温度减一并显示
low-=1;
if(count>
=3)//set键按下三次回到温
度显示状态
count=0;
break;
warn」ed()
工作情况指示灯控制
voidwarn_led()
{_if(r>
high){led_low=1;
led_high=0;
led_ok=1;
buzzer=0;
}elseif(r<
low)
{led」ow=0;
led_high=1;
}else
led_low=1;
led_ok=0;
buzzer=1;
//温度高于上限温度
//"
低温"
指示灯灭
II“高温”指示灯亮
//“正常”指示灯灭
//蜂鸣器发声
//温度低于下限温度
//“低温”指示灯亮
//“高温”指示灯灭
〃温度正常
//“正常”指示灯亮
//蜂鸣器不发声
延时函数,单次25us左右延时
t;
voiddelay(uintt){
for(;
t>
t--);
/*******************
********************/
程序结束