倒计时牌及温度表设计 - 图文

更新时间:2023-11-10 16:04:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《单片机原理及应用》

课程设计报告书

(世园会倒计时牌及温度表) 专业:电气工程及其自动化 学号:3204080124 姓名: 高鹏

指导教师:段晨东 张文革 日期:2010年1月5日

任务书

世园会倒计时牌及温度表的设计

要求(不能采用专用芯片):

(1)显示倒计时天数以及小时、分钟、秒(各2位)。 (2)参数可手动设置

(3)选择传感器,并设计相应的信号处理电路。 (4)实现实时温度显示功能(每秒刷新一次),温度测量范围-40~+60?C (5)可采用电池组供电和交流电源供电

扩充功能:

(1)防止极性接反,电压不足时,报警提示。 (2)剩余天数、时分秒、温度交替显示。

摘要

随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中倒计时牌和温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。 主要功能:单片机控制的倒计时牌及温度计,可以设置倒计时剩余天时分秒的初值,并可以显示当前环境温度。输出剩余天数时分秒以及温度用动态显示LED数码,单片机使用AT89C52, 测温传感器使用DS18B20,实现实时温度显示功能(每秒刷新一次),温度测量范围-40~+60?C。

这一课程设计,主要考察单片机理论知识与实际应用的结合,要求我们既要有扎实的理论设计基础,还要有较强的变成及调试程序的能力和极大的耐心

完成了这一课程设计,我们对于“从实践中得真知”有了真切的理解,而且加强了对单片机知识的应用,以及编制程序和调试程序的能力,熟悉了PROTEUS的应用,增强了查找分析解决软硬件问题的能力。尽管出现了许多问题,但从中获得的不仅仅是单片机倒计时牌,更重要的是懂得了学以致用的意义。

2

前言

本设计主要实现倒计时牌和温度显示功能,即天时分秒

的显示和实时温度的采集显示功能。时间显示天数显示三位,时分秒各两位,并能够手动设置时间参数。该功能由单片机内部定时计数器T0实现50ms定时,循环20次从而实现1s定时,到1秒时秒的个位减1,秒的个位减至0时秒的十位减1同时将秒的个位置9,以此类推,实现倒计时功能。天时分秒的显示电路是由74LS245驱动的六片集成数码管构成,数码管的片选是由74LS138实现的。剩余天数,剩余时分秒和温度显示可以通过对应秒的个位显示的不同数值实现跳转交替显示。温度传感器选择18B20数字温度传感器,温度显示选择高三位数码管显示,显示电路与时间显示类似。

3

目 录

方案分析-----------------1

设计中主要元件----------------1 主要元件功能简介---------------2

程序设计-----------------5

主程序流程图----------------5

0显示状态-----------------6

1示状态------------------7

2显示状态-----------------8 计时-------------------9

键盘程序-----------------12

调试 ------------------13

软件调试-----------------13 实物调试-----------------16

结论-------------------18 附录1元件清单----------------20 附录2程序------------------21 附录3参考资料----------------32

附录4 电路图-----------------33

4

方案分析

总体方案介绍(工作原理)

本设计主要使作品处于三种显示工作状态。

第一状态:倒计时和温度交替显示状态。轮流显示时分秒显示8秒,天数显示3秒,温 度显示3秒,一次循环。

第二状态:调整剩余天数状态(通过1号键实现状态跳转)。数码管显示天数,需调整 的位数闪烁,通过2号键调整数值。

第三状态:调整时分秒状态(通过1号键实现状态跳转)。数码管显示时分秒,需调整 的位数闪烁,通过2号键调整数值。

计时

单片机内部使用TO用0方式实现计时,用定时计数器进行50毫秒的定时,触发中断循环二十次则实现了1秒的计时。每到一秒计时结束调用一次显示时间减一秒的子程序和温度子程序。

显示时间减一的子程序:将时间从20H单元开始存储,子程序开始先判断秒是不是为0,若秒的个位不等于0,则秒的个位减1,结束;若等于0时将秒的个位置9,然后判断秒的十位是否为0,若秒的十位不为0则将秒的十位减一,结束:若为0则将它置5,然后判断分的个位是否为0。若分的个位不为0则将分的个位减一,结束;若为0则将它置9,然后判断分的十位是否为0。若分的十位不为0则将分的十位减一,结束;若为0则将它置5,然后判断时的个位是否为0。若不为0则将时的个位减一,结束;为0再判断时的十位是否为0。若不为0则将时的十位减一,再将时的个位置9,结束;若为0将时的十位置2,时的个位置3,再判断天的个位是否为0。若不为0则将天的个位减一,结束;若为0将它置9,然后判断天的十位是否为0。如果不为0则将天的十位减一,结束;为0将它置9,然后判断天的百位是否为0。若不为0则减一,结束;为0则将所有位清0,倒计时也到此结束了。

显示

倒计时显示由74LS245驱动六位八段共阴极数码管实现,P0口作为输出口接到74LS245的输入端。P1口输出显示的位置,数码管运用动态显示,用74LS138进行片选,从低位到高位轮流显示。 键盘

本作品只用了两个按键,按键1用来转换显示状态,按键2用来改变闪烁位数的数值。没按一次1键,显示器上显示的位数就会向后退一位,没按一次按键2,闪烁的位数的值就会加1,从未实现参数的改变,实现手动设置参数。

设计中主要原件 1)89C52RC芯片一个 2)74LS245两片 3)74LS138一片

5

4)MAX232一片

5)DS18B20温度传感器一个 6)9012运算放大器一个

7)三位八段共阴极数码管两个 8)振荡器一个

9)若干开关、电阻、电容、双排插针、单排插针等 10)伟福仿真器系列调试软件 11)Proteus仿真模拟环境

主要原件功能简介 (1)8051单片机

80C51是INTEL公司MCS-51系列单片机中最基本的产品,其图见图一,

它采用INTEL公司可靠的CHMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。它结合了HMOS的高速和高密度技术及CHMOS的低功耗特征,它继承和扩展了MCS-48单片机的体系结构和指令系统。

80C51内置中央处理单元、128字节内部数据存储器RAM、32个双向输入/输出(I/O)口、2个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。

此外,80C51还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。在空闲模式下冻结CPU而RAM定时器、串行口和中断系统维持其功能。掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯片内其它功能。

图一 图二 表一

(2)74LS245驱动器

如图一74LS245的引脚图,图表一为其功能表。图中G为使能端,DIR为方向控制端,A1-A8为A端的数据输入/输出,B1-B8为B端的数据输入/输出。74LS245是一种三态输出的8总线收发驱动器,无锁存功能。当G为低电平时,如果DIR为高电平,则74LS245将A端的数据传送至B端;如

6

果DIR为低电平,则74LS245将B端的数据传送至A端。在其他情况下不传送数据,输出呈高阻态。

(3)74LS138芯片

如图三74LS138的引脚图,该译码器在CBA输入不同时在Y0-Y7端输出低电平。在本设计中,CBA为P1口的低三位,Y0-Y7与74LS245的输入端相接,通过输出低电平来控制数码管的显示。实现了数码管的动态显示。在连接电路时,E1接高电平,E2、E3接低电平,使74LS138实现译码功能。

1 2 3 6 4 5 U1A B C E1 E2 E3 74LS138 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 15 14 13 12 11 10 9 7 图三

(4) DS18B20温度传感器

美国DALLAS公司生产的单线数字温度传感器DS1820见图三把温

度信号直接转换成串行数字信号供微机处理。由于每片DS1820含有唯一的硅串行数所以在一条总线上可挂接任意多个DS1820芯片。从DS1820读出的信息或写入DS1820的信息,仅需要一根口线(单线接口)。读写及温度变换功率来源于数据总线,总线本身也可以向所挂接的DS1820供电,而无需额外电源。DS1820提供九位温度读数,构成多点温度检测系统而无需任何外围硬件。DS1820的测温原理:内部计数器对一个受温度影响的振荡器的脉冲计数,低温时振荡器的脉冲可以通过门电路,而当到达某一设置高温时振荡器的脉冲无法通过门电路。计数器设置为-55℃时的值,如果计数器到达0之前,门电路未关闭,则温度寄存器的值将增加,这表示当前温度高于-55℃。同时,计数器复位在当前温度值上,电路对振荡器的温度系数进行补偿,计数器重新开始计数直到回零。如果门电路仍然未关闭,则重复以上过程。温度表示值为9bit,高位为符号位。

7

321VCCDQGNDDS18B20-4.0

图三 图四

(5)数码显示管

数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。

本设计采用2个3联共阴8段数码管,如图4所示。 数码管的驱动方式:

数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。

① 静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S52单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。

② 动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划\的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,

8

没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。

由于每个显示字段显示通常需要十到几十毫安的驱动电流,因此显示控制信号必须经过驱动电路(即通过74LS245)才能使显示器正常工作。本设计中由74LS138控制控制数码管的动态显示。

程序设计

主程序流程图

开 始

初始化程序,将显示

状态存入40H,初始为0

判断状态,散转 40H为0 40H为1,2,3 40H为4至9

0显示状态 1显示状态 2显示状态

天数、时分秒、温度交替显示 调整天数 调整时分秒

9

0显示状态

开 始 启动计时器 显示时分秒 扫描键盘 显示状态改变 Y 判断状态,散转 N N 显示8秒 Y 显示三位天数 扫描键盘 显示状态改变 Y 判断状态,散转 N N 显示3秒 Y 显示温度 扫描键盘 Y 显示状态改变 判断状态,散转 N N 显示3秒 Y

10

1显示状态 显示三位天数 开 始 停止计时 扫描键盘 Y 显示状态改变 判断状态,散转 N N 显示30次 Y 显示两位天数,不显示需调节位 扫描键盘 显示状态改变 Y 判断状态,散转 N N 显示50次 Y

11

2显示状态 显示六位时分秒 开 始 停止计时 扫描键盘 Y 显示状态改变 判断状态,散转 N N 显示20次 Y 显示五位时分秒,不显示需调节位 扫描键盘 显示状态改变 Y 判断状态,散转 N N 显示20次 Y

12

计时 中断入口 保护现场 中断了20次 N Y 涮洗温度 调用时间更改程序 重赋中断次数值 恢复现场 RETI 时间更改程序

开始 秒的个位 N 为0 秒的个位减1 Y 秒的个位赋9 RET Y 秒的十位 N 为0 秒的十位减1 Y

13

秒的十位赋5 分的个位 N 为0 分的个位减1 Y 分的个位赋9 RET 分的十位 N 为0 分的十位减1 Y 分的十位赋5 RET 时的个位 N 为0 时的个位减1 Y 时的十位 N 为0 时的十位减1 Y 时的个位赋9 时的个位赋3 RET 时的十位赋2

14

N 天的个位 为0 天的个位减1 Y 天的个位赋9 RET 天的十位 N 为0 天的十位减1 Y RET 天的十位赋9 时天的百位 N 为0 天的百位减1 Y RET 全部位赋0, 计时结束

键盘程序 开 始 置P2为输入输出 N 有按键按下 RET

Y 延时20ms消抖

15

N 有按键按下? RET Y 按键识别 N 按键释放? Y 延时20ms消抖 N 按键释放? 1号键处理程序 Y Y 1号键按下? 2号键处理程序 Y N 2号键按下? N RET 1号键处理程序

开 始 40H单元为9? Y 40H单元赋0 N 40H单元加1 开 始

2号键处理程序

开 始 调用40H单元值

16

判定需更改位 RET 更改一次值 调试

软件调试

软件的调试过程在proteus中实现

以下给出调试过程:

电路图

17

载入程序后,正常显示时分秒,显示8秒,转入显示天数

正常显示三位天数,显示3秒,转入温度显示

18

正常显示温度,显示3秒后,转入时分秒显示

出现问题:一开始在中断计时处调用温度程序,想实现每秒刷新一次温度,但显示温度后无法再跳转显示剩余天数和时分秒。 解决方法:将测量温度程序在显示剩余天数和时分秒的程序中调用,基本满足温度测量的调用要求。

19

实物图

开机初始化,各位全为0

赋值后天数,时分秒和温度交替显示 下图为显示时分秒

20

AJMP STATE2

STATE0: SETB TR0 ;0显示状态 SHOW_HOU:MOV 43H,#8

SHOW_HOU_1: LCALL DSPLY0;显示时分秒 LCALL SCAN_KEY ;扫描键盘 MOV A,40H

CJNE A,#00H,CHOOSE;判断显示状态是否改变,改变则跳转 MOV A,43H

CJNE A,#0,SHOW_HOU_1;判断显示完8秒,没则跳转 LCALL TEMPER SHOW_DAY: MOV 43H,#3

SHOW_DAY_1:LCALL DSPLY1 ;显示三位天数 LCALL SCAN_KEY ;扫描键盘 MOV A,40H

CJNE A,#00H,CHOOSE;判断显示状态是否改变,改变则跳转 MOV A,43H

CJNE A,#0,SHOW_DAY_1;判断显示完3秒,没则跳转 LCALL TEMPER SHOW_T: MOV 43H,#3

SHOW_T_1:LCALL DSPLY2 ;显示温度 LCALL SCAN_KEY ;扫描键盘 MOV A,40H

CJNE A,#00H,CHOOSE MOV A,43H

CJNE A,#0,SHOW_T_1 ;;判断显示完3秒,没则跳转 LCALL SHOW_HOU AJMP SHOW_HOU

STATE1: MOV 41H,40H ;1显示状态 STATE1_A:MOV R6,#30

TE1_A: LCALL SCAN_KEY MOV A,40H

CJNE A,41H,CHOOSE

LCALL DSPLY1 ;显示时分秒 DJNZ R6,TE1_A STATE1_B:MOV R6,#50

TE1_B: LCALL SCAN_KEY MOV A,40H

CJNE A,41H,CHOOSE

LCALL FLASH1 ;显示时分秒,不显示需调整的位 DJNZ R6,TE1_B AJMP STATE1_A

STATE2: MOV 41H,40H ;2显示状态 STATE2_A:MOV R6,#20

26

TE2_A:LCALL SCAN_KEY MOV A,40H

CJNE A,41H,STATE2_CHO

LCALL DSPLY0 ;显示三位天数 DJNZ R6,TE2_A STATE2_B:MOV R6,#20

TE2_B:LCALL SCAN_KEY MOV A,40H

CJNE A,41H,STATE2_CHO

LCALL FLASH0 ;显示天数,不显示需调整的位 DJNZ R6,TE2_B AJMP STATE2_A STATE2_CHO:LJMP CHOOSE

DSPLY0:MOV R0,#25H ;显示时分秒的子程序 MOV R2,#00H

RED0:ACALL DISP ;调用一位显示子程序 DEC R0 INC R2

CJNE R2,#06H,RED0;判断六位显示完否 RET

DSPLY1:MOV R0,#28H ;显示三位天数子程序 MOV R2,#03H RED1:ACALL DISP DEC R0 INC R2

CJNE R2,#06,RED1;判断3位显示完否 RET

FLASH0:MOV R0,#25H ;程序显示时分秒,但不显示需调整的位 MOV R2,#00H MOV A,#29H CLR C

SUBB A,41H

MOV 42H,A ;42H中存放需调整位的地址 RD0:MOV A,R0

CJNE A,42H,RED0_1;判断是否为需调整的位 DEC R0 ;若是则跳过此位的显示 INC R2

RED0_1:CJNE R2,#06H,RED0_2 RET

RED0_2:ACALL DISP DEC R0 INC R2 AJMP RD0

27

FLASH1:MOV R0,#28H ;程序显示天数,但不显示需调整的位 MOV R2,#03H MOV A,#29H CLR C

SUBB A,41H

MOV 42H,A ;42H中存放需调整位的地址 RD1:MOV A,R0

CJNE A,42H,RED1_1;判断是否为需调整的位 DEC R0 ;若是则跳过此位的显示 INC R2

RED1_1:CJNE R2,#06H,RED1_2 RET

RED1_2:ACALL DISP DEC R0 INC R2 AJMP RD1

DISP: MOV A,R2 MOV P1,A

MOV DPTR,#LED_SEG MOV A,@R0

MOVC A,@A+DPTR MOV P0,A

ACALL DL1MS RET

LED_SEG:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH DL1MS:MOV R3,#200 ;延迟1ms子程序 DL1:NOP NOP NOP

DJNZ R3,DL1 RET

DL20MS:MOV R4,#20 ;延迟20ms子程序 DL20:LCALL DL1MS DJNZ R4,DL20 RET

P_T0:PUSH ACC ;计时中断程序 PUSH PSW

DJNZ 30H,GOON ;判断是否计时1s,否则跳转 LCALL TIME ;倒计时时间减1s DEC 43H

MOV 30H,#20

28

GOON:MOV TH0,#3CH MOV TL0,#0B0H POP PSW POP ACC RETI

TIME:MOV A,20H ;时间减1s JZ SECOND2 DEC 20H RET

SECOND2:MOV 20H,#09H MOV A,21H JZ MIN1 DEC 21H RET

MIN1:MOV 21H,#05H MOV A,22H JZ MIN2 DEC 22H RET

MIN2: MOV 22H,#09H MOV A,23H JZ HOURS1 DEC 23H RET

HOURS1: MOV 23H,#05H MOV A,24H JZ HOURS2 DEC 24H RET

HOURS2: MOV A,25H JZ DAY1

MOV 24H,#09H DEC 25H RET

DAY1: MOV 24H,#03H MOV 25H,#02H MOV A,26H JZ DAY2 DEC 26H RET

DAY2: MOV 26H,#09H MOV A,27H JZ DAY3 DEC 27H

29

RET

DAY3: MOV 27H,#09H MOV A,28H JZ DAY4 DEC 28H RET

DAY4:MOV 20H,#00H MOV 21H,#00H MOV 22H,#00H MOV 23H,#00H MOV 24H,#00H MOV 25H,#00H MOV 26H,#00H MOV 27H,#00H MOV 28H,#00H RET

SCAN_KEY:MOV P2,#7FH ;键盘扫描程序 MOV A,P2

ANL A,#00001100B XRL A,#00001100B

JZ NO_PRESS ;判断有键按下否 ACALL DL20MS ;延迟20ms MOV A,P2

ANL A,#00001100B XRL A,#00001100B

JZ NO_PRESS ;判断有键按下否 MOV A,P2 MOV R5,#05H CONT: RRC A DEC R5

JNC FOUND

CJNE R5,#01H,CONT NO_PRESS:RET

FOUND: MOV A,P2

ANL A,#00001100B XRL A,#00001100B

JNZ FOUND ;按键释放否 ACALL DL20MS MOV A,P2

ANL A,#00001100B XRL A,#00001100B

JNZ FOUND ;按键释放否

30

MOV A,R5

CJNE A,#01,NEXT1 LJMP SO_PRESS NEXT1: CJNE A,#02,NEXT4 LJMP S1_PRESS

SO_PRESS:MOV A,40H ;1号键按下 CJNE A,#09H,S0_PR MOV 40H,#00H NEXT4:RET S0_PR:INC A

MOV 40H,A RET

S1_PRESS:MOV A,40H ;2号键按下 CJNE A,#00H,S1 RET

S1:CJNE A,#01H,S2 ;修改天百位的值 LJMP S1_1

S2:CJNE A,#02H,S3 ;修改天十位的值 LJMP S1_1

S3:CJNE A,#03H,S4 ;修改天个位的值 LJMP S1_1

S4:CJNE A,#04H,S5 ;修改时十位的值 INC 25H MOV A,25H

CJNE A,#02H,S4_4 MOV A,24H

CJNE A,#04H,S4_6 S4_6:JC S4_7

MOV 24H,#03 S4_7:RET S4_4:JC S4_5

MOV 25H,#00H S4_5:RET

S5:CJNE A,#05,S6 ;修改时个位的值 MOV A,25H

CJNE A,#02H,S5_1 INC 24H MOV A,24H

CJNE A,#04H,S5_2 S5_2:JC S5_3

MOV 24H,#00H S5_3:RET

S5_1:LJMP S1_1

31

S6:CJNE A,#06,S7 ; 修改分十位的值 LJMP S6_68

S7:CJNE A,#07H,S8 ;修改分个位的值 LJMP S1_1

S8:CJNE A,#08H,S9 ;修改秒十位的值 LJMP S6_68

S9:CJNE A,#09H,NEXT2; 修改秒个位的值 LJMP S1_1 S1_1:MOV A,#29H CLR C

SUBB A,40H MOV R1,A

CJNE @R1,#09H,S1_2 MOV @R1,#00H RET

S1_2:INC @R1 RET

S6_68:MOV A,#29H CLR C

SUBB A,40H MOV R1,A

CJNE @R1,#05H,S6_6 MOV @R1,#00H RET S6_6: INC @R1 RET NEXT2:RET

TEMPER: ACALL RE_CONFIG ;初始化18B20 ACALL GET_TEMPER ;采样 LCALL TEMPER_COV RET

;................................................................

; 重新写DS18B20暂存存储器设定值

RE_CONFIG: JB 00H,RE_CONFIG1; 若DS18B20存在,转RE_CONFIG1 RET

RE_CONFIG1:MOV A,#0CCH; 发SKIP ROM命令 LCALL WRITE_1820

MOV A,#4EH; 发写暂存存储器命令 LCALL WRITE_1820

MOV A,#00H; 不 TH(报警上限)中写入00H

32

LCALL WRITE_1820

MOV A,#00H; TL(报警下限)中写入00H LCALL WRITE_1820 RET

;.............................................................. ; 读出转换后的温度值

GET_TEMPER: SETB P1.3 ; 定时入口 LCALL INIT_1820 JB 00H,TSS1

RET ; 若DS18B20不存在则返回 TSS1: MOV A,#0CCH; 跳过ROM匹配 LCALL WRITE_1820

MOV A,#44H; 发出温度转换命令 LCALL WRITE_1820

MOV R0,#250;等待A/D转换结束,12位的话750us TSS2: NOP

DJNZ R0, TSS2 LCALL INIT_1820

MOV A,#0CCH; 跳过ROM匹配 LCALL WRITE_1820

MOV A,#0BEH; 发出读温度命令 LCALL WRITE_1820 LCALL READ_1820

MOV 50H,A; 将读出的温度数据保存 RET

;............................................................... ; 初始化DS18B20的程序 INIT_1820: SETB P1.3 NOP

CLR P1.3 ;主机发出延时540us的复位低脉冲 MOV R0,#180 TSR1: NOP

DJNZ R0, TSR1

SETB P1.3 ;然后拉高数据线 NOP NOP

MOV R0,#36

TSR2: JNB P1.3, TSR3 ;等待DS18B20的回应 DJNZ R0,TSR2

LJMP TSR4; 延时

TSR3: SETB 00H; 置标志位,表示DS1820存在 LJMP TSR5

TSR4: CLR 00H; 清标志位,表示DS1820不存在

33

LJMP TSR7

TSR5: MOV R0,#06BH; 200us ??????

TSR6: DJNZ R0,TSR6; 复位成功!时序要求延时一段时间 TSR7: SETB P1.3 RET

;................................................................ ; 写DS18B20的程序 WRITE_1820: MOV R2,#8 CLR C WR1: CLR P1.3 MOV R3,#6 DJNZ R3,$ RRC A

MOV P1.3,C MOV R3,#23 DJNZ R3,$ SETB P1.3 NOP

DJNZ R2,WR1 SETB P1.3 RET

;.................................................................

; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据 READ_1820: MOV R4,#2; 将温度高位和低位从DS18B20中读出

MOV R1,#36H; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H) RE00: MOV R2,#8 RE01: CLR C SETB P1.3 NOP NOP CLR P1.3 NOP NOP NOP

SETB P1.3 MOV R3,#7 DJNZ R3,$ MOV C,P1.3 MOV R3,#23 DJNZ R3,$ RRC A

DJNZ R2,RE01 MOV @R1,A DEC R1

34

DJNZ R4,RE00 RET

;........................................................................

; 将从DS18B20中读出的温度数据进行转换

TEMPER_COV: MOV A,35H ;判断正负 ANL A,#11111000B XRL A,#11111000B

JNZ ZH_WENDU ;为正数,转走

MOV 34H,#10 ;负数,顺序执行 XRL 35H,#0FFH XRL 36H,#0FFH MOV A,36H ADD A,#1 MOV 36H,A MOV A,35H ADDC A,#00H

MOV 35H,A ;取补码---源码

AJMP TEMPER1

ZH_WENDU: MOV 34H,#11 TEMPER1: MOV A,#0F0H

ANL A,36H ; 舍去温度低位中小数点后的四位温度数值

SWAP A

MOV 50H,A MOV A,36H

JNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值 INC 50H

TEMPER_COV1: MOV A,35H ANL A,#07H SWAP A ORL A,50H MOV 50H,A

CLR RS0 ; 保存变换后的温度数据 RET

;..................................................................................... ;..................................................................................... ;..................................................................................... ;温度显示程序

DSPLY2: MOV DPTR,#TABLE1 ;温度显示子程序

35

本文来源:https://www.bwwdw.com/article/9y0v.html

Top