第3个回答 2011-05-10
我这里有个单片机得程序看对您有用么:
RS BIT P2.0 ;LCD引脚定义
RW BIT P2.1
E BIT P2.2
DQ BIT P1.7
T_RST BIT P3.5 ;DS1302引脚定义
T_CLK BIT P3.6
T_IO BIT P3.7
SEC EQU 30H ;单片机内部RAM分配
MIN EQU 31H
HOUR EQU 32H
DAY EQU 33H
MON EQU 34H
WEEK EQU 35H
YEAR EQU 36H
TEMPL EQU 28H ;存从DS18B20读出的低位
TEMPH EQU 29H ;存高位
TEMP1 EQU 40H ;符号位与百位公用一个单元
TEMP2 EQU 41H
TEMP3 EQU 42H
TEMP4 EQU 43H ;小数位存放单元
WDL EQU 51H
WDH EQU 52H
WENDU EQU 55H
CEWEN EQU 56H
ORG 0000H
JMP START
ORG 0030H
START: MOV SP ,#70H ;设置堆栈入口
MOV HOUR,#10H ;时间设置为2011年05月15号10时0分0秒
MOV MIN,#00H
MOV SEC,#00H
MOV DAY,#15H
MOV MON,#05H
MOV WEEK,#05H
MOV YEAR,#11H
MOV WDL,#10H ;温度设置为10-30
MOV WDH,#1EH
MOV WENDU,#22H ;设定温度值20
LCALL INIT_1602 ;初始化1602入口
LCALL SETDS1302 ;初始化1302入口
LCALL GET1302
LCALL DISPLAY ;显示程序入口
LCALL INIT_1820 ;初始化入口
MAIN: LCALL DISPLAY
LCALL DELAY1
LCALL GET1302 ;读1302
LCALL GET_TEMPER ;调用读温度子程序
LCALL TOBCD ;十六转BCD码
LCALL OUTPUT
JMP MAIN
OUTPUT:
CLR C
MOV A,56H
CJNE A,52H,PD1 ;不等则转PD1
SJMP BUBAOJING
PD1: JC BUBAOJING ;Cy=1则转
SJMP BAOJING1
CLR C
MOV A,56H
CJNE A,51H,PD2
PD2: NOP
JC BAOJING2
RET
BAOJING1: SETB P2.6 ;报警
RET
BAOJING2: SETB P2.7 ;低温加热
SETB P2.6
RET
BUBAOJING: CLR P2.7
CLR P2.6
RET
;****************************进入1602 进入1602 进入1602 **************************8
INIT_1602: LCALL DELAY5 ;初始化1602 获得稳定电流
LCALL DELAY5
LCALL DELAY5
MOV P0,#01H ;清屏
LCALL WR1602
MOV P0,#0CH ;显示开关设置
LCALL WR1602
MOV P0,#38H ;屏幕大小设置
LCALL WR1602
RET
WR1602: CLR RS ;写使能程序
CLR RW
CLR E
LCALL DELAY
SETB E
RET
DELAY: MOV R4,#05
D1: MOV R5,#0FFH
DJNZ R5,$
DJNZ R4,D1
RET
;****************************** 进入显示 进入显示 进入显示**********************************************
DISPLAY: MOV P0,#0C0H ;DDRAM第二行首地址0C0h
LCALL WR1602 ;写入使能1602第一行的初始地址80到8F总共16个
MOV A,HOUR ;读小时 第二行从C0到CF 一共十六个
SWAP A ;高低位交换
ANL A,#0FH ;保留高4位
LCALL RWYX ; 跳入显示使能
MOV P0,#0C1H ;第二行第二个地址
LCALL WR1602
MOV A,HOUR
ANL A,#0FH ;保留低四位
LCALL RWYX
MOV P0,#0C2H ;第三个地址
LCALL WR1602
MOV P0,#3AH ;显示冒号,这是lcd1602 CGRAM冒号的地址
LCALL MAOHAO
MOV P0,#0C3H ;
MOV A,MIN
SWAP A
ANL A,#0FH
LCALL RWYX
MOV P0,#0C4H ;
LCALL WR1602
MOV A,MIN
ANL A,#0FH
LCALL RWYX
MOV P0,#0C5H ;
LCALL WR1602
MOV P0,#3AH ;写冒号
LCALL MAOHAO
MOV P0,#0C6H ;
MOV A,SEC
SWAP A
ANL A,#0FH
LCALL RWYX
MOV P0,#0C7H ;
LCALL WR1602
MOV A,SEC
ANL A,#0FH
LCALL RWYX
MOV P0,#80H ;第一行首地址
LCALL WR1602
MOV P0,#32H ;显示2
LCALL MAOHAO
MOV P0,#81H ;第二个地址
LCALL WR1602
MOV P0,#30H ;显示0
LCALL MAOHAO
MOV P0,#82H
LCALL WR1602
MOV A,YEAR
SWAP A
ANL A,#0FH
LCALL RWYX
MOV P0,#83H
LCALL WR1602
MOV A ,YEAR
ANL A,#0FH
LCALL RWYX
MOV P0,#84H ;冒号
LCALL WR1602
MOV P0,#2FH
LCALL MAOHAO
MOV P0,#85H
LCALL WR1602
MOV A,MON
SWAP A
ANL A,#0FH
LCALL RWYX
MOV P0,#86H
LCALL WR1602
MOV A,MON
ANL A,#0FH
LCALL RWYX
MOV P0,#87H
LCALL WR1602
MOV P0,#2FH
LCALL MAOHAO
MOV P0,#88H
LCALL WR1602
MOV A,DAY
SWAP A
ANL A,#0FH
LCALL RWYX
MOV P0,#89H
LCALL WR1602
MOV A,DAY
ANL A,#0FH
LCALL RWYX
MOV P0,#8AH
LCALL WR1602
MOV P0,#20H
LCALL MAOHAO
MOV P0 ,#8BH
LCALL WR1602
MOV P0 ,#20H
LCALL MAOHAO
MOV P0,#8CH ;
MOV A,WENDU
SWAP A
ANL A,#0FH
LCALL RWYX
MOV P0,#8DH ;
LCALL WR1602
MOV A,WENDU
ANL A,#0FH
LCALL RWYX
MOV P0,#08EH
LCALL WR1602
MOV P0,#0DFH
LCALL MAOHAO
MOV P0,#08FH
LCALL WR1602
MOV P0,#43H ;温度C
LCALL MAOHAO
MOV P0,#0CDH
LCALL WR1602
MOV A,TEMP4
LCALL RWYX
MOV P0,#0CCH
LCALL WR1602
MOV P0,#0A4H
LCALL MAOHAO
MOV P0,#0CBH
LCALL WR1602
MOV A,TEMP3
LCALL RWYX
MOV P0,#0CAH
LCALL WR1602
MOV A,TEMP2
LCALL RWYX
MOV P0,#0C9H
LCALL WR1602
MOV A,TEMP1
LCALL RWYX
MOV P0,#0CEH
LCALL WR1602
MOV P0,#0DFH
LCALL MAOHAO
MOV P0,#0CFH
LCALL WR1602
MOV P0,#43H
LCALL MAOHAO
RET
RWYX: MOV DPTR,#TAB
MOVC A, @A+DPTR
MOV P0 ,A
MAOHAO: SETB RS
CLR RW
CLR E
LCALL DELAY
SETB E
RET
;***************************************进入1302 进入1302 进入1302 *************
SETDS1302:
CLR T_RST ;初始化
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,#8EH ;送控制命令
LCALL INPUTBYTE
MOV B,#00H ;在第0页开始写
LCALL INPUTBYTE
SETB T_CLK
nop
CLR T_RST
MOV R0,#SEC ;送入秒
MOV R1,#80H ;开始写秒
MOV R7,#7 ;写七次 年到秒总共七个数字
SETLOOP:
CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,R1
LCALL INPUTBYTE
MOV A,@R0
MOV B,A
LCALL INPUTBYTE
INC R0
INC R1
INC R1
SETB T_CLK
nop
CLR T_RST
nop
DJNZ R7,SETLOOP
CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,#8EH
LCALL INPUTBYTE ;写单字节程序入口
MOV B,#80H
LCALL INPUTBYTE
SETB T_CLK
nop
CLR T_RST
nop
RET
GET1302:
MOV R0,#SEC ;读1302
MOV R1,#81H
MOV R7,#7
GETLOOP:
CLR T_RST
nop
CLR T_CLK
nop
SETB T_RST
nop
MOV B,R1
LCALL INPUTBYTE
LCALL OUTPUTBYTE
MOV @R0,A
INC R0
INC R1
INC R1
SETB T_CLK
nop
CLR T_RST
nop
DJNZ R7,GETLOOP
RET
INPUTBYTE:
MOV R4,#8
INPUTLOOP:
MOV A,B
RRC A
MOV B,A
MOV T_IO,C
SETB T_CLK
NOP
CLR T_CLK
DJNZ R4,INPUTLOOP
RET
OUTPUTBYTE: ;读单字节入口
clr a
clr c
MOV R4,#8
OUTPUTLOOP:
NOP
MOV C,T_IO
RRC A
SETB T_CLK
NOP
CLR T_CLK
DJNZ R4,OUTPUTLOOP
RET
;**************************进入13B20 **************************进入13B20 ********************
;------ 读DS18B20传感器的温度值 ------
GET_TEMPER:
SETB P1.0
LCALL RST18B20 ;复位DS18B20
JB 00H,DSS2
RET
DSS2: MOV A,#0CCH ;跳过ROM匹配
LCALL WR18B20
MOV A,#44H ;向DS18B20发出温度转换命令
LCALL WR18B20
LCALL DELAY_1S
LCALL RST18B20 ;准备读温度前先复位DS18B20
MOV A,#0CCH ;跳过ROM匹配
LCALL WR18B20
MOV A,#0BEH ;向DS18B20发出读温度命令
LCALL WR18B20
LCALL RE18B20 ;读出温度数据
RET
;------ DS18B20复位初始化程序 ------
RST18B20:
SETB P1.0
NOP
CLR P1.0
MOV R0,#06BH ;主机发出复位低脉冲
MOV R1,#03H
DSR1: DJNZ R0,DSR1
MOV R0,#6BH ;660us复位低点平
DJNZ R1,DSR1
SETB P1.0 ;拉高数据线
NOP
NOP
NOP
MOV R0,#25H
DSR2: JNB P1.0,DSR3 ;等待DS18B20回应
DJNZ R0,DSR2
LJMP DSR4
DSR3: SETB 00H ;置标志位,表示DS1820存在
LJMP DSR5
DSR4: CLR 00H ;清标志位,表示DS1820不存在
LJMP DSR7
DSR5: MOV R0,#06BH
DSR6: DJNZ R0,DSR6 ;延时一段时间
DSR7: SETB P1.0
RET
;------ 写DS18B20的子程序 ------
WR18B20:
MOV R2,#8 ;写一个字节8bit命令
CLR C
SETB P1.0
NOP
WR1: CLR P1.0
MOV R3,#6
DJNZ R3,$ ;12us左右延时
RRC A
MOV P1.0,C
MOV R3,#23
DJNZ R3,$ ;50us延时,确保DS18B20电平采样正确
SETB P1.0
NOP
DJNZ R2,WR1
SETB P1.0
RET
;------ 从DS18B20中读温度数据程序 ------
RE18B20:
MOV R4,#2
MOV R1,#2FH
RE00: MOV R2,#8
RE01: CLR C
SETB P1.0
NOP
NOP
CLR P1.0
NOP
NOP
NOP
SETB P1.0
MOV R3,#09
RE10: DJNZ R3,RE10 ;延时12us
MOV C,P1.0
MOV R3,#23
RE20: DJNZ R3,RE20 ;延时50us
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
B2T_CH: MOV 38H,#1
JNB 77H,POS ;温度高于零度,则转移
MOV A,2FH
CPL A
INC A
MOV 2FH,A
MOV A,2EH
CPL A
MOV 2EH,A
MOV 38H,#0
POS: MOV A,2FH
ANL A,#0FH ;小数点后保留四位
MOV R1,#04
MOV R0,#3CH
DIG: MOV B,#10
MUL AB
MOV B,#16
DIV AB
MOV @R0,A
MOV A,B
INC R0
DJNZ R1,DIG
;整数位操作
MOV A,2FH
ANL A,#0F0H
RR A
RR A
RR A
RR A
MOV 2DH,A
MOV A,2EH
ANL A,#0FH
RL A
RL A
RL A
RL A
ORL A,2DH
MOV 2DH,A ;整数位存在2DH地址中
MOV CEWEN,2DH
MOV A,CEWEN
SWAP A ;高低位交换
ANL A,#0FH ;保留高4位
MOV TEMP2,A
MOV A,CEWEN
ANL A,#0FH ;保留低四位
MOV TEMP3,A
MOV A,2DH
MOV B,#10
DIV AB
MOV 3BH,B
MOV B,#10
DIV AB
MOV 3AH,B
MOV 39H,A
RET
;*************************************************延时*******************************************************8
DELAY5: MOV R1,#10
DL6: MOV R2,#249
DL7: DJNZ R2,DL7
DJNZ R1,DL6
RET
DELAY1:
MOV R6,#14H
DL8: MOV R7,#19H
DL9: DJNZ R7,DL9
DJNZ R6,DL8
RET
TAB1: DB "WEEK",00H
TAB: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,20H ;这里前十位的是0-9的代码,是lcd1602中CDRAM中的地址。20h是空不显示还有一个负号忘记写了。20h和忘了的负号是用于ds18b20的负好显示 ;
END