课程设计内容
课程设计
目录
一、概述„„„„„„„„„„„„„„„„„„„错误!未定义书签。
二、设计思路„„„„„„„„„„„„„„„„„„„3
三、软件及元件的选取介绍„„„„„„„„„„„„„4
(一)Proteus 简介„„„„„„„„„„„„„„„„4
(二)、主控器A T89C51单片机简单介绍„„„„„„„4
(三)DS18B20简单介绍„„„„„„„„„„„„„5
(四)显示器LCD1602简单介绍„„„„„„„„„„5 四、电路设计„„„„„„„„„„„„„„„„„7 五、系统程序设计„„„„„„„„„„„„„„„9 六、总结及心得„„„„„„„„„„„„„„„„12 参考文献„„„„„„„„„„„„„„„„„„12 附录(程序清单)„„„„„„„„„„„„„„11 Proteus 仿真图
工作流程图
一、概述
由于科技的不断进步,现代信息技术的飞速发展传统工业改造的逐步实现,能够独立工作的温度检测和显示系统应用于诸多领域。这里设计的数字温度计具有读数方便,测温范围广,测温精确,数字显示,适用范围宽等特点。在工业生产中温度是常用的被控参数,而采用单片机来对这些被控参数进行控制已成为当今的主流,本可课程设计选用AT89C51型单片机作为主控制器件,DS18B20作为测温传感器, 通过LCD1602实现温度显示。通过DS18B20直接读取被测温度值,进行数据转换,该器件的物理化学性能稳定,线性度较好,在0℃~100℃最大线性偏差小于0.01℃。该器件可直接向单片机传输数字信号,便于单片机处理及控制。另外,DS1820具有测温系统简单、测温精度高、连接方便、占用口线少等优点。而
LCD1602是工业字符型液晶,能够同时显示16x02即32个字符,具有微功耗、体积小、显示内容丰富、超薄轻巧,常用在袖珍式仪表和低功耗应用系统中。
二、设计思路
采用数字温度芯片DS18B20 测量温度,输出信号全数字化。采用了单总线的数据传输,由数字温度计DS18B20和AT89C51单片机构成的温度测量装置, 它直接输出温度的数字信号, 也可直接与计算机连接。采用AT89C51单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。该系统利用AT89S51芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限温度。该系统扩展性非常强。该测温系统电路简单、精确度较高、实现方便、软件设计也比较简单。系统框图如图1所示。
图一 温度检测及显示系统框图三、软件及元件的选取介绍
(一)Proteus 简介
Proteus ISIS是英国Labcenter 公司开发的电路分析与实物仿真软件。它运行于Windows 操作系统上,可以仿真、分析(SPICE )各种模拟器件和集成电路,该软件的特点是:
(1)实现了单片机仿真和SPICE 电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C 调试器、SPI 调试器、键盘和LCD 系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
(2)支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、A VR 系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11
系列以及各种外围芯片。
(3)提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision3等软件。
(4)具有强大的原理图绘制功能。总之,该软件是一款集单片机和SPICE 分析于一身的仿真软件,功能极其强大。
(二)、主控器A T89C51单片机简单介绍
1、AT89C51 提供以下标准功能:
4k 字节Flash 闪速存储器,128字节内部RAM ,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz 的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU 的工作,但允许RAM ,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM 中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
2、主要特性:
与MCS-51 兼容; 4K 字节可编程FLASH 存储器;寿命:1000写/擦循环;数据保留时间:10年;全静态工作:0Hz-24MHz ;三级程序存储器锁定;28×8位内部RAM ;32可编程I/O线;两个16位定时器/计数器;5个中断源;可编程串行通道;低功耗的闲置和掉电模式;片内振荡器和时钟电路。
(三)DS18B20简单介绍:
DS18B20数字温度计是DALLAS 公司生产的1-Wire ,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。其实物图如图所示,其引脚的功能描述可见下表所示。 DS18B20的引脚功能描述 引脚 GND DQ
VDD 功能说明 地 数字输入输出引脚 可选的VDD 引脚
DS18B20的特点:
(1)只要求一个端口即可实现通信。
(2)在DS18B20中的每个器件上都有独一无二的序列号。
(3)实际应用中不需要外部任何元器件即可实现测温。
(4)测量温度范围在-55°C 到+125°C 之间。
(5)数字温度计的分辨率用户可以从9位到12位选择。
(6)内部有温度上、下限告警设置。
AT89C51与温度芯片DS18B20的连接
在仿真软件中,可以用DS18B20仿真器上的上、下键来调节温度的高低,以此来检测读、写温度程序是否成功。具体的DS18B20与AT89C51连接如图2-14所示.
(四)显示器LCD1602简单介绍
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。 1602LCD 是指显示的内容为16X2, 即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
1602LCD 的特性: ●+3.3V电压,对比度可调;
●内含复位电路;
●提供各种控制命令, 如:清屏、字符闪烁、光标闪烁、显示移位等多种功能; ●有80字节显示数据存储器DDRAM ;
●内建有192个5X7点阵的字型的字符发生器:
●8个可由用户自定义的5X7的字符发生器CGRAM :
图2-7 LCD1602外观
LCD1602采用标准的14脚接口,其中VSS 为地电源,VDD 接5V 正电源,VEE 为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K 的电位器调整对比度。RS 为寄存器选择,高电平时选择数据寄存器、
低电平时选择指令寄存器。RW 为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS 和RW 共同为低电平时可以写入指令或者显示地址,当RS 为低电平RW 为高电平时可以读忙信号,当RS 为高电平RW 为低电平时可以写入数据。E 端为使能端,当E 端由高电平跳变成低电平时,液晶模块执行命令。D0~D7为8位双向数据线。
四、电路设计
1、电源电路
2、振荡电路:
3、复位电路:
4、DS18B20与单片机的接口电路:
5、PROTEUS 仿真电路图
五、系统程序设计
1、主程序模块设计
本系统程序设计采用汇编语言进行编写。
主程序设计思路为:先对系统进行初始化,如:LCD1602初始化等,然后才能进入主显示模块,即可在LCD1602上看到相应的信息。对于LCD1602的初始化,主要是对开启显示屏,清屏,设置显示初始行等操作。具体的主程序流程如图:
主程序源代码:
MAIN:
LCALL INIT_LCD1602 ;调用显示器LCD1602的初始化
LCALL INIT_DS18B20;调用DS18B02的初始化
START:
LCALL DISPLAY_TEMP ;调用温度显示程序
JMP START
2、液晶显示器LCD1602模块
本系统采用的是LCD1602液晶显示器,由于其是本身带有驱动模块的液晶屏,所以对于LCD1602操作程序可分为开显示、设置显示初始行、写数据和清屏等部分。LCD1602的写命令程序和写数据程序分别以子程序的形式写在程序里,以便主程序中的调用。对LCD1602的具体操作过程如图所示。
1602LCD 的总体操作流程图见下图所示:
软件流程图
LCD 初始化程序:
INIT_LCD1602:
MOV LCD ,#01H ;清屏
CALL ENABLE_ORDER
MOV LCD ,#38H ;8位点阵,两行显示
CALL ENABLE_ORDER
MOV LCD ,#0CH ;显示开关为开,光标开关为关,闪烁开关为关 CALL ENABLE_ORDER
MOV LCD ,#80H ;显示的起始位置为第一行的第一位 CALL ENABLE_ORDER
RET
3、温度芯片DS18B20操作模块
具体的DS18B20的操作过程如下图所示:
DS18B20的操作过程
读DS18B20的流程图见下图所示。其源程序可查阅附录中的源代码部分。
读DS18B20的流程图
六、总结及心得
通过本次课程设计,我学到了很多东西,理论知识得到强化,实践能力得到了提高。
在这课程设计中,让我对单片机AT89C51有了更深入的理解,在运用上能力得到很大提高,让我更多的知道它的优点:单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。单片机具有体积小、功能多、价格低廉、使用方便、系统设计灵活等优点。因此,它应用广泛前景美好,它的实用性大大地提高了我对课程设计的兴趣。
在课程设计开始前,自己感到很茫然,因为对软件的和单片机不是很熟悉,可是但我逐渐的了解后,发现其实并不是想象的那么难,而且很好用。
这次课程设计项目虽然不是很大,但用的技术和知识一点也不逊色于大点的项目,比如说其中用到了DS18B20中的串行通信技术,AT89C51基本操作知识,汇编语言方面的知识等。
这次课程设计也是一次非常难得的理论和实际相结合的机会,通过这次系统设计,使我摆脱了以往单纯的理论知识学习状态,并且在和实际设计的结合锻炼了我的综合运用所学的专业基础知识,使我的实践能力的得到很大的提高。在设计过程中遇到了的以下问题,然而在老师或同学的帮助下一个一个解决了,培养了我一丝不苟的和不厌其烦的态度。这次设计虽然顺利做完了,但还是许多美中不足之处,让我认识到自己对单片机应用方面的知识贫乏,也让我知道了proteus 和keil 使用的方便,对于书本上的很多理论知识还不能灵活运用,有很多我们掌握的知识在等着我去学习,我会在以后的学习生活中弥补我所缺少的知识。同时还从中学到了一件很重要的东西,那就是如何从理论到实践的转化,怎么样将我所学到的知识运用到我以后的工作中去。此次的课程设计给我奠定了一个实践基础,为以后毕业设计打下良好的基础,也为我在毕业后的生活中磨练自己,使自己适应于以后工作中的竞争。
参考文献
[1]李晓林. 牛昱光. 单片机原理与接口技术(第二版)北京:电子工业出版社,2011,11,325-338
[2] 许兴存. 曾琪琳,微型计算机接口技术[M].北京:电子工业出版社,2005,7:308-329
[3] 丁元杰. 单片微机原理及应用[M].北京:机械工业出版社,2006,3:1-10,166-180
[5] 宋彩利,孙友仓. 单片机原理与C51编程[M].西安:西安交通大学出版社,2008,7:165-191 6] 赵文博,刘文涛. 单片机语言C51程序设计[M].北京:人民邮电出版社,2005,10 :176-198
[7] 边春元.C51单片机典型模块设计与应用[M].北京:机械工业出版社,2008,4:1-24
[8] 邱关源. 电路,北京:高等教育出版社[M].2005,12:1-24
[9] 朱定华. 单片机原理及接口技术实验[M].北京:北方交通大学出版社,2002,11:24-55
附录:
源程序
ORG 0000H
; ——————————DS1602引脚定义——————————
RS EQU P3.0 ;RS为寄存器选择
RW EQU P3.1 ;RW为读写信号线
E EQU P3.2 ;E为使能端,E 由高变低进执行命令
LCD EQU P2 ;数据总线
; ——————————DS18B20引脚定义—————————-
DQ BIT P3.7;单总线口
; —————————DS18B20数据存储单元定义——————-
TEMPER_L EQU 50H ;暂存温度个位
TEMPER_H EQU 51H ;暂存温度十位
TEMPER_NUM EQU 52H;温度值存储
FLAG1 BIT 00H ;DS18B20是否存在标志
; ——————————————————————————— ;********************主程序**************************** MAIN:
LCALL INIT_LCD1602 ;调用显示器LCD1602的初始化
LCALL INIT_DS18B20;调用DS18B02的初始化
START:
LCALL DISPLAY_TEMP ;调用温度显示程序
JMP START
;****************************************************** ; —————————LCD1602的初始化——————————- INIT_LCD1602:
MOV LCD,#01H ;清屏
CALL ENABLE_ORDER
MOV LCD,#38H ;8位点阵,两行显示
CALL ENABLE_ORDER
MOV LCD,#0CH ;显示开关为开,光标开关为关,闪烁开关为关CALL ENABLE_ORDER
MOV LCD,#80H ;显示的起始位置为第一行的第一位
CALL ENABLE_ORDER
RET
; ——————————DS18B20初始化程序—————-——— INIT_DS18B20:
SETB DQ
NOP
CLR DQ
MOV R0,#250
TSR1:
DJNZ R0,TSR1 ; 延时微秒
SETB DQ
MOV R0,#35 ;延时微秒
TSR2:
DJNZ R0,TSR2
JNB DQ,TSR3;如D0为低则复位成功,DS18B20存在
LJMP TSR4 ; 延时
TSR3:
SETB FLAG1 ; 置标志位, 表示DS1820存在
LJMP TSR5
TSR4:
CLR FLAG1 ; 清标志位, 表示DS1820不存在
LJMP TSR7
TSR5:
MOV R0,#100 ;延时微秒
TSR6:
DJNZ R0,TSR6 ;
TSR7:
SETB DQ ;拉高总线
RET
; ——————————欢迎界面—————————————WELCOME:
MOV LCD,#01H ;清屏
CALL ENABLE_ORDER
LINE1: ;欢迎界面的第一行
MOV DPTR,#TABLE1
MOV R1,#00H
W1:
LCALL DELAY1
MOV A,R1
MOVC A,@A+DPTR
CJNE A,#00H,W2 ; 判断第一行是否显示完毕
JMP LINE2
W2:
MOV LCD,A
LCALL ENABLE_DISPLAY ;写数据到芯片中
LCALL DELAY ;调用延时程序
INC R1 ; 位置后移一位
MOV A,#80H
ORL A,R1 ; 调整显示位置
MOV LCD,A
CALL ENABLE_ORDER ; 写命令到芯片中
JMP W1
LINE2: ;欢迎界面的第二行
MOV LCD,#0C0H
CALL ENABLE_ORDER ; 写命令到芯片中
MOV DPTR,#TABLE2
MOV R1,#00H
W3:
LCALL DELAY1 ;调用延时程序
MOV A,R1
MOVC A,@A+DPTR
CJNE A,#00H,W4
LCALL DELAY1
LCALL DELAY1
RET
W4:
MOV LCD,A
LCALL ENABLE_DISPLAY ; 写数据到芯片中
LCALL DELAY
INC R1 ; 位置后移一位
MOV A,#0C0H
ORL A,R1 ; 调整显示位置
MOV LCD,A
CALL ENABLE_ORDER ;写命令到芯片中
JMP W3
RET
; ——————————清屏程序————————————— DISPLAY_BLANK:
LCALL DELAY1 ;长延时(使其显示有闪烁效果)
MOV LCD,#01H ;清屏命令
LCALL ENABLE_ORDER
LCALL DELAY1
RET
; ————————"TEMPERATURE" 信息提示程序———————-——TEMPERATURE_LOGO:
MOV LCD,#01H ;清屏
CALL ENABLE_ORDER
MOV LCD,#86H ;设置显示"T" 的位置
CALL ENABLE_ORDER
MOV LCD,#54H ; 显示"T"
LCALL ENABLE_DISPLAY
MOV LCD,#87H ;设置显示"E" 的位置
CALL ENABLE_ORDER
MOV LCD,#69H ; 显示"E"
LCALL ENABLE_DISPLAY
MOV LCD,#88H ;设置显示"M" 的位置
CALL ENABLE_ORDER
MOV LCD,#6DH ; 显示"M"
LCALL ENABLE_DISPLAY
MOV LCD,#89H ;设置显示"P" 的位置
CALL ENABLE_ORDER
MOV LCD,#65H ; 显示"P"
LCALL ENABLE_DISPLAY
MOV LCD,#8AH ;设置显示"E" 的位置
CALL ENABLE_ORDER
MOV LCD,#72H ; 显示"E"
MOV LCD,#8AH ;设置显示"R" 的位置
CALL ENABLE_ORDER
MOV LCD,#72H ; 显示"R"
MOV LCD,#8AH ;设置显示"A" 的位置
CALL ENABLE_ORDER
MOV LCD,#72H ; 显示"A"
MOV LCD,#8AH ;设置显示"T" 的位置
CALL ENABLE_ORDER
MOV LCD,#72H ; 显示"T"
MOV LCD,#8AH ;设置显示"U" 的位置
CALL ENABLE_ORDER
MOV LCD,#72H ; 显示"U"
MOV LCD,#8AH ;设置显示"R" 的位置
CALL ENABLE_ORDER
MOV LCD,#72H ; 显示"R"
MOV LCD,#8AH ;设置显示"E" 的位置
CALL ENABLE_ORDER
MOV LCD,#72H ; 显示"E"
LCALL ENABLE_DISPLAY
RET
; ——————————显示温度的程序——————————DISPLAY_TEMP:
MOV LCD,#01H ;清屏
LCALL ENABLE_ORDER
LCALL GET_TEMP ;读取温度数据
MOV A,TEMPER_NUM
MOV B,#10
DIV AB ; 分离温度数据
MOV TEMPER_H,A
MOV TEMPER_L,B
MOV LCD,#0CDH ; 设置显示位置
LCALL ENABLE_ORDER
MOV A,TEMPER_H
ADD A,#30H ; 进行显示调整
MOV LCD,A ;显示温度的十位
LCALL ENABLE_DISPLAY
MOV LCD,#0CEH ; 设置显示位置
LCALL ENABLE_ORDER
MOV A,TEMPER_L
ADD A,#30H ; 进行显示调整
MOV LCD,A ;显示温度的个位
LCALL ENABLE_DISPLAY
MOV LCD,#0CFH ; 设置显示位置
CALL ENABLE_ORDER
MOV LCD,#0DFH ; 显示温度符号
LCALL ENABLE_DISPLAY
RET
; ———————写数据到液晶显示器LCD1602———————- ENABLE_DISPLAY:
SETB RS ; 设置RS 为高,选择数据寄存器
CLR RW ;设置RW 为低,进行写操作
CLR E ; 设置E 为低,执行命令
SETB E
RET
; ———————写命令到液晶显示器LCD1602———————- ENABLE_ORDER:
CLR RS ;设置RS 为低,选择指令寄存器
CLR RW ;设置RW 为低,进行写操作
CLR E ; 设置E 为低,执行命令
LCALL DELAY ;延时
SETB E
RET
; ——————————读出转换后的温度值———————— GET_TEMP:
SETB DQ
GT1:
LCALL INIT_DS18B20 ; 初始化DS18B20
JB FLAG1,GT2 ;判断DS18B20是否存在
LJMP GT1
GT2:
MOV A,#0CCH ;跳过ROM 匹配命令
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
NOP
GT3:
LCALL INIT_DS18B20 ;初始化DS18B20
JB FLAG1,GT4 ; 判断DS18B20是否存在
LJMP GT3
GT4:
MOV A,#0CCH ;跳过ROM 匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_1820 ;调用读DS18B20程序,读取温度低字节 MOV TEMPER_L,A ;将读出的温度低位放入TEMPER_L中 LCALL READ_1820 ; 调用读DS18B20程序,读取温度高字节 MOV TEMPER_H,A ; 将读出的温度低位放入TEMPER_H中 MOV A,#0F0H
ANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值 SW AP A
MOV TEMPER_NUM,A ;得到温度的个位数
MOV A,TEMPER_L
JNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值
INC TEMPER_NUM
TEMPER_COV1:
MOV A,TEMPER_H
ANL A,#07H
SW AP A
ORL A,TEMPER_NUM ;得到高四位,再与低四位相或得到温度值MOV TEMPER_NUM,A ; 保存变换后的温度数据
RET
; ——————从DS18B20中读出一个字节的数据-—————— READ_1820:
MOV R2,#8 ;设置数据的传输位数
RE1:
CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$ ;延时微秒
MOV C,DQ
MOV R3,#30
DJNZ R3,$ ;延时微秒
RRC A
DJNZ R2,RE1
RET
; ———————————写DS18B20的程序————————- WRITE_1820:
MOV R2,#8 ; 设置命令字的传输位数
CLR C
WR1:
CLR DQ
MOV R3,#6
DJNZ R3,$ ; 延时微秒
RRC A
MOV DQ,C ; 按位送出数据
MOV R3,#30
DJNZ R3,$ ; 延时微秒
SETB DQ
NOP
DJNZ R2,WR1 ;查看数据是否传输完毕
SETB DQ ; 置DQ 为高
RET
; ———————————短延时程序——————————— DELAY: ;设置短延时大概为*20*100微秒
MOV R7,#100
D1:
MOV R6,#20
D2:
DJNZ R6,D2
DJNZ R7,D1
RET
; ———————————长延时程序——————————— DELAY1: ;设置延时大概为*50*20*100微秒
MOV R5,#50
TT1:
LCALL DELAY
DJNZ R5,TT1
RET
END C 语言:
#include
#define uchar unsigned char #define uint unsigned int
sbit DQ=P3^7;//ds18b20与单片机连接口
sbit RS=P3^0;
sbit RW=P3^1;
sbit EN=P3^2;
unsigned char code str1[]={"temperature: "};
unsigned char code str2[]={" "};
uchar data disdata[5];
uint tvalue;//温度值
uchar tflag;//温度正负标志
/*************************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的) {unsigned int i,j;
for(i=0;i
for(j=0;j
}
void wr_com(unsigned char com)//写指令//
{ delay1ms(1);
RS=0;
RW=0;
EN=0;
P2=com;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void wr_dat(unsigned char dat)//写数据//
{ delay1ms(1);;
RS=1;
RW=0;
EN=0;
P2=dat;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void lcd_init()//初始化设置//
{delay1ms(15);
wr_com(0x38);delay1ms(5);
wr_com(0x08);delay1ms(5);
wr_com(0x01);delay1ms(5);
wr_com(0x06);delay1ms(5);
wr_com(0x0c);delay1ms(5);
}
void display(unsigned char *p)//显示//
{
while(*p!='\0')
{
wr_dat(*p);
p++;
delay1ms(1);
}
}
init_play()//初始化显示
{ lcd_init();
wr_com(0x80);
display(str1);
wr_com(0xc0);
display(str2);
}
/******************************ds1820程序***************************************/ void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}
void ds1820rst()/*ds1820复位*/
{ unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
21
unsigned char dat = 0;
for (i=8;i>0;i--)
{ DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=0;
for (i=8; i>0; i--)
{ DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
read_temp()/*读取温度值并转换*/
{uchar a,b;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue
tvalue=tvalue|a;
if(tvalue
tflag=0;
else
{tvalue=~tvalue+1;
tflag=1;
}
22
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数 return(tvalue);
}
/*******************************************************************/ void ds1820disp()//温度值显示
{ uchar flagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位
if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-
if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}
wr_com(0xc0);
wr_dat(flagdat);//显示符号位
wr_com(0xc1);
wr_dat(disdata[0]);//显示百位
wr_com(0xc2);
wr_dat(disdata[1]);//显示十位
wr_com(0xc3);
wr_dat(disdata[2]);//显示个位
wr_com(0xc4);
wr_dat(0x2e);//显示小数点
wr_com(0xc5);
wr_dat(disdata[3]);//显示小数位
}
/********************主程序***********************************/ void main()
{ init_play();//初始化显示
while(1)
{read_temp();//读取温度
ds1820disp();//显示
}
23
24