基于51的温度控制系统设计C语言源程序Word格式.docx

上传人:b****4 文档编号:16491115 上传时间:2022-11-24 格式:DOCX 页数:21 大小:24.42KB
下载 相关 举报
基于51的温度控制系统设计C语言源程序Word格式.docx_第1页
第1页 / 共21页
基于51的温度控制系统设计C语言源程序Word格式.docx_第2页
第2页 / 共21页
基于51的温度控制系统设计C语言源程序Word格式.docx_第3页
第3页 / 共21页
基于51的温度控制系统设计C语言源程序Word格式.docx_第4页
第4页 / 共21页
基于51的温度控制系统设计C语言源程序Word格式.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

基于51的温度控制系统设计C语言源程序Word格式.docx

《基于51的温度控制系统设计C语言源程序Word格式.docx》由会员分享,可在线阅读,更多相关《基于51的温度控制系统设计C语言源程序Word格式.docx(21页珍藏版)》请在冰豆网上搜索。

基于51的温度控制系统设计C语言源程序Word格式.docx

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--);

/*******************

********************/

程序结束

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1