标题:
单片机多功能数字钟 汇编程序
[打印本页]
作者:
daniu
时间:
2014-12-27 17:06
标题:
单片机多功能数字钟 汇编程序
;张培
;本程序实现外控控数字钟
;功能:1.计时
; 2.3种显示模式
; 时间显示模式
; 月日显示模式
; 温度显示模式
;******************************************************
;字节单元定义
TEMPER_L EQU 29H;用于保存读出温度的低8位
TEMPER_H EQU 28H;用于保存读出温度的高8位
FLAG1 EQU 38H;是否检测到DS18B20标志位
a_bit EQU 20H;数码管个位数存放内存位置
b_bit EQU 21H;数码管十位数存放内存位置
PIANXUAN EQU P3 ;P3为片选口
SHUCHU EQU P2 ;P2为输出
MIAO EQU 30H;秒存储单元
FEN EQU 31H;分存储单元
SHI EQU 32H;时存储单元
SHUZI EQU 33H;中转存储单元
YUE EQU 34H;月存储单元
CRI EQU 35H;日存储单元
DAIMAZHI EQU 36H;代码存储单元
LINGSHI EQU 37H;闹铃时存储单元
LINGFEN EQU 50H;闹铃分存储单元
KONGSHI EQU 39H;外部控制时存储单元
KONGFEN EQU 61H;外部控制时存储单元
QIEHUAN BIT 22H.0;切换标志位
ANJIAN BIT 22H.1;按键1标志位
ANJIAN1 BIT 22H.2;按键2标志位
ANJIAN2 BIT 22H.3;按键3标志位
ANJIAN3 BIT 22H.4;按键4标志位
ANJIAN4 BIT 22H.5
ANJIAN5 BIT 23H.2
WENDU BIT 22H.6;温度标志位
GONG BIT 22H.7
C_0 BIT 23H.0;20MS的标志位
SHANSHUO BIT 23H.1
;**********************************************************
;**************************主程序**************************
ORG 0000H
JMP START
ORG 000BH
JMP TT0
ORG 0030H
START: CALL CHUSHIHUA
MAIN: JNB C_0,MAIN ;节拍等待
CLR C_0
CALL JIACHULI ;计算时间
CALL SHJIAN_GN ;判断时间闹铃及控制功能
CALL PANWENDU ;温度按键判断
JNB WENDU,NEXT0 ;
CALL XIANSHIWENDU ;温度标志位为1就显示温度
JMP MAIN
NEXT0:CALL PANGONGNENG ;判断功能键
JNB GONG,NEXT1 ;没有功能键按下显示时间
CALL CANSHU ;代码加一
CALL XIANSHIMA ;有功能键按下,则显示功能代码
CALL SHEZHI ;根据代码设置相应的功能
JMP MAIN ;返回
NEXT1:CALL PANANJIAN ;切换月日、时间显示
JNB QIEHUAN,NEXT ;没有按键按下,则显示时间
CALL XIANSHI2 ;显示月日
JMP MAIN ;返回
NEXT:CALL XIANSHI1 ;显示时间
DEC 66H
MOV A,66H
CJNE A,#00,NEXT5
MOV 66,#50
CPL P2.7
NEXT5:JMP MAIN ;返回
;========================设置子程序========================
SHEZHI:MOV A,DAIMAZHI
MOV DPTR,#TAB1
JMP @A+DPTR
TAB1:AJMP SUB0
AJMP SUB1
AJMP SUB2
AJMP SUB3
AJMP SUB4
AJMP SUB5
AJMP SUB6
AJMP SUB7
;========================设置月份===========================
SUB0:MOV SHUZI,YUE
CALL XIANSHI3
JB P1.3,PAN
JB ANJIAN2,PAN
SETB ANJIAN2
INC YUE
MOV R1,YUE
CJNE R1,#13,PAN
MOV YUE,#01
PAN:JNB P1.3,PANJIAN1
CLR ANJIAN2
PANJIAN1:JB P1.4,TAIQI3
JB ANJIAN3,TAIQI3
SETB ANJIAN3
DEC YUE
MOV R1,YUE
CJNE R1,#00,TAIQI3
MOV YUE,#12
TAIQI3:JNB P1.4,OUT7
CLR ANJIAN3
OUT7:RET
;=========================设置日=============================
SUB1:MOV SHUZI,CRI
CALL XIANSHI3
JB P1.3,TAIQI4
JB ANJIAN2,TAIQI4
SETB ANJIAN2
INC CRI
MOV R1,CRI
CJNE R1,#32,TAIQI4
MOV CRI,#01
TAIQI4:JNB P1.3,PANJIAN2
CLR ANJIAN2
PANJIAN2:JB P1.4,TAIQI5
JB ANJIAN3,TAIQI5
SETB ANJIAN3
DEC CRI
MOV R1,CRI
CJNE R1,#00,TAIQI5
MOV CRI,#32
TAIQI5:JNB P1.4,OUT8
CLR ANJIAN3
OUT8:RET
;==========================设置分=============================
SUB2:MOV SHUZI,FEN
CALL XIANSHI3
JB P1.3,TAIQI8
JB ANJIAN2,TAIQI8
SETB ANJIAN2
INC FEN
MOV R1,FEN
CJNE R1,#60,TAIQI8
MOV FEN,#01
TAIQI8:JNB P1.3,PANJIAN4
CLR ANJIAN2
PANJIAN4:
JB P1.4,TAIQI9
JB ANJIAN3,TAIQI9
SETB ANJIAN3
DEC FEN
MOV R1,FEN
CJNE R1,#00,TAIQI9
MOV FEN,#59
TAIQI9:JNB P1.4,OUT10
CLR ANJIAN3
OUT10:RET
;==========================设置时===========================
SUB3:MOV SHUZI,SHI
CALL XIANSHI3
JB P1.3,TAIQI6
JB ANJIAN2,TAIQI6
SETB ANJIAN2
INC SHI
MOV R1,SHI
CJNE R1,#24,TAIQI6
MOV SHI,#00
TAIQI6:JNB P1.3,PANJIAN3
CLR ANJIAN2
PANJIAN3:JB P1.4,TAIQI7
JB ANJIAN3,TAIQI7
SETB ANJIAN3
DEC SHI
MOV R1,SHI
CJNE R1,#00,TAIQI7
MOV SHI,#23
TAIQI7:JNB P1.4,OUT9
CLR ANJIAN3
OUT9:RET
;==========================设置闹铃时===========================
SUB4:MOV SHUZI,LINGSHI
CALL XIANSHI3
JB P1.3,TAIQI10
JB ANJIAN2,TAIQI10
SETB ANJIAN2
INC LINGSHI
MOV R1,LINGSHI
CJNE R1,#24,TAIQI10
MOV LINGSHI,#00
TAIQI10:JNB P1.3,PANJIAN5
CLR ANJIAN2
PANJIAN5:JB P1.4,TAIQI11
JB ANJIAN3,TAIQI11
SETB ANJIAN3
DEC LINGSHI
MOV R1,LINGSHI
CJNE R1,#00,TAIQI11
MOV LINGSHI,#23
TAIQI11:JNB P1.4,OUT11
CLR ANJIAN3
OUT11:RET
;==========================设置闹铃分===========================
SUB5:MOV SHUZI,LINGFEN
CALL XIANSHI3
JB P1.3,TAIQI12
JB ANJIAN2,TAIQI12
SETB ANJIAN2
INC LINGFEN
MOV R1,LINGFEN
CJNE R1,#60,TAIQI12
MOV LINGFEN,#01
TAIQI12:JNB P1.3,PANJIAN6
CLR ANJIAN2
PANJIAN6:JB P1.4,TAIQI13
JB ANJIAN3,TAIQI13
SETB ANJIAN3
DEC LINGFEN
MOV R1,LINGFEN
CJNE R1,#00,TAIQI13
MOV LINGFEN,#59
TAIQI13:JNB P1.4,OUT12
CLR ANJIAN3
OUT12:RET
;==========================设置控制时===========================
SUB6:MOV SHUZI,KONGSHI
CALL XIANSHI3
JB P1.3,TAIQI14
JB ANJIAN2,TAIQI14
SETB ANJIAN2
INC KONGSHI
MOV R1,KONGSHI
CJNE R1,#24,TAIQI14
MOV KONGSHI,#00
TAIQI14:JNB P1.3,PANJIAN7
CLR ANJIAN2
PANJIAN7:JB P1.4,TAIQI15
JB ANJIAN3,TAIQI15
SETB ANJIAN3
DEC KONGSHI
MOV R1,KONGSHI
CJNE R1,#00,TAIQI15
MOV KONGSHI,#23
TAIQI15:JNB P1.4,OUT13
CLR ANJIAN3
OUT13:RET
;==========================设置控制分===========================
SUB7:MOV SHUZI,KONGFEN
CALL XIANSHI3
JB P1.3,TAIQI16
JB ANJIAN2,TAIQI16
SETB ANJIAN2
INC KONGFEN
MOV R1,KONGFEN
CJNE R1,#60,TAIQI16
MOV KONGFEN,#01
TAIQI16:JNB P1.3,PANJIAN8
CLR ANJIAN2
PANJIAN8:JB P1.4,TAIQI17
JB ANJIAN3,TAIQI17
SETB ANJIAN3
DEC KONGFEN
MOV R1,KONGFEN
CJNE R1,#00,TAIQI17
MOV KONGFEN,#59
TAIQI17:JNB P1.4,OUT14
CLR ANJIAN3
OUT14:RET
;=======================闹铃与外部控制子程序====================
SHJIAN_GN:MOV A,SHI
CJNE A,LINGSHI,NEXT2
MOV A,FEN
CJNE A,LINGFEN,NEXT4
SETB P1.6
JMP NEXT2
NEXT4:CLR P1.6
NEXT2:MOV A,KONGSHI
CJNE A,KONGSHI,NEXT3
MOV A,FEN
CJNE A,KONGFEN,NEXT3
NEXT3:RET
;===============温度时间显示切换判断子程序=================
PANWENDU:JB P1.5,TAIQI0
JB ANJIAN4,TAIQI0
SETB ANJIAN4
CPL WENDU
TAIQI0:JNB P1.5,KK
CLR ANJIAN4
KK:RET
;==========================显示3子程序==========================
XIANSHI3:CALL JISUAN
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV SHUCHU,A
MOV PIANXUAN,#04H;显示十位
CALL DELAY
MOV PIANXUAN,#00H;关片选
MOV A,B
MOVC A,@A+DPTR
MOV SHUCHU,A
MOV PIANXUAN,#08H;显示个位
CALL DELAY
MOV PIANXUAN,#00H;关片选
MOV SHUCHU,#0BFH
MOV PIANXUAN,#02H;
CALL DELAY
MOV PIANXUAN,#00H;关片选
RET
;=======================参数键判断子程序========================
CANSHU:JB P1.2,TAIQI2
JB ANJIAN5,TAIQI2
SETB ANJIAN5
CALL DAIMA ;设置代码
TAIQI2:JNB P1.2,OUT5
CLR ANJIAN5
OUT5:RET
;========================代码子程序=============================
DAIMA:INC DAIMAZHI
MOV R7,DAIMAZHI
CJNE R7,#08,PP
MOV DAIMAZHI,#00
PP:RET
;========================显示代码===============================
XIANSHIMA:MOV A,DAIMAZHI
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV SHUCHU,A
MOV PIANXUAN,#01H
CALL DELAY
MOV PIANXUAN,#00
RET
;=======================功能键判断子程序========================
PANGONGNENG:JB P1.1,TAIQI1
JB ANJIAN1,TAIQI1
SETB ANJIAN1
CPL GONG
TAIQI1:JNB P1.1,OUT4
CLR ANJIAN1
OUT4:RET
;=========================按键判断子程序========================
PANANJIAN:JB P1.0,TAIQI
JB ANJIAN,TAIQI
SETB ANJIAN
CPL QIEHUAN
TAIQI:JNB P1.0,OUT1
CLR ANJIAN
OUT1:RET
;***********************温度显示子程序*********************************
; 输入:
; 输出:
;实现功能:实现温度的显示
XIANSHIWENDU:
LCALL GET_TEMPER;调用读温度子程序
;进行温度显示
;显示范围00到99度,显示精度为1度
;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位
;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
MOV A,29H
MOV C,40H;将28H中的最低位移入C
RRC A
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV C,43H
RRC A
MOV 29H,A
LCALL DISPLAY;调用数码管显示子程序
RET
; 这是DS18B20复位初始化子程序
INIT_1820:
SETB P3.5
NOP
CLR P3.5
;主机发出延时537微秒的复位低脉冲
MOV R1,#3
TSR1:
MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB P3.5;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2:
JNB P3.5,TSR3;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3:
SETB FLAG1 ; 置标志位,表示DS1820存在
LJMP TSR5
TSR4:
CLR FLAG1 ; 清标志位,表示DS1820不存在
LJMP TSR7
TSR5:
MOV R0,#117
TSR6:
DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7:
SETB P3.5
RET
; 读出转换后的温度值
GET_TEMPER:
SETB P3.5
LCALL INIT_1820 ;先复位DS18B20
JB FLAG1,TSS2
RET ; 判断DS1820是否存在,若DS18B20不存在则返回
TSS2:
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
LCALL DISPLAY
LCALL INIT_1820 ;准备读温度前先复位
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ; 将读出的温度数据保存到35H/36H
RET
;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:
MOV R2,#8;一共8位数据
CLR C
WR1:
CLR P3.5
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3.5,C
MOV R3,#23
DJNZ R3,$
SETB P3.5
NOP
DJNZ R2,WR1
SETB P3.5
RET
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
MOV R0,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
MOV R2,#8;数据一共有8位
RE01:
CLR C
SETB P3.5
NOP
NOP
CLR P3.5
NOP
NOP
NOP
SETB P3.5
MOV R3,#9
RE10:
DJNZ R3,RE10
MOV C,P3.5
MOV R3,#23
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R0,RE00
RET
;**********************显示子程序*****************************
display:
mov a,29H ;将29H中的十六进制数转换成10进制
mov b,#10 ;10进制/10=10进制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;个位在b
mov dptr,#numtab ;指定查表启始地址
mov r0,#8
dpl1:
mov r1,#255 ;显示1000次
dplop:
mov a,a_bit ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
mov p2,a ;送出个位的7段代码
SETB p3.3 ;开个位显示
acall d1ms ;显示1ms
CLR p3.3
mov a,b_bit ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
mov p2,a ;送出十位的7段代码
SETB p3.2 ;开十位显示
acall d1ms ;显示1ms
CLR p3.2
djnz r1,dplop ;250次没完循环
djnz r0,dpl1 ;4个250次没完循环
ret
;*************************延时子程序***************************
; 输入:
; 输出:
;实现功能:1MS延时(按12MHZ算)
;**************************************************************
D1MS:
MOV R7,#80
DJNZ R7,$
RET
;************************查表代码*******************************
numtab:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;************************显示时分子程序*************************
; 输入:FEN,YUE
; 输出:A
;实现功能:实现时分的显示
XIANSHI1:
MOV SHUZI,FEN
CALL JISUAN
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV SHUCHU,A
MOV PIANXUAN,#04H;显示分的十位
CALL DELAY
MOV PIANXUAN,#00H;关片选
MOV A,B
MOVC A,@A+DPTR
MOV SHUCHU,A
MOV PIANXUAN,#08H;显示分的个位
CALL DELAY
MOV PIANXUAN,#00H;关片选
MOV SHUZI,SHI
CALL JISUAN
MOVC A,@A+DPTR
MOV SHUCHU,A
MOV PIANXUAN,#01H;显示时的十位
CALL DELAY
MOV PIANXUAN,#00H;关片选
MOV A,B
MOVC A,@A+DPTR
MOV SHUCHU,A
MOV PIANXUAN,#02H;显示时的个位
CALL DELAY
MOV PIANXUAN,#00H;关片选
RET
;************************显示月日子程序*************************
; 输入:CRI,YUE
; 输出:A
;实现功能:实现月日的显示
XIANSHI2:
MOV SHUZI,CRI
CALL JISUAN
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV SHUCHU,A
MOV PIANXUAN,#04H;显示日的十位
CALL DELAY
MOV PIANXUAN,#00H;关片选
MOV A,B
MOVC A,@A+DPTR
MOV SHUCHU,A
MOV PIANXUAN,#08H;显示日的个位
CALL DELAY
MOV PIANXUAN,#00H;关片选
MOV SHUZI,YUE
CALL JISUAN
MOVC A,@A+DPTR
MOV SHUCHU,A
MOV PIANXUAN,#01H;显示月的十位
CALL DELAY
MOV PIANXUAN,#00H;关片选
MOV A,B
MOVC A,@A+DPTR
MOV SHUCHU,A
MOV PIANXUAN,#02H;显示月的个位
CALL DELAY
MOV PIANXUAN,#00H;关片选
RET
JIACHULI:
DJNZ R4,OUT3;判断是否到一秒
MOV R4,#50
INC MIAO ;到一秒后秒位加1
MOV R7,MIAO
CJNE R7,#60,OUT3;判断是否到60秒
MOV MIAO,#00
INC FEN
MOV R7,FEN
CJNE R7,#60,OUT3;判断是否到60分
MOV FEN,#00
INC SHI
MOV R7,SHI
CJNE R7,#24,OUT3;判断是否都24小时
MOV SHI,#00
INC CRI;到24小时后把日加一
MOV R7,CRI
MOV R4,YUE
CJNE R4,#01,JIXU1
CJNE R7,#32,OUT3
INC YUE
MOV CRI,#00
OUT3:JMP OUT2
JIXU1:CJNE R4,#02,JIXU2
CJNE R7,#29,OUT3
INC YUE
MOV CRI,#00
JMP OUT2
JIXU2:CJNE R4,#03,JIXU3
CJNE R7,#32,OUT2
INC YUE
MOV CRI,#00
JMP OUT2
JIXU3:CJNE R4,#04,JIXU4
CJNE R7,#31,OUT2
INC YUE
MOV CRI,#00
JMP OUT2
JIXU4:CJNE R4,#05,JIXU5
CJNE R7,#32,OUT2
INC YUE
MOV CRI,#00
JMP OUT2
JIXU5:CJNE R4,#06,JIXU6
CJNE R7,#31,OUT2
INC YUE
MOV CRI,#00
JMP OUT2
JIXU6:CJNE R4,#07,JIXU7
CJNE R7,#32,OUT2
INC YUE
MOV CRI,#00
JMP OUT2
JIXU7:CJNE R4,#08,JIXU8
CJNE R7,#32,OUT2
INC YUE
MOV CRI,#00
JMP OUT2
JIXU8:CJNE R4,#09,JIXU9
CJNE R7,#31,OUT2
INC YUE
MOV CRI,#00
JMP OUT2
JIXU9:CJNE R4,#10,JIXU10
CJNE R7,#32,OUT2
INC YUE
JMP OUT2
JIXU10:CJNE R4,#11,JIXU11
CJNE R7,#31,OUT2
INC YUE
MOV CRI,#00
JMP OUT2
JIXU11:CJNE R4,#12,OUT2
CJNE R7,#32,OUT2
MOV YUE,#01
MOV CRI,#00
OUT2:RET
;**********************初始化子程序*************************
CHUSHIHUA:MOV SP,#7FH
MOV TMOD,#01H;T0工作方式1
MOV TH0,#0B1H;20MS的初值
MOV TL0,#0E0H
SETB ET0;开启中断TO
SETB EA ;开启中断总开关
SETB TR0;定时器溢出标志位
CLR QIEHUAN
CLR ANJIAN
CLR ANJIAN1
CLR ANJIAN2
CLR ANJIAN3
CLR ANJIAN4
CLR ANJIAN5
CLR WENDU ;显示温度标志位清0
CLR SHANSHUO
CLR GONG
CLR P1.6
SETB C_0
MOV MIAO,#55
MOV FEN,#59
MOV SHI,#21
MOV YUE,#06
MOV CRI,#23
MOV DAIMAZHI,#00
MOV LINGSHI,#00
MOV LINGFEN,#00
MOV KONGSHI,#00
MOV KONGFEN,#00
MOV DPTR,#TAB
MOV R4,#50
MOV 66H,#50
RET
;///////计算子程序///////////////////////
;输入:"30H"
;输出:"A,B"
;实现的功能:查A在TAB位置的数
JISUAN:
MOV A,SHUZI
MOV B,#10
DIV AB
RET
;/////////////////中断到来重置初值程序/////////////////////////
;输入;无
;输出: 无
;实现的功能中断到来重置初值
TT0:
MOV TH0,#0B1H
MOV TL0,#0E0H
SETB C_0
RETI
;//////////////////////////延时程序/////////////////////////
;输入;无
;输出: 无
;实现的功能:延时一段时间
DELAY:
MOV R5,#20H
L8: MOV R6,#20H
DJNZ R6,$
DJNZ R5,L8
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;///////结束//////////////////////////////
END
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1