本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
;数字温度传感器,带日期,带时钟,12M晶体,1602显示。。。
TEMP EQU 30H
NIAN EQU 31H ;32H,33H,34H
YUE EQU 35H;36H
RIRI EQU 37H;38H
SHI EQU 50H;51H
FEN EQU 52H;53H
TEMP1 EQU 40H ;温度高8位 十位
TEMP2 EQU 41H ;温度低8位 ,,个位
TEMP3 EQU 42H ;十分位
RS EQU P2.5;确定具体硬件的连接方式
RW EQU P2.6 ;确定具体硬件的连接方式
E EQU P2.7 ;确定具体硬件的连接方式
ORG 000H
LJMP START
ORG 0BH
LJMP TIM0
START: ;;;;;;;;定时中断初始化
MOV TMOD,#01H ;T0工作在方式1
MOV TH0,#HIGH(65536-10000) ;定时10000微秒
MOV TL0,#LOW(65536-10000)
SETB TR0 ;启动定时
MOV IE,#10000010B ;开中断
MOV R1,#100 ;10000*100=1s
;;;;;;;;;;;;;;;LCD初始化
;;;;;;;;;;;;;;;;;;;;;;;; 时间初始化
MOV 53H ,#39H
MOV 52H,#33H
MOV 51H, #30H
MOV 50H,#32H
MOV 57H,#0
MOV 35H,#30H
MOV 36H,#38H
MOV 37H,#31H
MOV 38H,#38H
MAIN: JB P2.0,LOOP9 ;p2.0为1则转移,否则继续下步
ACALL DELAY10
JB P2.0,LOOP9
JNB P2.0,$
CLR TR0
YYY: JNB P2.0,YYY1 ;P2.0为0则转移,否则继续下步
ACALL DELAY10
JNB P2.0 ,YYY1
;JB P2.0 ,$
JB P2.1,NET
ACALL DELAY10
JB P2.1,NET
JNB P2.1 ,$
INC 53H
NET: JB P2.2 ,NET1
ACALL DELAY10
JB P2.2, NET1
JNB P2.2 ,$
DEC 53H
NET1: JB P2.3,YYY
ACALL DELAY10
JB P2.3,YYY
JNB P2.3,$
SETB TR0
JMP LOOP9
YYY1: /*JNB P2.0,YYY2 ;P2.0为0则转移,否则继续下步
ACALL DELAY10
JNB P2.0 ,YYY2 */
JB P2.1,NET2
ACALL DELAY10
JB P2.1,NET2
JNB P2.1 ,$
INC 52H
NET2: JB P2.2 ,NET3
ACALL DELAY10
JB P2.2, NET3
JNB P2.2 ,$
DEC 52H
NET3: JB P2.3,YYY1
ACALL DELAY10
JB P2.3,YYY1
JNB P2.3,$
SETB TR0
JMP LOOP9
/*YYY2:
JB P2.1,NET4
ACALL DELAY10
JB P2.1,NET4
JNB P2.1 ,$
INC 51H
NET4: JB P2.2 ,NET5
ACALL DELAY10
JB P2.2, NET5
JNB P2.2 ,$
DEC 51H
NET5: JB P2.3,YYY2
ACALL DELAY10
JB P2.3,YYY2
JNB P2.3,$
SETB TR0
JMP LOOP9 */
/*;;;;;;;;;;;;;;;;;;;;;;;时间变化程序
MOV A,53H
CJNE A,#3AH,JJJ ;分钟后位是否到10判断
MOV 53H,#30H ;到10复位置0
INC 52H ;分钟前位加1
MOV A,52H
CJNE A,#36H,JJJ ;分钟前位是否到6判断
MOV 52H,#30H ;到6复位置1
INC 51H ;时后位加1
MOV A,51H
CJNE A,#34H,LOOP3 ;时后位到4判断
MOV A,50H ;到4则判断时前位到2
CJNE A,#32H,JJJ ;时前位到2判断
MOV 50H,#30H ;如果条件满足,时两位同时置0
MOV 51H,#30H
LOOP3: CJNE A,#3AH,JJJ ;时后位是否到9
MOV 51H,#30H ;到则置0
INC 50H ;时前位加1
JMP JJJ */
LOOP9: MOV A,36H
MOV B,#2
DIV AB
MOV A,B
JZ LOOP4 ;等于零,31天,转移
MOV A,38H ;31天程序
CJNE A,#31H,XXX2
MOV A,37H
CJNE A,#33H,JJJ
MOV 37H,#30H
MOV 38H,#31H
INC 36H
MOV A,36H
CJNE A,#33H,XXX1
MOV A,35H
CJNE A,#31H,JJJ
MOV 36H,#31H
MOV 35H,#30H
JMP JJJ
XXX1: CJNE A,#3AH,JJJ
MOV 36H,#30H
INC 35H
JMP JJJ
XXX2:CJNE A,#3AH,JJJ
MOV 38H,#30H
INC 37H
JMP JJJ
LOOP4:
MOV A,38H ;31天程序
CJNE A,#32H,XXX4
MOV A,37H
CJNE A,#33H,JJJ
MOV 37H,#30H
MOV 38H,#31H
INC 36H
MOV A,36H
CJNE A,#33H,XXX3
MOV A,35H
CJNE A,#31H,JJJ
MOV 36H,#31H
MOV 35H,#30H
JMP JJJ
XXX3: CJNE A,#3AH,JJJ
MOV 36H,#30H
INC 35H
JMP JJJ
XXX4:CJNE A,#3AH,JJJ
MOV 38H,#30H
INC 37H
JJJ: LCALL RESET ; ;ds18b20复位
MOV A,#0CCH ;发SKIP ROM命令,忽略64位ROM地址,直接向DS18B20发温度变换命令,适用于单片工作。
LCALL WRITE
MOV A,#44H ;发开始温度转换命令,启动DS18B20进行温度转换,转换时间最长为500MS,(典型为200MS),结果存入内部9字节RAM中。
LCALL WRITE
LCALL DLY1S ; ;延时
LCALL RESET ; ; ds18b20复位
MOV A,#0CCH ;;发SKIP ROM命令
LCALL WRITE
MOV A,#0BEH ;发读存储器命令,读内部RAM中9字节内容。
LCALL WRITE
LCALL READ ;读出温度值1
MOV TEMP2,TEMP ; ;温度低8位存放41H
LCALL READ ;读出温度值2
MOV TEMP1,TEMP ; ;温度高8位存放在40H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;开始数值转换
MOV A,41H
RR A
RR A
RR A ;;把D3位右移到D0
ANL A,#01H ;;除D0位,其他全部置零
MOV B,#5
MUL AB ;;由于原D3位权值为0.5,故扩大10倍乘5后放十分位
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ANL A,#00111111B ;将要显示的温度值转换成lcd能识别的代码,0到9为0011xxxxB,所以要把高四位转换成0011,两条语句可以搞定。
ORL A,#00110000B
MOV 42H,A ;十分位转换结束,送42H保存
NOP ;设置断点,方便修改和查阅
MOV A, 40H
ANL A, #0FH ;把40H中高四位置零
RL A
RL A
RL A
RL A ; ;40H左移4位
MOV 40H, A ;40H中低四位移到高四位,低四位为零
MOV A, 41H
ANL A, #0F0H ;把41H中小数点后的值全部置零
RR A
RR A
RR A
RR A ; ;41H右移4位
MOV 41H, A ; 把41H中高四位移到低四位,高四位置零
MOV A, 40H
ORL A, 41H ;组成新的带符号无小数点的八位数字温度,最高位为符号位
MOV 43H,A ;暂存温度值,原41H的高4位做43H的低4位,原40H的低4位做43H的高4位
ANL A,#80H ; 除最高位有效,其他置零
RR A
RR A
RR A
RR A
MOV 44H,A ;判断温度值的符号位,把结果放44H,44H中要只有0和8,0为正,8为负
NOP
MOV A,43H ;恢复带符号八位无小数点温度
ANL A,#7FH ;屏蔽符号位
MOV B, #0AH
DIV AB ; ;无符号温度值除以10
MOV 40H, A ; ;商送40H暂存
MOV A, B ; ;余数通过A送41H保存
ANL A,#00111111B;将要显示的温度值转换成lcd能识别的代码,0到9为0011xxxxB,所以要半高四位转换成0011,两条语句可以搞定。
ORL A,#00110000B
MOV TEMP2, A ;存个位十进制温度值
MOV A,40H
MOV B,#0AH
DIV AB ;;商作为被除数再除以10
MOV 39H,A ;商存入39H,存百位十进制温度值
MOV A,B ; ;余数通过A送40H保存
ANL A,#00111111B;将要显示的温度值转换成lcd能识别的代码,0到9为0011xxxxB,所以要半高四位转换成0011,两条语句可以搞定。
ORL A,#00110000B
MOV TEMP1,A ;存十位十进制温度值
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;开始显示程序
LOOP:MOV P0,#00000001B ;;清屏并光标复位
ACALL ENABLE;调用写入命令子程序
MOV P0,#00111000B; ;设置显示模式:8位2行5x7点阵
ACALL ENABLE ;调用写入命令子程序
MOV P0,#00001100B; ;显示器开、光标开、光标允许闪烁
ACALL ENABLE ;调用写入命令子程序
MOV P0,#00000110B; ;文字不动,光标自动右移
ACALL ENABLE ;调用写入命令子程序
;;;;;;;;;;;;;;;;;;;;;;;;;显示扫描程序
;;;;;;;;;;;;;;;;;时间显示
MOV P0,#80H; ;写入显示起始地址
ACALL ENABLE ;调用写入命令子程序
MOV A,#32H;NIAN
MOV P0,A; 温度个位代码写入
SETB RS; ;RS=1
CLR RW; ;RW=0 ;准备写入数据
CLR E; ;E=0 ;执行显示命令
ACALL DELAY ;判断液晶模块是否忙?
SETB E; ;E=1 ;显示完成,程序停车
MOV P0,#81H; ;写入显示起始地址
ACALL ENABLE ;调用写入命令子程序
MOV A,#30H;32H
MOV P0,A; 温度个位代码写入
SETB RS; ;RS=1
CLR RW; ;RW=0 ;准备写入数据
CLR E; ;E=0 ;执行显示命令
ACALL DELAY ;判断液晶模块是否忙?
SETB E; ;E=1 ;显示完成,程序停车
MOV P0,#82H; ;写入显示起始地址
ACALL ENABLE ;调用写入命令子程序
MOV A,#30H;33H
MOV P0,A; 温度个位代码写入
SETB RS; ;RS=1
CLR RW; ;RW=0 ;准备写入数据
CLR E; ;E=0 ;执行显示命令
ACALL DELAY ;判断液晶模块是否忙?
SETB E; ;E=1 ;显示完成,程序停车
;;;;;;;;;;;;;;;;
MOV P0,#83H; ;写入显示起始地址
ACALL ENABLE ;调用写入命令子程序
MOV A,#39H;34H
MOV P0,A; 温度个位代码写入
SETB RS; ;RS=1
CLR RW; ;RW=0 ;准备写入数据
CLR E; ;E=0 ;执行显示命令
ACALL DELAY ;判断液晶模块是否忙?
SETB E; ;E=1 ;显示完成,程序停车
MOV P0,#84H; ;写入显示起始地址
ACALL ENABLE ;调用写入命令子程序
MOV A,#2FH
MOV P0,A; 温度个位代码写入
SETB RS; ;RS=1
CLR RW; ;RW=0 ;准备写入数据
CLR E; ;E=0 ;执行显示命令
ACALL DELAY ;判断液晶模块是否忙?
SETB E; ;E=1 ;显示完成,程序停车
MOV P0,#85H; ;写入显示起始地址
ACALL ENABLE ;调用写入命令子程序
MOV A,35H
MOV P0,A; 温度个位代码写入
SETB RS; ;RS=1
CLR RW; ;RW=0 ;准备写入数据
CLR E; ;E=0 ;执行显示命令
ACALL DELAY ;判断液晶模块是否忙?
SETB E; ;E=1 ;显示完成,程序停车
MOV P0,#86H; ;写入显示起始地址
ACALL ENABLE ;调用写入命令子程序
MOV A,36H
MOV P0,A; 温度个位代码写入
SETB RS; ;RS=1
CLR RW; ;RW=0 ;准备写入数据
CLR E; ;E=0 ;执行显示命令
ACALL DELAY ;判断液晶模块是否忙?
SETB E; ;E=1 ;显示完成,程序停车
MOV P0,#87H; ;写入显示起始地址
ACALL ENABLE ;调用写入命令子程序
MOV A,#2FH
MOV P0,A; 温度个位代码写入
SETB RS; ;RS=1
CLR RW; ;RW=0 ;准备写入数据
CLR E; ;E=0 ;执行显示命令
ACALL DELAY ;判断液晶模块是否忙?
SETB E; ;E=1 ;显示完成,程序停车
MOV P0,#88H; ;写入显示起始地址
ACALL ENABLE ;调用写入命令子程序
MOV A,37H
MOV P0,A; 温度个位代码写入
SETB RS; ;RS=1
CLR RW; ;RW=0 ;准备写入数据
CLR E; ;E=0 ;执行显示命令
ACALL DELAY ;判断液晶模块是否忙?
SETB E; ;E=1 ;显示完成,程序停车
MOV P0,#89H; ;写入显示起始地址
ACALL ENABLE ;调用写入命令子程序
MOV A,38H
MOV P0,A; 温度个位代码写入
SETB RS; ;RS=1
CLR RW; ;RW=0 ; |
|