当前位置:文档之家 > 模拟自动恒温控制系统5

模拟自动恒温控制系统5

成绩

模拟自动恒温控制系统5

题目:模拟自动恒温控制系统设计

学生姓名:李跃波

学生学号: 0908020119 系别:电气信息工程学院自动化系

专业:自动化

届别: 2013届

指导教师:苗磊

电气信息工程学院制

2012年5月

模拟自动恒温控制系统设计

学生:李跃波

指导老师:苗磊

电气信息工程学院自动化系

1课程设计的任务与要求

1.1课程设计的任务

恒温控制系统在现今的生活中有很多应用,比如自动保温水壶,热水器豹纹系统,医院恒温箱等等。无论怎样应用,其设计的内涵都是基本一样的。本次设计通过测温元件获取测试对象的实时温度,并把转换成数字值的温度值送入微控制器,然后由微控制器检查其是否与标准温度一致;不一致,则启动相应的升温或降温器件工作。当温度回到正常的标准温度时,温度调整的器件停止工作。如此一来,就可以实现温度的自动调节。

1.2 课程设计的要求

通过测温元件获取实时温度和标准温度做比较,进而进行调节温度使其基本保持在某一个设置的温度范围之内。即高于标准温度时,启动相应的电机,带动风扇转动,进而降温。温度低于标准温度时,启动相应的加热丝,升高温度。这就是设计的基本要求。

1.3 课程设计的研究基础

调节反馈控制原理。通过实时温度与标准温度值的偏差进行控制的过程。

2 模拟自动恒温控制系统方案制定

2.1 方案提出

方案一:测温元件采用热敏电阻,但是实际处理时,需要增加模拟/数字转换电路。

模拟自动恒温控制系统5

图1 采用热敏电阻的电路原理图

方案二:测温元件采用DS18B20。此元件能够将温度值转换成数字值,性价比高。减少了硬件设计的成本,同时也减少了设计上的难度。

模拟自动恒温控制系统5

图2 采用DS18B20的温度控制系统原理图

2.2 方案比较

方案二测温元件选择DS18B20,此元件可以自动将温度值转化成数字值。方案一测温元件选择热敏电阻,热敏电阻价格高,不线性,需要复杂的恒流源伺服电路。硬件电路上必须要增加转换电路。

2.3 方案论证

通过以上俩个方案对比,选择方案二。因为他采用的测温元件是DS18B20。自动实现将温度值转换成数字值。降低硬件设计的难度,节约了成本。

2.4 方案选择

选择方案二

3模拟自动恒温控制系统方案设计

3.1各单元模块功能介绍及电路设计

温度采集电路:采用DS18B20,此元件能自动将温度值转换成数字信息,且性价比非常高。显示管:温度值的显示分为俩个部分,其一为实时温度值的显示,

其二为设置的标准温度值的显示。因此,设计时可考虑采用LCD将俩种数据同屏显示,也考虑采用多位16段数码管来分别显示俩种温度值数据。这里采用前一种设计方法。单片机选择采用AT80C51。

温度设置电路:通过按钮,设置标准的温度范围。

显示电路:采用液晶显示屏。

3.2电路参数的计算及元器件的选择

VDD:5V LCD外接驱动电压为-5.0~-14.0V。采用的元件有DS18B20,单片机AT89C51等。

3.3 特殊器件的介绍

测温元件及温度值转换方面的设计。虽然目前一些测温系统中有些是采用如热敏电阻或模拟典雅输出的温度传感器等测温元件,但实际这样处理时,硬件电路上就必须增加模拟或数字转换电路。DS18B20数字是温度传感器能自动将温度值转换成数字信息,且性价比非常高。 3.4 系统整体电路图

XTAL2

18

XTAL1

19

ALE 30EA

31

PSEN 29RST

9

P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78

P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD

17

P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1

AT89C51

X1

12MHz

C1

33p

C2

33p

R1

10k

C4

22u

23456789

1RP1

RESPACK-8

10k

D 7

14

D 613D 512D 411D 310D 29D 18D 07

E 6

R W 5R S 4V S S 1V D D 2V E E

3

LCD1

LM016L

7.3

DQ 2VCC 3GND

1

U2

DS18B20

R6

4k7

MS

+-

R7

220R

65

4

1

2

U3

OPTOCOUPLER-NPN

R8

1k

R9

10k

Q1

NPN

RL1

12V

D1

1N4001

+220v

+12v

D2

LED-RED

SCK 6SDA 5WP 7

A01A12A2

3

U4

24C02C

RL2

G2RL-1AB-DC5

Heater

T

OV1

OVEN

图3 系统未启动的状态图

4 模拟自动恒温控制系统仿真和调试 4.1 仿真软件介绍

本次设计采用Keil ,Proteus 两种软件。通过编译软件Keil 编写程序并生成.HEX 文件,然后在Proteus 中画好硬件电路图,调用HEX 文件进行虚拟仿真。Proteus 是多功能的EDA 软件,真正实现了虚拟物理原型功能,在目标板还没投产前,就可以对设计的硬件系统的功能、合理性和性能指标进行充分调整,并可以在没有硬件电路的情况下,进行相应的程序设计与调试,可由仿真原理图直接到处绘制成印制电路板[1][3][4]。 4.2 系统仿真实现

打开Keil 程序,执行菜单命令“Project ”-“New Project ”创建“模拟自动恒温控制系统的设计”项目,并选择单片机型号AT89C51。

执行菜单命令“File ”-“New ”创建文件,输入汇编源程序,保存为“模拟控制系统的设计.ASM ”。在Project 栏的File 项目管理窗口中右击文件组,选择“Add File to

Grounp ‘Source Grounp1’”,将源程序“模拟自动控制系的设计.ASM ”添加到项目中。

执行菜单命令“Project ”-“Options for Target 1”,在弹出的对话框中选择“Output ”选项卡,选中“Greate HEX File ”。在“Debug ”选项卡,选中“Use :Proteus VSM Simulator ”。 行菜单命令“File ”-“Build Target ”,编译源程序。如果编译成功,则在“Output Windows ”窗口中显示没有错误,并创建了“模拟自动恒温控制系统的设计.HEX ”文件。

在已绘制好的原理图Proteus ISIS 菜单栏中,执行执行菜单命令“Debug ”-“Use Remote Debug Monitor 将该项选中”,使Proteus 与Keil 真正连接起来,使他们联合调试。下图是系统刚开机没有进行操作时的工作状态图[2][5]。

XTAL2

18

XTAL1

19

ALE 30EA

31

PSEN 29RST

9

P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78

P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD

17

P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1

AT89C51

X1

12MHz

C1

33p

C2

33p

R1

10k

C4

22u

23456789

1RP1

RESPACK-8

10k

D 7

14

D 613D 512D 411D 310D 29D 18D 07

E 6

R W 5R S 4V S S

1V D D 2V E E

3

LCD1

LM016L

7.3

DQ 2VCC 3GND

1

U2

DS18B20

R6

4k7

MS

+-

R7

220R

65

4

1

2

U3

OPTOCOUPLER-NPN

R8

1k

R9

10k

Q1

NPN

RL1

12V

D1

1N4001

+220v

+12v

D2

LED-RED

SCK 6SDA 5WP 7

A01A12A2

3

U4

24C02C

RL2

G2RL-1AB-DC5

Heater

T

OV1

OVEN

图4 系统未运行时的状态图

在Keil 中执行菜单命令“Debug ”-“Start /Stop Debug Session ”,进入Keil 调试环境。同时,在Proteus ISIS 窗口中可看出Protues 也进入了程序调试状态。下图是系统运行后的状态图。

XTAL2

18

XTAL1

19

ALE 30EA

31

PSEN 29RST

9

P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78

P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD

17

P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1

AT89C51

X1

12MHz

C1

33p

C2

33p

R1

10k

C4

22u

23456789

1RP1

RESPACK-8

10k

D 7

14

D 613D 512D 411D 310D 29D 18D 07

E 6

R W 5R S 4V S S 1V D D 2V E E

3

LCD1

LM016L

32.1

DQ 2VCC 3GND

1

U2

DS18B20

R6

4k7

MS

+-

R7

220R

65

4

1

2

U3

OPTOCOUPLER-NPN

R8

1k

R9

10k

Q1

NPN

RL1

12V

D1

1N4001

+220v

+12v

D2

LED-RED

SCK 6SDA 5WP 7

A01A12A2

3

U4

24C02C

RL2

G2RL-1AB-DC5

Heater

0%

T

OV1

OVEN

图5 系统运行状态图

4.3 系统测试

常温情况下,PC 电脑一台,proteus 软件,保持在5至26度之间。 4.4 数据分析

数据表明,测试的温度与实时温度相差不大,保持在规定的温度范围之内。表明此系统符合规定的设计要求。 5 总结

5.1 设计小结

本次设计以经典低廉的单片机作为微控制器,设计了智能化高等特点模拟自动恒温控制系统。运用了很多知识点。因此要完成课程设计,必须要对知识点进行一个回顾和体会。

5.1 收获体会

本次设计,对proteus 这门课目有了更深层次的理解和运用。在编辑程序时需要全神贯注,不然很容易犯低级错误,打错字符等。在设计过程中,我感触最深的是查阅大量的资料。为了让自己的单片机课程设计更加完美,查阅资料时十分必要的,同时也是必不可少的。我们做课程设计,一切都要有据可依,有理可导,不切实际的构想只能是构想。

5.2 展望

单片机是目本文结合实际应用介绍了用AT89C51单片机实现模拟恒温控制系统设计的工作原理,以及硬、软件的设计方法及实现过程。本文重点论述实验室恒温控制系统控制电路的设计,主要是硬件电路的设计过程及软件的实现。对于单片机应用与控制领域,实现工业生产过程自动化和管理现代化有一定的普遍意义。前控制系统采用最多的器件和芯片,单片机的广泛应用及其产生的效益令人瞩目,在将来的各个领域里,将有着广阔的应用前景。 本设计的优缺点

在软件方面:我们采用模块化编程,思路清晰,使程序简洁、可移植性强。 6参考文献

[1] 楼然苗,等. 51系列单片机设计实例[M].北京航空航天出版社,2003.3. [2] 何立民,等.单片机高级教程.北京航空航天大学出版社,2001. [3] 赵晓安,等.MCS-51单片机原理及应用.天津大学出版社,2001.3. [4] 肖洪兵,等.跟我学用单片机.北京航空航天大学出版社,2002.8. [5] 夏继强,等.单片机实验与实践教程.北京航空航天大学出版社,2001.

7附录

7.1 系统主要功能展示图

XTAL2

18

XTAL1

19

ALE 30EA

31

PSEN 29RST

9

P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78

P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD

17

P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1

AT89C51

X1

12MHz

C1

33p

C2

33p

R1

10k

C4

22u

23456789

1RP1

RESPACK-8

10k

D 7

14

D 613D 512D 411D 310D 29D 18D 07

E 6

R W 5R S 4V S S 1V D D 2V E E

3

LCD1

LM016L

32.1

DQ 2VCC 3GND

1

U2

DS18B20

R6

4k7

MS

+-

R7

220R

65

4

1

2

U3

OPTOCOUPLER-NPN

R8

1k

R9

10k

Q1

NPN

RL1

12V

D1

1N4001

+220v

+12v

D2

LED-RED

SCK 6SDA 5WP 7

A01A12A2

3

U4

24C02C

RL2

G2RL-1AB-DC5

Heater

0%

T

OV1

OVEN

图6 系统运行状态图

7.2 器件清单

主要元件名称器件个数

AT89C51 1

24C0241

DS18B20 1

BUTTON 3

CRYSTAL 1

CAP 2

RELAY 1

NPN 1

OPPTOCOUPLED-NPN 1

LED-RED 1

MOTOR 1

RESPACK-8 1

RES 5

7.3 C程序如下:

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

模拟自动恒温控制系统,有所谓的自动功能

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

#include

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define BUSY 0x80 //lcd忙检测标志

#define DATAPORT P0 //定义P0口为LCD通讯端口sbit P1_4=P1^4; //时钟调整

sbit P1_5=P1^5; //时钟加

sbit P1_6=P1^6; //时钟减

sbit DQ = P1^7; //定义ds18b20通信端口

sbit LCM_RS=P2^0; //数据/命令端

sbit LCM_RW=P2^1; //读/写选择端

sbit LCM_EN=P2^2; //LCD使能信号

sbit sda=P2^3; //IO口定义

sbit scl=P2^4;

sbit OUT=P3^7; //控制继电器的闭合与否

sbit IN=P2^6; //发光二极管控制

uchar seconde=0; //定义并初始化时钟变量

uchar minite=0;

uchar hour=12;

uchar mstcnt=0;

uchar temp1,temp2,temp; //温度显示变量

uchar t,set; //工作模式set

uchar TEMH; //温度阈值

uchar TEML;

bit outflag; //温度上溢出

bit inflag; //温度下溢出

bit write=0; //写入24c02标志位

bit decide=0; //小数判断位

uchar code str0[]={"L: C H: C "}; //第一行显示

uchar code str1[]={"N: . C : : "}; //第二行显示

uchar code str2[]={" ERROR ACTION "}; //错误操作

//LCD的函数定义

void delay_LCM(uint); //LCD延时子程序

void initLCM( void); //LCD初始化子程序

void lcd_wait(void); //LCD检测忙子程序

void WriteCommandLCM(uchar WCLCM, uchar BusyC); //写指令到ICM子函数void WriteDataLCM(uchar WDLCM); //写数据到LCM子函数

void DisplayOneChar(uchar X,uchar Y,uchar DData); //显示指定坐标的一个字符子函数void DisplayListChar(uchar X,uchar Y,uchar code *DData); //显示指定坐标的一串字符

子函数//定时器函数定义

void init_timer0(void); //定时器初始化//显示操作void displayfun1(void); //正常情况显示内容void displayfun2(void); //设置小时时候光标闪动void displayfun3(void); //设置分钟时候光标闪动void displayfun4(void); //设置上限温度时候光标闪动void displayfun5(void); //设置下限温度时候光标闪动

void keyscan(void ); //键盘扫描子程序void set_adj(void); //调整温度、时钟子程序void inc_key(void); //加法调整void dec_key(void); //减法调整

//ds18b02

void delay_18B20(unsigned int i); //18b20延时void Init_DS18B20(void) ; //初始化uchar ReadOneChar(void); //18b20读一个字节void WriteOneChar(unsigned char dat); //18b20写一个字节void ReadTemperature(void); //18b20读环境温度//24c02

void delay1(uchar); //24c02延时void start(void); //开启

void stop(void); //停止

void writex(uchar); //写字节uchar readx(void); //读字节void clock(void); //时钟

uchar x24c02_read(uchar); //从某个地址读数据void x24c02_write(uchar,uchar); //向某个地址写数据void flash(void); //相当于一个延时void write24c02(void); //24c02写操作

void panduan(void); //判断温度有没越限/*********延时K*1ms,12.000mhz**********/

void delay_LCM(uint k)

{

uint i,j;

for(i=0;i

{

for(j=0;j<60;j++)

{;}

}

}

/**********写指令到ICM子函数************/

void WriteCommandLCM(uchar WCLCM,uchar BusyC)

{

if(BusyC)lcd_wait();

DATAPORT=WCLCM;

LCM_RS=0; // 选中指令寄存器

LCM_RW=0; // 写模式

LCM_EN=1;

_nop_();

_nop_();

_nop_();

LCM_EN=0;

}

/**********写数据到LCM子函数************/

void WriteDataLCM(uchar WDLCM)

{

lcd_wait( ); //检测忙信号

DATAPORT=WDLCM;

LCM_RS=1; // 选中数据寄存器

LCM_RW=0; // 写模式

LCM_EN=1;

_nop_();

_nop_();

_nop_();

LCM_EN=0;

}

/***********lcm内部等待函数*************/

void lcd_wait(void)

{

DATAPORT=0xff;

LCM_EN=1;

LCM_RS=0;

LCM_RW=1;

_nop_();

while(DATAPORT&BUSY)

{ LCM_EN=0;

_nop_();

_nop_();

LCM_EN=1;

_nop_();

_nop_();

}

LCM_EN=0;

}

/*********LCM初始化子函数***********/

void initLCM( )

{

DATAPORT=0;

delay_LCM(15);

WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号delay_LCM(5);

WriteCommandLCM(0x38,0);

delay_LCM(5);

WriteCommandLCM(0x38,0);

delay_LCM(5);

WriteCommandLCM(0x38,1); //8bit数据传送,2行显示,5*7字型,检测忙信号WriteCommandLCM(0x08,1); //关闭显示,检测忙信号

WriteCommandLCM(0x01,1); //清屏,检测忙信号

WriteCommandLCM(0x06,1); //显示光标右移设置,检测忙信号

WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号}

/****************显示指定坐标的一个字符子函数*************/

void DisplayOneChar(uchar X,uchar Y,uchar DData)

{

Y&=1;

X&=15;

if(Y)X|=0x40; //若y为1(显示第二行),地址码+0X40

X|=0x80; //指令码为地址码+0X80

WriteCommandLCM(X,1);

WriteDataLCM(DData);

}

/***********显示指定坐标的一串字符子函数***********/

void DisplayListChar(uchar X,uchar Y,uchar code *DData)

{

uchar ListLength=0;

Y&=0x01;

X&=0x0f;

while(X<16)

{

DisplayOneChar(X,Y,DData[ListLength]);

ListLength++;

X++;

}

}

/***********ds18b20延迟子函数(晶振12MHz )*******/

void delay_18B20(unsigned int i)

{

while(i--);

}

/**********ds18b20初始化函数**********************/

void Init_DS18B20(void)

{

unsigned char x=0;

DQ = 1; //DQ复位

delay_18B20(8); //稍做延时

DQ = 0; //单片机将DQ拉低

delay_18B20(80); //精确延时大于480us

DQ = 1; //拉高总线

delay_18B20(14);

x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay_18B20(20);

}

/***********ds18b20读一个字节**************/

unsigned char ReadOneChar(void)

{

uchar i=0;

uchar dat = 0;

for (i=8;i>0;i--)

{

DQ = 0; // 给脉冲信号

dat>>=1;

DQ = 1; // 给脉冲信号

if(DQ)

dat|=0x80;

delay_18B20(4);

}

return(dat);

}

/*************ds18b20写一个字节****************/

void WriteOneChar(uchar dat)

{

unsigned char i=0;

for (i=8; i>0; i--)

{

DQ = 0;

DQ = dat&0x01;

delay_18B20(5);

DQ = 1;

dat>>=1;

}

}

/**************读取ds18b20当前温度************/

void ReadTemperature(void)

{

unsigned char a=0;

unsigned char b=0;

unsigned char t=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳过读序号列号的操作

WriteOneChar(0x44); // 启动温度转换

delay_18B20(100); // this message is wery important

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度delay_18B20(100);

a=ReadOneChar(); //读取温度值低位,读完地址自动加1

b=ReadOneChar(); //读取温度值高位

temp1=b<<4;

temp1+=(a&0xf0)>>4;

temp2=a&0x0f;

switch(temp2)

{case(0x00): temp2=0x00;decide=0;break; //低4位分别代表着2 的负一次方,2的负二次方,2的负三次方,2的负四次方

case(0x01): temp2=0x00;decide=0;break; //decide为1时候代表十进制的小数第一位为1

case(0x02): temp2=0x01;decide=1;break;

case(0x03): temp2=0x01;decide=1;break;

case(0x04): temp2=0x02;decide=1;break;

case(0x05): temp2=0x03;decide=1;break;

case(0x06): temp2=0x03;decide=1;break;

case(0x07): temp2=0x04;decide=1;break;

case(0x08): temp2=0x05;decide=1;break;

case(0x09): temp2=0x05;decide=1;break;

case(0x0a): temp2=0x06;decide=1;break;

case(0x0b): temp2=0x06;decide=1;break;

case(0x0c): temp2=0x07;decide=1;break;

case(0x0d): temp2=0x08;decide=1;break;

case(0x0e): temp2=0x08;decide=1;break;

case(0x0f): temp2=0x09;decide=1;break;

default : break;

}

temp=((b*256+a)>>4); //当前采集温度值除16得实际温度值

}

/***************液晶显示子函数1正常显示*****************/

void displayfun1(void)

{

WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号DisplayListChar(0,0,str0);

DisplayListChar(0,1,str1);

DisplayOneChar(8,1,hour/10+0x30); //液晶上显示小时

DisplayOneChar(9,1,hour%10+0x30);

DisplayOneChar(11,1,minite/10+0x30); //液晶上显示分

DisplayOneChar(12,1,minite%10+0x30);

DisplayOneChar(14,1,seconde/10+0x30); //液晶上显示秒

DisplayOneChar(15,1,seconde%10+0x30);

DisplayOneChar(8,0,TEMH/10+0x30); //液晶上显示设定的温度上限DisplayOneChar(9,0,TEMH%10+0x30);

DisplayOneChar(2,0,TEML/10+0x30); //液晶上显示设定的温度下限

DisplayOneChar(3,0,TEML%10+0x30);

DisplayOneChar(2,1,temp1/10+0x30); //液晶上显示测得的温度

DisplayOneChar(3,1,temp1%10+0x30);

DisplayOneChar(5,1,temp2+0x30);

if(outflag==1) //显示HIGH

{ DisplayOneChar(12,0,0x48);

DisplayOneChar(13,0,0x49);

DisplayOneChar(14,0,0x47);

DisplayOneChar(15,0,0x48);

}

else if(inflag==1) //显示LOW

{ DisplayOneChar(12,0,0x20);

DisplayOneChar(13,0,0x4c);

DisplayOneChar(14,0,0x4f);

DisplayOneChar(15,0,0x57);

}

else //显示NORM

{ DisplayOneChar(12,0,0x4e);

DisplayOneChar(13,0,0x4f);

DisplayOneChar(14,0,0x52);

DisplayOneChar(15,0,0x4d);

}

}

/************液晶显示子函数2***************/

void displayfun2(void)

{

WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号DisplayListChar(0,0,str0);

DisplayListChar(0,1,str1);

DisplayOneChar(8,1,hour/10+0x30); //液晶上显示小时

DisplayOneChar(9,1,hour%10+0x30);

DisplayOneChar(11,1,minite/10+0x30); //液晶上显示分

DisplayOneChar(12,1,minite%10+0x30);

DisplayOneChar(14,1,seconde/10+0x30); //液晶上显示秒

DisplayOneChar(15,1,seconde%10+0x30);

DisplayOneChar(8,0,TEMH/10+0x30); //液晶上显示设定的温度上限DisplayOneChar(9,0,TEMH%10+0x30);

DisplayOneChar(2,0,TEML/10+0x30); //液晶上显示设定的温度下限DisplayOneChar(3,0,TEML%10+0x30);

DisplayOneChar(2,1,temp1/10+0x30); //液晶上显示测得的温度

DisplayOneChar(3,1,temp1%10+0x30);

DisplayOneChar(5,1,temp2/10+0x30);

WriteCommandLCM(0x0f,1); //显示屏打开,光标显示,闪烁,检测忙信号DisplayOneChar(8,1,hour/10+0x30);

DisplayOneChar(9,1,hour%10+0x30);

}

/**************液晶显示子函数3*****************/

void displayfun3(void)

{

WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号DisplayListChar(0,0,str0);

DisplayListChar(0,1,str1);

DisplayOneChar(8,1,hour/10+0x30); //液晶上显示小时

DisplayOneChar(9,1,hour%10+0x30);

DisplayOneChar(11,1,minite/10+0x30); //液晶上显示分

DisplayOneChar(12,1,minite%10+0x30);

DisplayOneChar(14,1,seconde/10+0x30); //液晶上显示秒

DisplayOneChar(15,1,seconde%10+0x30);

DisplayOneChar(8,0,TEMH/10+0x30); //液晶上显示设定的温度上限DisplayOneChar(9,0,TEMH%10+0x30);

DisplayOneChar(2,0,TEML/10+0x30); //液晶上显示设定的温度下限DisplayOneChar(3,0,TEML%10+0x30);

DisplayOneChar(2,1,temp1/10+0x30); //液晶上显示测得的温度

DisplayOneChar(3,1,temp1%10+0x30);

DisplayOneChar(5,1,temp2/10+0x30);

WriteCommandLCM(0x0f,1); //显示屏打开,光标显示,闪烁,检测忙信号DisplayOneChar(11,1,minite/10+0x30);

DisplayOneChar(12,1,minite%10+0x30);

}

/**************液晶显示子函数4 *****************/

void displayfun4(void)

{

WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号DisplayListChar(0,0,str0);

DisplayListChar(0,1,str1);

DisplayOneChar(8,1,hour/10+0x30); //液晶上显示小时

DisplayOneChar(9,1,hour%10+0x30);

DisplayOneChar(11,1,minite/10+0x30); //液晶上显示分

DisplayOneChar(12,1,minite%10+0x30);

DisplayOneChar(14,1,seconde/10+0x30); //液晶上显示秒

DisplayOneChar(15,1,seconde%10+0x30);

DisplayOneChar(8,0,TEMH/10+0x30); //液晶上显示设定的温度上限DisplayOneChar(9,0,TEMH%10+0x30);

DisplayOneChar(2,0,TEML/10+0x30); //液晶上显示设定的温度下限DisplayOneChar(3,0,TEML%10+0x30);

DisplayOneChar(2,1,temp1/10+0x30); //液晶上显示测得的温度

DisplayOneChar(3,1,temp1%10+0x30);

DisplayOneChar(5,1,temp2/10+0x30);

WriteCommandLCM(0x0f,1); //显示屏打开,光标显示,闪烁,检测忙信号DisplayOneChar(8,0,TEMH/10+0x30);

DisplayOneChar(9,0,TEMH%10+0x30);

}