电冰箱实验报告_第1页
电冰箱实验报告_第2页
电冰箱实验报告_第3页
电冰箱实验报告_第4页
电冰箱实验报告_第5页
已阅读5页,还剩29页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、常州信息职业技术学院智能电子产品综合项目实践设计报告2011 2012 学年 第 二 学期项目: 液晶屏显示电冰箱温控器的设计班级: 计应104 学号: 姓名: 朱伟洵授课教师: 居平制定日期: 2012 年 6 月 第一章 总体设计1.1 项目产生的背景及意义 冰箱是深刻改变了人类生活的现代奇迹之一。在人们发明冰箱之前,保存肉类的唯 一方法是腌制,而在夏天喝到冰镇饮料是一种奢侈。随着郭明经济的日益发展,人民的生活 水平有了很大的提高,冷冻器具在家庭,医院,旅馆,餐厅和科研单位得到了广泛的应用。电冰箱作为应用较为普遍的家庭电器,近年来,随着微电子技术、传感器技术以及控制理论的发展,其呈现迅猛发

2、展,电冰箱向大容量、多功能、无氟、节能、智能化、人性化方向发展,因此传统的机械式、简单的电子控制难以满足现代冰箱的发展要求。电冰箱一般设有冷冻室和冷藏室。冷冻室的温度为:-16-24.摄氏度,冷藏室的温度为:28摄氏度。电冰箱控制的主要任务就是保持箱内食品最佳温度,达到保鲜的目的。1.2 项目功能 液晶显示电冰箱温控器的设计是以单片机AT89C51作为核心控制器,利用DALAS一线式温度传感器DS18B20实现对电冰箱内冷藏室和冷冻室的温度采集。通过按键可以对电冰箱内冷藏室和冷冻室的温度进行预先设定。当电冰箱内的温度值高于用户设定的温度值时,系统将由单片机控制继电器自动开启压缩机进行制冷,使冰

3、箱内温度自动降温,当电冰箱内的温度值低于设定温度值时,系统将由单片机控制继电器自动关闭压缩机停止制冷,以此来自动实现电冰箱内温度的自动调节。同时相关的状态信息要在点阵汉字液晶屏上实时地显示。将当前时间显示在液晶屏上,并可以通过按键来更改当前时间,将冰箱外的温度显示在液晶屏上。在液晶屏上显示汉字和当前时间项目功能项目功能将冷藏室和冷冻室的现时温度显示在液晶屏上通过按键更改冷藏室和冷冻室的标准温度,从而来控制压缩机的开关定时器控制当前时间走时,通过按键更改当前时间1.3 具体要求在汉字液晶屏上显示,第一行显示冷藏室: ,第二行显示冷冻室: ,第三行显示压缩机: (当冷藏室温度小于冷藏室标准设置温度

4、并且冷冻室温度小于冷冻室标准设置温度时,压缩机显示关,则其它情况下压缩机显示开),第四行显示out: ,第五行显示clock: 。长按按键时,清屏,在屏幕上显示冷藏室: 、冷冻室: ,更改标准温度值。短按按键时,更改当前时间,更改的时间以黑底白字显示。第2章 硬件设计2.1 硬件设计 图2-1 液晶屏显示电冰箱温控器硬件电路 如图2-1所示,液晶模块与单片机的连接采用模拟输入输出口,用3个数字温度传感器DS18B20构成3个电子温度计,将所测的温度值在液晶屏显示出来。通过按键改变当前时间和标准温度值。2.2 器件介绍图2-2单片机89C51:如图2-2所示为89C51的引脚图,MCS-51系列

5、单片机的内部结构包括CPU,振荡器及定 时电路,程序存储器,数据存储器,定时器/计数器,总线扩展控制,可编程I/O口,可编程串行口。CPU是单片机的核心,MCS-51系列单片机内含一个高性能的8位中央处理器,CPU的作用是从ROM中读取指令并进行分析,然后根据指令的功能控制单片机的功能部件执行操作。CPU由运算器和控制器两大功能器件组成。单片机内部有P0,P1,P2,P3 4个8位双向I/O口,外设与这些端口可以之间相连,无需另外的接口芯片。P0P3既可以按字节输入或输出,也可以按位进行输入或输出,共32条口线,其控制十分灵活方便。各个端口的结构、功能有所不同。在该项目中,主要运用的就是单片机

6、的输入输出口P1、P3口。温度传感器DS18B20:DS18B20的测温范围是-55度125度,12位温度读数,分辨率为1/16摄氏度,温度转换时间最多位750ms,其引脚图如图2-3所示。DQ:数据输入输出。在数据总线供电方式可给传感器提供电源。VDD:可选的电源电压。DS18B20有两种供电方式,数据总线供电方式和外部供电方式。GND:电源地。图2-3每个DS18B20均有一个唯一的产品序列号,固化在内部的64位激光ROM中,其格式是:低8位是产品的工业代码,中间是每个器件唯一的48位序列号,高8位是针对前面56位的CRC校验码,这也是多个DS18B20可以采用一条数据线进行通信的原因,只

7、要单片机用匹配命令即可访问总线上指定的DS18B20。点阵液晶屏TG12864B:TG12864B点阵液晶屏(如图2-4)显示模块是由128*64个液晶屏显示点组合的一个阵列,每个显示点对应一位二进制数,1表示点亮,0表示灭,储存这些点阵信息的RAM称为显示数据存储器,为了在屏幕指定位置显示某个图形或字符,需要将相应的点阵信息写入到DDRAM相应的单元中。图2-4TG12864B液晶屏实际上是由左右两块独立的64*64点阵液晶屏拼接而成,每半屏有一个8*64*8bitDDRAM,左右半屏驱动电路及存储分别有片选信号CS1和CS2选择。显示点在64*64液晶屏上的位置由行号(063)与列号(06

8、3)确定。DDRAM中某个存储单元由页地址(07)和列地址(063)确定。每个存储单元的8位二进制数对应屏幕上同一列的8个点阵。其引脚功能说明如表2-1所示:VDD/VSS:电源5(110%)V或接地。VSS/VDD:接地或电源5(110%)V。VDD:反视度调整。使用可变电阻调整,通常接地。RS:寄存器选择。1为选择数据寄存器;0为选择指令寄存器。R/W:读/写选择。1为读;0为写。E:使能操作。1为LCM可做读写操作;0为LCM不能做读写操作。DB0DB7:双向数据总线的第07位。VDD:背光显示器电源+5V。VSS:背光显示器接地。管脚号管脚引脚说明1 VSS 电源地 2 VDD 电源正

9、极(V) 3 VO 液晶显示器对比试调整端 4 D/I 数据/指令选择:当/I为高电平时,DB0DB7为显示数据 当D/I为低电平时,DB0DB7为指令数据 5 R/W 读/写选择:当R/W为高电平时,从液晶模块读数据 当R/W为低电平时,将数据写入液晶模块 6 E 读写使能,高电平有效,下降沿锁定数据 714 DB0DB7 8位并行数据总线 15 CS1 片选择信号,高电平时选择前64列 16 CS2 片选择信号,高电平时选择后64列 17 RST 复位信号,低电平有效 18 VEE LCD驱动电源(10V) 19 BLA 背光电源,LED+ 20 BLK 背光电源,LED- 表2-1 定时

10、器:在51系列单片机中有两个16位的加法计数器,分别叫做T0和T1.它们在计数脉冲的作用下,其计数值不断加1,在此过程中,计数器可能产生溢出,产生溢出后,可以向CPU发出中断请求。计数脉冲可以来源于系统时钟或外部电路。如果计数脉冲来自系统时钟,称之为定时器,每个机器周期计数器加1,;如果计数脉冲来自外部电路,称之为计数器。定时器方式寄存器TMOD用于控制定时器/计数器的工作方式,不具有位寻址能力。TMOD寄存器的高4位用于T1的设定,低4位用于T0的设定,其定义相同。定时器/计数器T1定时器/计数器T0D7D6D5D4D3D2D1D0GATEC/TM1M0GATEC/TM1M0表2-21 M0

11、、M1:选择定时器/计数器的工作方式,T0有4种工作方式,T1有三种工作方式,00为方式0,01为方式1,10为方式2,11为方式3。2 C/T:定时方式/计数方式的选择控制位。C/T=0,选定时方式,计数脉冲来自系统时钟的12分频;C/T=1,选计数方式,计数脉冲来自外部电路。3 GATE:位被称为“门控制”。当GATE=0时,只要TR0=1,与门的输出就为1,计数开始。如果GATE为1时,只有TR0=1,并且P3.2-1时,才允许计数。4 在使用定时器/计数器时,首先应根据要求对工作方式进行初始化,然后计算出初始值,初始化时应向TMOD寄存器写入工作方式控制字,将计数器的初值写入TH0、T

12、L0/TH1、TL1,启动定时器/计数器,将TR0/TR1置1,采用中断方式,应将EA,ET0/ET1置1.图2-5 按键:本系统中用到了4个按键,分别为K13,K14,K15,K16,通过按键来更改当前时间和设置标准温度值。其定义如下: #define KSET 0xe0 #define KSET_LONG 0xe1 #define KINC 0xd0 #define KDEC 0xb0 #define KDOWN 0x70第3章 软件设计 液晶屏显示电冰箱温控器分四个模块,一为主函数模块,二为读取温度值,三位液晶屏显示,四为定时器3.1 液晶屏显示模块 液晶屏显示结果如图3-1所示,第一行

13、显示冷藏室: ,第二行显示冷冻室: ,第三行显示压缩机: ,第四行显示out: ,第五行显示clock: 。图3-1 TG12864B液晶屏显示4行16*16点阵的汉字,每行显示8列,如果列号小于4,则显示在左半屏,否则显示在右半屏。由于一个汉字占用2页,程序首先必须设置上半个汉字的页地址,起始列,并输出16个字节数据,随后设置下半个汉字的页地址、起始列地址,并输出16个字节数据,流程图如图下所示:#define uchar unsigned char#define uint unsigned int#define KSET 0xe0#define KSET_LONG 0xe1#define

14、KINC 0xd0#define KDEC 0xb0#define KDOWN 0x70extern void LCD_DispIni(void);extern void Init_Timer0(void);extern void LCD_DispFill(uchar filldata);extern void LCD_DispChar(bit color,uchar cy,uchar cx,char dispdata);extern void LCD_DispStr(bit color,uchar cy,uchar cx,char * disp_str);extern void LCD_Di

15、spHZ(uchar cy,uchar cx,uchar dispdata);extern void LCD_DispHZStr(uchar cy,uchar cx,uchar *disp_str);extern void gettemp(int t);extern void readid(uchar *id);extern unsigned char time3=06,50,55; /时间:时、分、秒缓存extern void clear(void);char dbuf2=5,-15;uchar max3=24,60,60;/uchar count=0;uchar dp16=0,0,1,1,

16、2,3,3,4,5,5,6,6,7,8,8,9;uchar buf04=2,3,4,0xff;uchar buf14=2,5,4,0xff;uchar buf24=8,9,10,0xff;uchar buf32=7,0xff; /开uchar buf42=6,0xff; /关uchar buf52=11,0xff;uchar buf65=12,13,14,15,0xff;void delay(uchar t)uchar i; while(t-) for(i=0;i250;i+);void show(void) LCD_DispIni(); LCD_DispHZStr(0,0,buf0); LC

17、D_DispChar(0,1,7,:); LCD_DispHZStr(0,7,buf5); LCD_DispHZStr(1,0,buf1); LCD_DispChar(0,3,7,:); LCD_DispHZStr(1,7,buf5); LCD_DispHZStr(2,0,buf2);LCD_DispChar(0,5,7,:);LCD_DispStr(0,6,0,out);开始以filldata充填液晶屏初始化液晶屏复位驱动芯片打开显示在液晶屏的cy(03)行,cx(07)列显示汉字字符点阵列号为8?在左半屏显示在右半屏显示求出汉字子啊屏幕上的起始列设置汉字的页,列地址,显示汉字结束YN 流程

18、图3-1LCD_DispChar(0,6,3,:); LCD_DispStr(0,7,0,clock); LCD_DispChar(0,7,6,:); 3.2 温度显示 温度显示是从温度传感器DS18B20 中读取温度,并将温度转换为ASCII值,显示在液晶屏上。图3-2 系统采用各点温度时,为了提高轮巡的速度,启动温度转换命令无需针对某个特定的传感器,可先对总线上的所有传感器复位,并跳过ROM,发启动温度转换命令,这样所有挂在总线上的DS18B20同时开始转换,转换结束后,单片机再依次发匹配ROM命令,将预先存储的各传感器的序列号通过单总线送出,选中指定的DS18B20,并将温度值读入,流程

19、图所示:开始检测传感器温度值当前温度值0?求出绝对值将温度值转换为xx.x格式的字符串去除高位的0字符在LCD指定位置显示温度值测温的主程序流程图3-3开始复位DS18B20发跳过ROM命令启动所有传感器转换延时,等待转换完成复位DS18B20发匹配命令发送当前传感器的序列号,选中指定传感器发读暂存器命令读取两字节的温度值返回各路检测完成 测温程序流程图3-2主程序:检测传感器的温度值,并将其转换成字符串,在液晶屏的指定位置显示出来。 void main() uchar str6=0,0,0,0,0,0; int temp1; bit zf; while(1) gettemp(t); For(

20、i=0;i3;i+) zf=0; if(temp04; str0=ti/100+0x30; ti=ti%100; str1=ti/10+0x30; str2=ti%10+0x30; str3=.; if(zf=1) if(str1=0) str0= ; str1=-; else str0=-; else if(str0=0) if(str1=0) str1= ; str0= ; LCD_DispStr(0,3*i,8,str); 3.3 显示当前时间 在液晶屏的的指定位置显示当前时间,跟在液晶屏上显示温度时同一道理。以下是显示当前时间的主要函数: void DispTime(void) LCD

21、_DispDatt(0,7,8,time0); LCD_DispChar(0,7,10,:); LCD_DispDatt(0,7,11,time1); LCD_DispChar(0,7,13,:); LCD_DispDatt(0,7,14,time2);void LCD_DispDatt(bit color,uchar cy,uchar cx,char dat) uchar str3; str0=dat/10+0x30; str1=dat%10+0x30; str2=0; LCD_DispStr(color,cy,cx,str);3.3 按键 通过按键改变标准温度值,长按K13键进入更改界面,

22、如图3-3所示,K14键加,K15键减,在汉字液晶屏指定位置显示,K16控制上下移动,短按K13键退出更改界面,更改后的值覆盖原来的值,控制压缩机的开关,冷藏室和冷冻室标准温度分别控制在015,-200以下就是关于按键的主要函数:void LCD_DispDat(bit color,uchar cy,uchar cx,char temp) 图3-3 uchar zf=0; uchar str5=0,0,0,0,0; if(temp15) dbuf0=0; if(dbuf10) dbuf1=0; LCD_DispDat(0,5*col,8,dbufcol); else if(key=KDEC)

23、dbufcol-; if(dbuf00) dbuf0=0; if(dbuf1-20) dbuf1=0; LCD_DispDat(0,5*col,8,dbufcol); else if(key=KDOWN) LCD_DispDat(0,5*col,8,dbufcol); col=(col+1)%0x02; LCD_DispDat(0,5*col,8,dbufcol); else if(key=KSET) LCD_DispIni(); break; 通过按键更改当前时间,并以黑底白字显示,并在指定位置显示,短按K13进入更改函数,如图3-4所示,K14键加,K15键减,长按K13退出更改函数0,以

24、下是有关按键的主要函数:图3-4void EditTime(void)uchar col=0; uchar k; EA=0; DispTime(); LCD_DispDatt(1,7,col*3+8,timecol); while(1) k=GetKey(); if(k=KINC) timecol+; if(timecol=maxcol) timecol=0; LCD_DispDatt(1,7,8+col*3,timecol); else if(k=KDEC) timecol-; if(timecol=0xff) timecol=maxcol-1; LCD_DispDatt(1,7,8+col

25、*3,timecol); else if(k=KDOWN) LCD_DispDatt(0,7,8+col*3,timecol); col=(col+1)%0x03; LCD_DispDatt(1,7,8+col*3,timecol); else if(k=KSET_LONG) LCD_DispDatt(0,7,8+col*3,timecol); DispTime(); break; 在主函数中添加程序: key=GetKey(); if(key=KSET_LONG) LCD_DispIni(); LCD_DispHZStr(0,0,buf0); LCD_DispChar(0,0,7,:); L

26、CD_DispHZStr(2,0,buf1); LCD_DispChar(0,5,7,:); SetSJ(); show(); if(key=KSET) EditTime(); DispTime(); EA=1;图3-5 3.4 压缩机状态 当前压缩机状态根据当前的冷冻室温度或者冷藏室温度来调节显示,在本程序中初始设置冷冻室和冷藏室的标准温度是5,-5,当当前冷藏室温度小于5度并且冷冻室温度小于-5度时,压缩机状态显示关,在其它任何情况下显示开,判断程序如下:图3-6if(t0dbuf0)&(t1dbuf1) LCD_DispHZStr(2,5,buf4);else LCD_DispHZStr

27、(2,5,buf3);开始3.4 总流程图:初始化液晶屏,将汉字在指定位置显示检测温度值当前温度0?求出绝对值将温度值转换为xxx.x格式的字符串,去除高位的0字符,在液晶屏指定位置显示。定时器控制当前时间走时,在屏幕指定位置显示NNY长按按键K13?进入修改标准温度界面进入修改当前时间状态显示压缩机状态YN显示压缩机状态按键K14是否按下?N值的加1YNY值减1按键K16是否按下按键左移或者右移按键K15是否按下N退出短按K13退出结束流程图3-4第四章 程序检测4.1 调试方法 此项目的调试可以在protues中调试,也可以在keil中调试,在实践中,我们用keil调试程序,温度传感器DS

28、18B20的DQ端接到单片机的P10口,液晶屏的DI接到单片机的P13,RW端连接到单片机的P14,CS选择屏端连接到单片机的P16,E端连接到单片机的P15,DB0DB7显示数据连接到单片的P00P07;与单片机实验板连接以后,编译并全速运行,看实验板的显示是否正确。对于程序调试,有两种基本的错误就是语法错误和逻辑错误,对于语法错误,是很好更改的,在我们编译程序之后,下方会出现错误提示,双击错误,系统就会自动之处你哪一行有错。如果语法错误改完之后,编译,仍无法运行,则是逻辑错与,逻辑错误时比较难的,这时候我们不能全速运行程序,我们可以根据自己的经验,大概猜出哪里有错,设置断点,运行,如果那个

29、断点无法运行到说明这段程序有错误,其实找错还有其他方法,这也要根据个人的能力。4.2 调试步骤第一步:首先先确保液晶屏汉字的正确显示,如果液晶屏没有正确显示,检查电路,如果硬件连线没有错误,检查程序,可以用断点进行运行也可以单目运行,看哪一步出现错误并加以改正。 第二步:温度的检测,检查温度是否正常显示,当前时间是否正常走时。第三步:K13是否按下,短按K13进入更改当前时间状态,K14加数值,K15减数值,K16左右移,长按按键K13退出。长按K13进入更改标准温度值的界面,K14加数值,K15减数值,K16上下移,短按K13键退出设置界面,返回原来界面。第四步:检查压缩机状态是否根据温度的

30、变化而变化。4.3 调试过程中遇见的问题及解决方法问题一:液晶屏没有任何的显示解决办法:对于出现问题,不是硬件问题就是软件问题,所以逐个排查,先检查硬件,看是否连线有错误,检查之后无错误,所以问题出现在程序部分,检查程序,发现液晶屏没有初始化,并且LCD_DispStr中有错误,更改,显示位置不正确,更改,显示正确。问题二:温度不能正常读取解决办法:单目运行,检查temp是否有值,检查之后发现temp没有任何值,检查读取温度值的函数,发现没有返回温度值,更改,发现温度值还是无法正常显示,检查后发现,因为每个DS18B20都有一个属于自己的序列号,所以要更改protues仿真图中的温度传感器的序

31、列号。问题三:按键无效解决方法:按键无效,硬件没有问题,那么问题就出现在软件,按键无效,按键键值没有正确读取,单目运行,发现在按键的函数中出现死循环,键值根本没有传递,所以按键无效,更改函数,可以正常使用。问题四:在更改标准温度的界面,初始值无法正常显示,加减后的值出现乱码的现象,上下移键多按几次,其他行也出现数字解决方法:显示不正常,在显示程序中出现错误,是温度显示,正负号没有考虑,原来使用的数字在液晶屏上显示的显示函数,更改之后可以正常显示,加减乱乱码的现象也不存在了。对于上下键,会出现多行显示,是因为,没有控制好行,导致(k=KDOWN)一直在执行,所以更改程序将行控制在01之间。问题五

32、:更改当前时间时,数值会将后面的冒号覆盖解决方法:检查按键函数,主要更改LCD_DispDatt中的列,所以在编写时要仔细算清楚显示的行和列,只有这样才能出现你所需要的现象。问题五:压缩机的开关不能正常显示解决方法:压缩机的状态的开关显示,主要是判断语句,经过多次检查,才发现原来的判断函数在标志位取反之后,导致原来是负数的温度变成正数,从而压缩机的开关显示不正常,将判断语句提到标志位之前,编译运行,发现可以正常显示。问题六:时间不能正常走时 解决方法:时间不能正常走时,就是定时器的问题,更改定时器,发现可以正常走时。第五章 小结本项目是液晶屏显示电冰箱温控器设计,以单片机89C51为核心,介绍

33、以它为控制系统的液晶屏显示,温度检测和定时器的使用设计等。在报告中详细介绍了液晶屏显示LCD12864B,温度传感器DS18B20,定时器的功能、原理及相应的程序设计等。单片机控制系统程序采用C51语言进行编辑的,通过编程控制液晶屏汉字显示的位置、冷藏室、clock、out。在项目开始时,老师没有一开始就让我们做项目,而是通过书上的一个小项目和更改来让我们复习有关这个项目的器件使用和程序编写,这为我们在编写项目程序时节省了很多时间。通过老师对项目的分解,发现这个项目大多数的函数在自动打铃系统中都可以找到,只要加以更改就可以实现项目的要求。第一步是汉字显示,这个是不难的,在学习单片机项目自动打铃

34、系统的设计时我们就已经涉及到汉字在液晶屏的显示,更改显示汉字的点阵码和显示位置,汉字显示很快就做好了,第二步是温度的检测,对于温度的显示出现的错误跟以前的大同小异根据以前的经验加上和同学的探讨,温度显示也不是很难。第三部是按键,关于按键的使用,在自动打铃系统中已经涉及,只要加以更改,就可以变成我们所需要的,但并不是这样就可以正常运用,在编译运行时,也出现错误,通过进一步的更改和完善,才能正常使用。所以在编写程序时,不能焦躁,耐心处理错误,我们所面对的问题总会解决。在这个项目的实践过程中,我学到了很多,其实这个项目总体上不是很难,除了程序的编写,大部分时间都花费在编译程序上,查找错误并改正。所以

35、我们除了要会编写程序之外也要积极动脑去找错误,不能只改了语法错误之后,还是无法正确实现的时候,放弃查找错误,等着别人来帮你。对于程序要理解,理解它每一个语句的功能,只有这样,在出现错误时,你才知道大概是哪个地方出错,而不是盲目的找错,那样只会浪费时间,反而找不到错误。在设计项目时,发现不要将它放大化,当将项目分解开来,一个一个模块进行调试,发现其实没有自己想象的那么难,所遇到的问题就可以很快的解决。一个一个模块的编写和实现使整个项目的实现变得快速、简单。我能做出这个项目除了个人的努力之外,还有同学的帮忙,同学的互相讨论也使得更快的解决问题,类似的错误大家都知道怎样改正,互相学习,更有利于项目的

36、实现。附录DS18B20.C包含了与DS18B20的相关函数,程序清单如下:#define uchar unsigned char#define uint unsigned int#include#includesbit DQ=P10;bdata uchar dat; sbit dat0=dat0;sbit dat7=dat7;uchar code id48=0x28,0x22,0xc5,0xb8,0x00,0x00,0x00,0xBB, 0x28,0x23,0xc5,0xb8,0x00,0x00,0x00,0x8c, 0x28,0x24,0xc5,0xb8,0x00,0x00,0x00,0x

37、09;void delay15(uchar n)/15us延时函数 do _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();n-; while(n); void late(void) uchar i; for(i=0;i0;i-) /循环写8位(先低位,后高位) DQ=0; /产生15us的负脉冲 delay15(1); DQ=dat0;/将当前数据位送数据线 dat=dat1;/将下一位要写入的数据移到最低位 delay15(1)

38、;/延时15us DQ=1; /数据线拉高,为写入下一位做准备 uchar rdbyte(void)/从DS18B20读取一个字节 uchar i; dat=0;/读出数据初值为0 for(i=8;i0;i-) /循环读8位(先低位,后高位) dat=dat1; /读出数据先右移一位DQ=0; /产生1us的负脉冲_nop_(); DQ=1;/数据总线拉高 delay15(1); /延时15us dat7=DQ;/读取数据 delay15(4); /延时,为读下一位做准备 return(dat); void readid(uchar id) uchar n; reset(); /复位DS18B

39、20 wrbyte(0x33); /发READ ROM命令 for(n=0;n=8;n+) /读取8个字节的序列号 idn=rdbyte(); void gettemp(int t) uchar m,n; uchar h,l; reset(); wrbyte(0xcc); wrbyte(0x44); late(); for(m=0;m3;m+) reset(); wrbyte(0x55); for(n=0;n8;n+) wrbyte(idmn); wrbyte(0xbe); l=rdbyte(); h=rdbyte(); tm=h*256+l; LCD.C,汉字点阵码用省略号显示,程序清单如下

40、:#include #include#include #define uchar unsigned char#define uint unsigned intsbit LCD_RST= P37;sbit DI=P34;sbit RW=P35;sbit CS=P33;sbit EN=P36;sbit RDY=P07; sfr LCD=0x80;#defineLCD_DISPON 0x3f / 打开LCM显示命令 #define LCD_STARTROW 0xc0 / 设置起始行命令,用LCD_STARTROW+x设置起始行(x64) #defineLCD_ADDRSTRY 0xb8 / 设置页地

41、址命令,用LCD_ADDRSTRX+x设置当前页(x8) #defineLCD_ADDRSTRX 0x40 / 设置列地址命令,用LCD_ADDRSTRY+x设置当前列(x64)#define CS1 0 /左半屏选择#define CS2 1 /右半屏选择/命令字cmd送左半屏(port=0)/右半屏(port=1)命令口void LCD_WrCmd(bit port, uchar cmd) EN=0; CS=port; DI=0; RW=0; EN=1; LCD=cmd; EN=0;/数据wrdata送左半屏(port=0)/右半屏(port=1)数据口void LCD_WrDat(bit

42、 port, uchar wrdata)EN=0; CS=port; DI=1; RW=0; EN=1; LCD=wrdata; EN=0;uchar code ASCII_TAB480 = /0x200x7F之间 ASCII码对应的点阵数据表 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x28, 0xfe, 0x28, 0xfe, 0x28, 0x48, 0x54, 0xfe, 0x54, 0x24, 0x46, 0x26, 0x10, 0xc8, 0xc4

43、, 0x6c, 0x92, 0xaa, 0x44, 0xa0, 0x00, 0x0a, 0x06, 0x00, 0x00,0x00, 0x38, 0x44, 0x82, 0x00, 0x00, 0x82, 0x44, 0x38, 0x00,0x28, 0x10, 0x7c, 0x10, 0x28, 0x10, 0x10, 0x7c, 0x10, 0x10,0x00, 0xa0, 0x60, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10,0x00, 0xc0, 0xc0, 0x00, 0x00, 0x40, 0x20, 0x10, 0x08, 0x04,0x7

44、C, 0xA2, 0x92, 0x8A, 0x7C, 0x00, 0x84, 0xFE, 0x80, 0x00,0x84, 0xC2, 0xA2, 0x92, 0x8C, 0x42, 0x82, 0x8A, 0x96, 0x62,0x30, 0x28, 0x24, 0xFE, 0x20, 0x4E, 0x8A, 0x8A, 0x8A, 0x72,0x78, 0x94, 0x92, 0x92, 0x60, 0x02, 0xE2, 0x12, 0x0A, 0x06,0x6C, 0x92, 0x92, 0x92, 0x6C, 0x0C, 0x92, 0x92, 0x52, 0x3C,0x00, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0xAC, 0x6C, 0x00, 0x00,0x10, 0x28, 0x44, 0x82, 0x00, 0x28, 0x28, 0x28, 0x28, 0x28,0x00, 0x82, 0x44, 0x28, 0x10, 0x04, 0x02, 0xA2, 0x1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论