温度计程序Word文档下载推荐.docx

上传人:b****8 文档编号:22566408 上传时间:2023-02-04 格式:DOCX 页数:21 大小:18.38KB
下载 相关 举报
温度计程序Word文档下载推荐.docx_第1页
第1页 / 共21页
温度计程序Word文档下载推荐.docx_第2页
第2页 / 共21页
温度计程序Word文档下载推荐.docx_第3页
第3页 / 共21页
温度计程序Word文档下载推荐.docx_第4页
第4页 / 共21页
温度计程序Word文档下载推荐.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

温度计程序Word文档下载推荐.docx

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

温度计程序Word文档下载推荐.docx

//温度变量高低位

staticunsignedcharbdataTHV_at_0x0028;

staticsignedcharTMV;

//转换后的温度值

staticunsignedcharKeyV,TempKeyV;

//键值

staticsignedcharTMRomV_at_0x0027;

//高温限制

staticsignedcharTMSetV_at_0x0026;

//温度设定值

staticunsignedcharKSDNum;

//SET键连按时的采集次数

staticunsignedcharIntNum,IntNum2,IntNum3;

//中断发生次数,IntNum用于SET长按检测,IntNum2用于设定状态时LED闪烁

staticsignedcharLED_One,LED_Two,LED_Three;

//LED的显示位LED_One为十位,LED_Two为个位

staticunsignedcharSign;

//负号标识

voidmain(void)

{

voidInitDS1820(void);

//定义函数

voidROMDS1820(void);

voidTMVDS1820(void);

voidTMRDS1820(void);

voidTMWDS1820(void);

voidTMREDS1820(void);

voidTMERDS1820(void);

voidReadDS1820(void);

voidWriteDS1820(void);

voidDelay_510(void);

voidDelay_110(void);

voidDelay_10ms(void);

voidDelay_4s(void);

voidV2ToV(void);

StateREG=0;

//初始化变量

SetTF=1;

PowTF=1;

//关电源

THV=0;

TLV=0;

TMV=0;

KeyV=0;

TempKeyV=0;

KSDNum=0;

IntNum=0;

IntNum2=0;

IntNum3=0;

LED_One=0;

LED_Two=0;

InitDS1820();

//初始化

ROMDS1820();

//跳过ROM

TMERDS1820();

//E2PRAM中温度上限值调入RAM

TMRDS1820();

//读出温度指令

ReadDS1820();

//读出温度值和上限值

TMSetV=TMRomV;

//拷贝保存在DS18B20ROM里的上限值到TMSetV

EA=1;

//允许CPU中断

ET0=1;

//定时器0中断打开

TMOD=0x1;

//设定时器0为模式1,16位模式

TH0=0xB1;

TL0=0xDF;

//设定时值为20000us(20ms)

TR0=1;

//开始定时

while

(1);

}

//定时器0中断外理中键扫描和显示

voidKeyAndDis_Time0(void)interrupt1using2

LEDPort=0xFF;

if(!

Key_UP)

KeyV=1;

Key_DOWN)

KeyV=2;

Key_SET)

KeyV=3;

//KeySETDowning=0;

//清除

if(KeyV!

=0)//有键按下

{

Delay_10ms();

//延时防抖按下10ms再测

TempKeyV=1;

TempKeyV=2;

TempKeyV=3;

if(KeyV==TempKeyV)//两次值相等为确定接下了键

if(KeyV==3)//按下SET键,如在SET状态就退出,否则进入

//KeySETDowning=1;

//表明SET正在按下

PowTF=0;

//电源标识开

if(!

KeyTF)

if(SetTF)

{

SetTF=0;

//标识位标识退出设定

InitDS1820();

ROMDS1820();

TMWDS1820();

//写温度上限指令

WriteDS1820();

//写温度上限到DS18B20ROM

TMREDS1820();

//温度上限值COPY回E2PRAM

}

else

SetTF=1;

KeySETDown)//没有第一次按下SET时,KeySETDown标识置1

KeySETDown=1;

else

KSDNum=KSDNum+1;

//前一秒内有按过SET则开始计数

}

if(SetTF)//在SET状态下

if((KeyV==1)&

&

(!

KeyTF))

TMSetV=TMSetV+1;

//上调温度

if((KeyV==2)&

TMSetV=TMSetV-1;

//下调温度

if(TMSetV<

=-55)//限制温度上下限

TMSetV=-55;

if(TMSetV>

=125)

TMSetV=125;

if((!

KeyTF)&

(IntNum3==0))KeyTF=1;

//当键盘处于可用时,锁定

if(KeySETDown)//在2秒内按下了SET则计中断发生次数用于长按SET时计时用

IntNum=IntNum+1;

if(IntNum>

55)//中断发生了55次时(大约1.2秒)75为1.5秒左右

KeySETDown=0;

if(KSDNum==55)//如一直长按了SET1.2秒左右

RelayOutPort=1;

//关闭继电器输出

//电源标识关

LEDOneC=0;

LEDTwoC=0;

LEDThreeC=0;

LEDPort=0xBF;

//显示"

--"

Delay_4s();

//延时

LEDOneC=1;

LEDTwoC=1;

//关显示

LEDThreeC=1;

IntNum=0;

IntNum2=0;

IntNum3=0;

//清空变量准备下次键扫描

PowTF)

TMVDS1820();

//温度转换指令

Delay_510();

//延时等待转换完成

//读出温度值

V2ToV();

//转换显示值

if(TMV>

TMSetV)//根据采集到的温度值控制继电器

RelayOutPort=0;

}

{

}

if(SetTF)IntNum2=IntNum2+1;

//用于闪烁计数

if(IntNum2>

50)IntNum2=0;

if(KeyTF)IntNum3=IntNum3+1;

//用于防止按键连按

if(IntNum3>

25)

{

IntNum3=0;

KeyTF=0;

}

if((SetTF)&

(IntNum2<

25))gotoInitEnd;

//计数在后半段时显示

LEDPort=LED_One;

//显示百位数

LEDPort=LED_Two;

//显示十位数

LEDPort=LED_Three;

//显示个位数

InitEnd:

;

voidV2ToV(void)//数值转换

TLV=TLV>

>

4;

THV=THV<

<

//读出的高低位数值移位

TMV=TLV|THV;

//合并高低位放入TM为实际温度值

Sign=0;

if(SetTF||!

Sign=TMSetV>

7;

//取符号

Sign=TMV>

if(Sign)

if(SetTF||!

LED_One=(~(TMSetV-1))/100;

//SET状态下显示设定值

LED_Two=((~(TMSetV-1))-LED_One*100)/10;

LED_Three=(~(TMSetV-1))-LED_One*100-LED_Two*10;

else

LED_One=(~TMV)/100;

//转换百位值

LED_Two=((~TMV)-LED_One*100)/10;

LED_Three=(~TMV)-LED_One*100-LED_Two*10;

{

LED_One=(TMSetV)/100;

LED_Two=(TMSetV-LED_One*100)/10;

LED_Three=TMSetV-LED_One*100-LED_Two*10;

LED_One=(TMV)/100;

LED_Two=(TMV-LED_One*100)/10;

LED_Three=TMV-LED_One*100-LED_Two*10;

//转LED字段

if(LED_One)//超过百时十位的处理

LED_Two=LEDDis[LED_Two];

if(LED_Two==0)

LED_Two=LEDDis[10];

LED_Two=LEDDis[LED_Two];

LED_One=LEDDis[11];

if(LED_One==0)

LED_One=LEDDis[10];

LED_One=LEDDis[LED_One];

LED_Three=LEDDis[LED_Three];

voidInitDS1820(void)//初始化DS1820

TMPort=1;

//拉高TMPort

_nop_();

//保持一个周期

TMPort=0;

//拉低TMPort

//延时DS1820复位时间要500us的低电平

//拉高TMPort

//保持

Delay_110();

//延时110us等待DS1820回应

TMPort)//回应信号为低电平

DS1820ON=1;

DS1820ON=0;

voidROMDS1820(void)//跳过ROM匹配

#pragmaasm

MOVA,#0CCH

MOVR2,#8

CLRC

WR1:

CLRP3_7

MOVR3,#6

DJNZR3,$

RRCA

MOVP3_7,C

MOVR3,#23

SETBP3_7

NOP

DJNZR2,WR1

#pragmaendasm

voidTMVDS1820(void)//温度转换指令

MOVA,#44H

WR2:

DJNZR2,WR2

voidTMRDS1820(void)//读出温度指令

MOVA,#0BEH

WR3:

DJNZR2,WR3

voidTMWDS1820(void)//写入温度限制指令

MOVA,#04EH

WR13:

DJNZR2,WR13

voidTMREDS1820(void)//COPYRAMtoE2PRAM

MOVA,#48H

WR33:

DJNZR2,WR33

voidTMERDS1820(void)//COPYE2PRAMtoRAM

MOVA,#0B8H

WR43:

DJNZR2,WR43

voidWriteDS1820(void)//写入温度限制值

MOVA,26H//发出4EH写ROM指令后连发两个字节分别为上下限

WR23:

DJNZR2,WR23

SETBP3_7

voidReadDS1820(void)//读出温度值

MOVR4,#3;

将温度高位和低位,高温限制位从DS18B20中读出

MOVR1,#29H;

低位存入29H(TEMPER_L),高位存入28H(TEMPER_H),高温限制位存入27H(TMRomV)

RE00:

RE01:

MOVR3,#09

RE10:

DJNZR3,RE10

MOVC,P3_7

RE20:

DJNZR3,RE20

DJNZR2,RE01

MOV@R1,A

DECR1

DJNZR4,RE00

voidDelay_510(void)//延时510微秒

MOVR0,#7DH

MOVR1,#02H

TSR1:

DJNZR0,TSR1

DJNZR1,TSR1

voidDelay_110(void)//延时110微秒

MOVR0,#19H

TSR2:

DJNZR0,TSR2

DJNZR1,TSR2

voidDelay_10ms(void)//延时10ms

MOVR1,#0C8H

TSR3:

DJNZR0,TSR3

DJNZR1,TSR3

voidDelay_4s(void)//延时4s

MOVR2,#28H

TSR5:

MOVR0,#0FAH

TSR4:

DJNZR0,TSR4

DJNZR1,TSR4

DJNZR2,TSR5

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

当前位置:首页 > 人文社科 > 教育学心理学

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

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