;P3.7接数据,P0口接段码,P2.0、P2.1分别为个位和十位TEMPER_L EQU 29H ;存放读出温度低位数据TEMPER_H EQU 28H ;存放读出温度高位数据FLAG1 BIT 00HDQ BIT P3.7 ;一线总线控制端口ORG 0000HMOV SP,#70HMAIN:LCALL GET_TEMPER ;从DS18B20读出温度数据;因为12位转化时每一位的精度为0.0625,我们不需要显示小数所以可以舍弃29H 的低4位;将28H的低4位移入29H的高4位,这样获得一个新字节,就为是测量获得的温度MOV A,29HMOV C,40H ;将28H的最低位移入CRRC AMOV C,41HRRC AMOV C,42HRRC AMOV C,43HRRC AMOV 29H,ALCALL DISP ;调用显示AJMP MAIN ;继续温度采集;以下为DS18B20单总线操作子程序;读出转换后的温度值GET_TEMPER:SETB DQ ;定时入口BCD:LCALL INIT_1820 ;先复位DS18B20JB FLAG1,S22 ;判断DS18B20是否存在?若不存在则返回RET ;若DS18B20不存在则返回S22:MOV A,#0CCH ;跳过ROM匹配0CCHLCALL WRITE_1820MOV A,#44H ;发出温度转换命令LCALL WRITE_1820LCALL DISP ;这里通过调用显示子程序延时一段时间,等待AD转换结束,750毫秒CBA:LCALL INIT_1820 ;准备读温度前先复位JB FLAG1,ABCAJMP CBAABC:MOV A,#0CCH ;跳过ROM匹配LCALL WRITE_1820MOV A,#0BEH ;发出读温度命令LCALL WRITE_1820LCALL READ_18200 ;将读出的温度数据保存到28H/29HRET;执行533.8微秒WRITE_1820:MOV R2,#8 ;读取8个位,一个字节CLR CWR1:CLR DQMOV R3,#5 ;延时DJNZ R3,$RRC AMOV DQ,C ;发送1个位MOV R3,#21 ;延时DJNZ R3,$SETB DQDJNZ R2,WR1SETB DQRET;执行1108.87微秒,读DS18B20的程序,从DS18B20中读出两个字节的温度数据READ_18200:MOV R4,#2 ;将温度高位和低位从DS18B20中读出MOV R1,#29H;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)RE00:MOV R2,#8 ;读取8个位,一个字节RE01:CLR CSETB DQNOPCLR DQNOPNOPNOPNOPSETB DQMOV R3,#2 ;延时DJNZ R3,$MOV C,DQ ;读取1个位MOV R3,#22 ;延时DJNZ R3,$RRC ADJNZ R2,RE01MOV @R1,ADEC R1DJNZ R4,RE00RETDISP:MOV A,29H ;将29H中的十六进制数转换成十进制MOV B,#10DIV ABMOV 40H,B ;个位存放MOV 41H,A ;十位存放MOV R4,#4DISP1:MOV R5,#100DISP2:CLR P2.0 ;开个位显示MOV DPTR,#TABMOV A,40HMOVC A,@A+DPTRMOV P0,ALCALL D1MSSETB P2.0CLR P2.1MOV DPTR,#TABMOV A,41HMOVC A,@A+DPTRMOV P0,ALCALL D1MSSETB P2.1DJNZ R5,DISP2DJNZ R4,DISP1RET;DS18B20复位初始化程序INIT_1820:SETB DQNOPCLR DQMOV R1,#3TSR1:MOV R0,#80DJNZ R0,$ ;延时DJNZ R1,TSR1SETB DQ ;然后拉高数据线NOPMOV R0,#15 ;96微秒TSR2:JNB DQ,TSR3DJNZ R0,TSR2LJMP TSR4 ;延时TSR3:SETB FLAG1 ;置标志位,表示DS18B20存在;CLR P1.7 ;检查到DS18B20就点亮P1.7LED LJMP TSR5TSR4:CLR FLAG1 ;清标志位,表示DS18B20不存在;CLR P1.6 ;没检查到DS18B20就点亮P1.6LED LJMP TSR7TSR5:MOV R0,#115 ;200微秒DJNZ R0,$ ;延时TSR7:SETB DQRET;延时1毫秒子程序D1MS:MOV R6,#5DSS:MOV R7,#92DJNZ R7,$DJNZ R6,DSSRETTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H END;/******************************************************************************** ;* 标题: xl系列单片机实验仪演示程序 1602液晶万年历 * ;* 文件: LCDWNL.ASM * ;* 日期: 2006-1-5 * ;* 版本: 3.0 (试验通过版)可用xl600-xl1000单片机综合试验仪试验 * ;* 邮箱: sxj1974@ * ;* 网站: * ;******************************************************************************** ;按K1,依次进入闹钟功能,闹钟时间,年,月,日和时,分,秒模式,直致退出设置状态 * ;按K2,调整是否起用闹钟和调节闹钟时,分,秒,年,月,日,时间的时,分,秒的数字 * ;闹钟响时,按K2即可停止闹钟的声响 * ;正常状态,上排最前面显示一自定义字符,下排最前面闪动"willar" * ;设置状态,LCD上排最前面显示"P",下排最前面设置闹钟时显示"alarm:",其他显示"time:"* ;闹钟启用时,在LCD下排中间显示一小喇叭,闹钟禁用时,无此小喇叭 * ;年代变化2000--2099,星期自动转换 * ;******************************************************************************** ;* 【版权】 Copyright(C)深圳市学林电子有限公司 * ;* 【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! * ;* 【技术支持】请访问/bbs/index.asp 官方论坛 * ;********************************************************************************/;**************变量的定义*****************RS BIT P2.0 ;LCD数据/命令选择端(H/L)RW BIT P2.1 ;LCD读/写选择端(H/L)EP BIT P2.2 ;LCD使能控制PRE BIT P1.4 ;调整键(K1)ADJ BIT P1.5 ;调整键(K2)SPK BIT P3.7 ;闹钟声音输出口YEAR DATA 18H ;年,月,日变量MONTH DATA 19HDATE DATA 1AHWEEK DATA 1BHHOUR DATA 1CH ;时,分,秒,百分之一秒变量MIN DATA 1DHSEC DATA 1EHSEC100 DATA 1FHHOUR_ARM DATA 20H ;闹钟时,分,秒,变量MIN_ARM DATA 21HSEC_ARM DATA 22HALARM BIT STATE.0 ;闹钟是否启用标志1--启用,0--禁止LEAP BIT STATE.1 ;是否闰年标志1--闰年,0--平年KEY_S DATA 24H ;当前扫描键值KEY_V DATA 25H ;上次扫描键值DIS_BUF_U0 DATA 26H ;LCD上排显示缓冲区DIS_BUF_U1 DATA 27HDIS_BUF_U2 DATA 28HDIS_BUF_U3 DATA 29HDIS_BUF_U4 DATA 2AHDIS_BUF_U5 DATA 2BHDIS_BUF_U6 DATA 2CHDIS_BUF_U7 DATA 2DHDIS_BUF_U8 DATA 2EHDIS_BUF_U9 DATA 2FHDIS_BUF_U10 DATA 30HDIS_BUF_U11 DATA 31HDIS_BUF_U12 DATA 32HDIS_BUF_U13 DATA 33HDIS_BUF_U14 DATA 34HDIS_BUF_U15 DATA 35HDIS_BUF_L0 DATA 36H ;LCD下排显示缓冲区DIS_BUF_L1 DATA 37HDIS_BUF_L2 DATA 38HDIS_BUF_L3 DATA 39HDIS_BUF_L4 DATA 3AHDIS_BUF_L5 DATA 3BHDIS_BUF_L6 DATA 3CHDIS_BUF_L7 DATA 3DHDIS_BUF_L8 DATA 3EHDIS_BUF_L9 DATA 3FHDIS_BUF_L10 DATA 40HDIS_BUF_L11 DATA 41HDIS_BUF_L12 DATA 42HDIS_BUF_L13 DATA 43HDIS_BUF_L14 DATA 44HDIS_BUF_L15 DATA 45HFLAG DATA 46H ;标识调整状态 0-闹钟功能,1-闹钟时,2-闹钟分,3-闹钟秒;4-年,5-月,6-日,7-时,8-分,9-秒,10-退出调整。