温度控制程序Word文件下载.docx

上传人:b****6 文档编号:20918326 上传时间:2023-01-26 格式:DOCX 页数:9 大小:16.47KB
下载 相关 举报
温度控制程序Word文件下载.docx_第1页
第1页 / 共9页
温度控制程序Word文件下载.docx_第2页
第2页 / 共9页
温度控制程序Word文件下载.docx_第3页
第3页 / 共9页
温度控制程序Word文件下载.docx_第4页
第4页 / 共9页
温度控制程序Word文件下载.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

温度控制程序Word文件下载.docx

《温度控制程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《温度控制程序Word文件下载.docx(9页珍藏版)》请在冰豆网上搜索。

温度控制程序Word文件下载.docx

//报警温度上下限,ds18b20测温范围是-50~+125

bithigh_warn=0,low_warn=0;

//高低温报警标志

bitds18b20_well=1;

//ds18b20正常

ucharcurrent=0;

//温度整数部分

uinttime0=0;

//定时器0延时累加

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

/*延时程序,约为1us*/

voiddelay(uintx)

{

while(--x);

}

/*ds18b20初始化*/

uchards12b20_init()

{

ucharstatus;

DQ=1;

delay(8);

DQ=0;

delay(90);

status=DQ;

delay(100);

returnstatus;

//初始化成功返回值

/*读一字节*/

ucharread_one_byte()

uchari,dat=0;

_nop_();

for(i=0;

i<

8;

i++)

{

DQ=0;

dat>

>

=1;

DQ=1;

_nop_();

if(DQ)dat|=0x80;

delay(30);

}

returndat;

/*写一字节*/

voidwrite_one_byte(uchardat)

uchari;

DQ=dat&

0x01;

delay(5);

/*读取温度值*/

voidread_temp()

if(ds12b20_init()==1)

ds18b20_well=0;

//ds18b20故障

else

write_one_byte(0xcc);

//跳过序列号

write_one_byte(0x44);

//启动温度转换

ds12b20_init();

//初始化

write_one_byte(0xbe);

//读取温度寄存器

temp_value[0]=read_one_byte();

//温度低8位

temp_value[1]=read_one_byte();

//温度高8位

warn_temp_hl[0]=read_one_byte();

//报警温度上限

warn_temp_hl[1]=read_one_byte();

//报警温度下限

ds18b20_well=1;

/*设置DS18B20温度报警值*/

voidset_warn_temp_value()

ds12b20_init();

write_one_byte(0xcc);

//跳过序列号

write_one_byte(0x4e);

//将设定的温度报警值写入ds18b20

write_one_byte(warn_temp_hl[0]);

//写温度上限

write_one_byte(warn_temp_hl[1]);

//写温度下限

write_one_byte(0x7e);

//精度设置

write_one_byte(0x48);

//温度报警值出入ds18b20

/*在数码管上显示温度*/

voiddisplay_temp()

uchart=150;

//延时值

ucharng=0,np=0x01;

//负数标志及其位置

charsigned_current_temp;

//有符号的当前温度值

/***********************负数转换,取反加一************************/

if((temp_value[1]&

0xf8)==0xf8)

temp_value[1]=~temp_value[1];

temp_value[0]=~temp_value[0]+1;

if(temp_value[0]==0x00)temp_value[1]++;

ng=1;

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

display_digit[0]=df_table[temp_value[1]&

0x0f];

//小数温度部分

current=((temp_value[0]&

0xf0)>

4)|((temp_value[1]&

0x07)<

<

4);

//获取温度整数部分

signed_current_temp=ng?

-current:

current;

//有符号的当前温度值

high_warn=signed_current_temp>

=warn_temp_hl[0]?

1:

0;

low_warn=signed_current_temp<

=warn_temp_hl[1]?

//高低温报警标志位

/************整数部分分解************/

display_digit[3]=current/100;

display_digit[2]=current%100/10;

display_digit[1]=current%10;

if(display_digit[3]==0)

{

display_digit[3]=10;

//高位为0不显示

np=0x01;

//调整负号位置

if(display_digit[2]==0)

display_digit[2]=10;

np=0x02;

}

30;

i++)

point=1;

P0=duan_table[display_digit[0]];

P2=0X08;

delay(t);

P2=0X00;

//小数位

P0=duan_table[display_digit[1]];

point=0;

P2=0X04;

//个位及小数点

P0=duan_table[display_digit[2]];

P2=0X02;

//十位显示

P0=duan_table[display_digit[3]];

P2=0X01;

//个位显示

if(ng==1)

{

//point=1;

P0=0X0c;

//译码器显示不了负号,用这个代替

P2=np;

//显示负号

delay(t);

P2=0X00;

//负号没有显示

}

/*串口发送字符函数*/

voiduart_sendchar(ucharsch)

SBUF=sch;

while(TI==0);

TI=0;

}

/*串口发送字符串函数*/

voiduart_sendstring(uchar*s)

ucharc;

for(;

;

c=*s;

if(c=='

\0'

)break;

s++;

uart_sendchar(c);

/*定时器中断,控制报警声音*/

voidtime_warn()interrupt1

TH0=-1000/256;

TL0=-1000/256;

beep=!

beep;

if(++time0==4)

time0=0;

if(high){high=~high;

heat=1;

}

elsehigh=1;

if(low){low=~low;

heat=0;

elselow=1;

/*串口接收中断函数*/

voiduart_receive()interrupt4

intvalue;

if(RI)//接收到一字节

RI=0;

//清除串口中断标志位

value=SBUF;

if(value>

0)warn_temp_hl[0]=SBUF;

if(value<

0)warn_temp_hl[1]=SBUF;

/****************************主函数*********************************/

voidmain(void)

uchar*s="

pleaseset:

/nHI_Alarm=/nLO_Alarm="

ET0=1;

ES=1;

EA=1;

SCON=0X50;

PCON=0X00;

TMOD=0X21;

TH1=0XFD;

TL1=0XFD;

TR0=0;

TR1=1;

high=1;

low=1;

point=1;

set_warn_temp_value();

read_temp();

delay(50000);

uart_sendstring(s);

while

(1)

read_temp();

if(ds18b20_well)

if(high_warn==1||low_warn==1)TR0=1;

elseTR0=0;

display_temp();

else

{

P0=P2=0X00;

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

当前位置:首页 > 成人教育 > 电大

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

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