单片机万年历汇编闹钟时间可调程序LCD1602DS18B20DS1302MAX810L.docx
《单片机万年历汇编闹钟时间可调程序LCD1602DS18B20DS1302MAX810L.docx》由会员分享,可在线阅读,更多相关《单片机万年历汇编闹钟时间可调程序LCD1602DS18B20DS1302MAX810L.docx(53页珍藏版)》请在冰豆网上搜索。
单片机万年历汇编闹钟时间可调程序LCD1602DS18B20DS1302MAX810L
片机万年历汇编闹钟时间可调程序(LCD1602,DS18B20,DS1302,MAX810L)
说明:
1该程序全部是用汇编语言编写
1.该程序附带有温度显示,并且带有闹铃功能
2.正常时间和闹钟时间都可以用键盘设置
3.该程序是使用LCD1602显示年月日,格式为TIMEXX-XX-XXXX,由于屏幕的关系,所以就不显示周的数据,其中闹铃调整的上界面是“BELLADJUST”
4.该程序的时间是由时钟芯片DS1302提供的,据说很精准,目前看起来确实是这样的,刚开始我是使用定时器计时的,但是不怎么精准,可能是我的汇编技术有限才导致,所以本人就把这个版本呈上,希望诸位多多斧正
5.该程序的温度是通过DS18B20提取的,这个模块是我从别人那里COPY过来的,O(∩_∩)O~,显示是肯定没问题的
6.该程序也有用MAX810l的复位功能,但是好像这一点还没被体现出来
7.烧程序我使用的是MAX232外加几个极性电容,还有一个RS232,不幸的是我的PCB板的RS232的封装画错啦!
!
~~~~(>_<)~~~~
8.该万年历是由五个按键控制的,SW5复位,SW1调时间,调年月日时分秒,除秒可以加减调节之外其余的调节都是只能加不能减(自我觉得如果增加减的功能会觉得程序复杂,所以免!
),SW4是用来调节闹钟的时分秒的,和SW1按键不同的是时分秒都能加减,当闹钟设置的时间和正常显示时间的时分秒相同时,闹铃十秒钟,期间你可以按SW4键终止响铃,SW2和SW3分别是用来加减时间的!
9.说了这么多,最后说说自我认为的缺陷,行家应该都一眼就看出一些破绽了,那就是按键消抖的问题,这个我觉得有点麻烦所以本人就把这个问题留给阅览资料的你吧!
10.废话说了这么多,最后把我的程序,ORCAD电路原理图,PADS软件的PCB图,以及一张实物图献上,希望你能喜欢,页脚有我的Email(prettyboy2009@),欢迎随时交流!
程序:
;***************************************************************
;***************************************************************
RSBITP2.7;P2.5
RWBITP2.6;P2.6
EBITP2.5;P2.7
SUBITP2.1;P1.6;1302串行口数据端
RSTBITP3.7;P1.5
CLKBITP3.6;P1.7
ALARMBITP1.2;P2.3
JIANBITP1.0;P2.2;减
JIABITP1.3;P2.1;加
MOSHIBITP1.1;P2.0;模式
DQBITP1.4;P1.0
SOUNDBITP3.4;P1.3
NIANEQU7FH
YUEEQU7DH
DAYEQU7CH
HHHEQU7EH
SHIEQU7BH
FENEQU7AH
MIAOEQU79H
ASHIEQU78H
AFENEQU77H
AMIAOEQU76H
GEWEQU75H
COUNTEQU74H
A_BITEQU70H;18B20
B_BITEQU6FH
FLAGEQU6EH
DS1302_ADDREQU6DH
DS1302_DATAEQU6CH
ORG0000H
LJMPSTART
ORG0030H
;***************************************************************
;初始化开机时间&&&&&&&初始化闹铃时间
;***************************************************************
START:
MOVDPTR,#TAB
MOVSHI,#16H
MOVASHI,#17
MOVFEN,#58H
MOVAFEN,#30
MOVMIAO,#00H
MOVAMIAO,#00
MOVNIAN,#11H
MOVYUE,#12H
MOVDAY,#13H
MOVHHH,#00H
;***************************************************************
;初始化LCD1602&&&&&&&初始化DS1302
;***************************************************************
MOVP0,#01H;显示清屏数据指针清零所有显示清零
LCALLWR_CODE
MOVP0,#02H;显示回车数据指针清零
LCALLWR_CODE
MOVP0,#38H;设置16*2显示5*7点阵8位数据接口
LCALLWR_CODE
MOVP0,#06H;当写或写一个数据时地址指针自动加一光标自动加一
LCALLWR_CODE
MOVP0,#0cH;开显示不显光标0fh开显示开光标光标闪烁
LCALLWR_CODE
LCALLWR_DS1302
LCALLXIANSHI
LCALLXIAN1
;***************************************************************
;主函数(这个大家都懂的)
;***************************************************************
MAIN:
lcallRD_DS1302
LCALLXIANSHI
lcallkey
LCALLAKEY
LCALLRE_TEMP
LCALLCONVER
LCALLDISPLAY_INT
LJMPBELLRING
;***************************************************************
;读1302子程序
;***************************************************************
RD_DS1302:
MOVDS1302_ADDR,#8DH;读DS1302中的年
LCALLREAD;调用读DS1302子程序
MOVNIAN,DS1302_DATA;把读出的年数据存入年寄存器中
MOVDS1302_ADDR,#89H;读DS1302中的月
LCALLREAD
MOVYUE,DS1302_DATA;把读出的月数据存入月寄存器中
MOVDS1302_ADDR,#87H;读DS1302中的天
LCALLREAD
MOVDAY,DS1302_DATA;把读出的天数据存入天寄存器中
MOVDS1302_ADDR,#85H;读DS1302中的小时
LCALLREAD
MOVSHI,DS1302_DATA;把读出的天数据存入小时寄存器中
MOVDS1302_ADDR,#83H;读DS1302中的分钟
LCALLREAD
MOVFEN,DS1302_DATA;把读出的天数据存入分钟寄存器中
MOVDS1302_ADDR,#81H;读DS1302中的秒钟
LCALLREAD
MOVMIAO,DS1302_DATA;把读出的天数据存入秒钟寄存器中
RET
;***************************************************************
;写1302子程序
;***************************************************************
WR_DS1302:
MOVDS1302_ADDR,#8EH;写DS1302控制指令
MOVDS1302_DATA,#00H;写数据到DS1302的8E控制寄存器中,允许对其进行写操作
LCALLWRITE;调用写DS1302子程序
MOVDS1302_ADDR,#8CH;写DS1302中的年
MOVDS1302_DATA,NIAN;把写出的年数据存入年寄存器中
LCALLWRITE
MOVDS1302_ADDR,#88H;写DS1302中的月
MOVDS1302_DATA,YUE;把写出的月数据存入月寄存器中
LCALLWRITE
MOVDS1302_ADDR,#86H;写DS1302中的天
MOVDS1302_DATA,DAY;把写出的天数据存入天寄存器中
LCALLWRITE
MOVDS1302_ADDR,#84H;写DS1302中的小时
MOVDS1302_DATA,SHI;把写出的天数据存入小时寄存器中
LCALLWRITE
MOVDS1302_ADDR,#82H;写DS1302中的分钟
MOVDS1302_DATA,FEN;把写出的天数据存入分钟寄存器中
LCALLWRITE
MOVDS1302_ADDR,#80H;写DS1302中的秒钟
MOVDS1302_DATA,MIAO;把写出的天数据存入秒钟寄存器中
LCALLWRITE
MOVDS1302_ADDR,#90H;写DS1302控制指令
MOVDS1302_DATA,#0A6H;写数据到DS1302的90控制寄存器中,对电池涓流充电,充电电流为1.1mA
LCALLWRITE;调用写DS1302子程序
RET
;***************************************************************
;写1302程序
;***************************************************************
WRITE:
CLRCLK
NOP
SETBRST
NOP
MOVA,DS1302_ADDR
MOVR4,#8
WRITE1:
RRCA;送地址给1302
NOP
NOP
CLRCLK
NOP
NOP
NOP
MOVSU,C
SETBCLK;送入地址在时钟上升沿有效
NOP
NOP
NOP
NOP
DJNZR4,WRITE1
CLRCLK
NOP
MOVA,DS1302_DATA
MOVR4,#8
WRITE2:
RRCA
NOP;送数据给1302,时钟上升沿,数据输入
CLRCLK
NOP
NOP
MOVSU,C
NOP
NOP
NOP
SETBCLK
NOP
NOP
DJNZR4,WRITE2
CLRRST
CLRA
RET
;***************************************************************
;读1302程序
;***************************************************************
READ:
CLRCLK
NOP
NOP
SETBRST
NOP
MOVA,DS1302_ADDR
MOVR4,#8
READ1:
RRCA
NOP
MOVSU,C
NOP
NOP
NOP
SETBCLK;送入地址在时钟上升沿有效
NOP
NOP
NOP
CLRCLK
NOP
NOP
DJNZR4,READ1;判断8位数据是否传送完?
MOVR4,#8
READ2:
CLRCLK
NOP
NOP
NOP
MOVC,SU
NOP
NOP
NOP
NOP
NOP;从ds1302中读取数据,时钟下降沿有效
RRCA
NOP
NOP
NOP
NOP
SETBCLK
NOP
DJNZR4,READ2;判断8位数据是否传送完?
MOVDS1302_DATA,A
CLRRST
RET
;***************************************************************
;固定显示显示TIME,'-',:
;***************************************************************
XIAN1:
MOVP0,#84H
LCALLWR_CODE
MOVA,#'-';1602有字库可以直接调用不用查表
LCALLWR_DATA
MOVP0,#87H
LCALLWR_CODE
MOVA,#'-'
LCALLWR_DATA
MOVP0,#80H
LCALLWR_CODE
MOVA,#'2';计时100年所以20XX20是固定的
LCALLWR_DATA
MOVP0,#81H
LCALLWR_CODE
MOVA,#'0'
LCALLWR_DATA
MOVP0,#0C1H
LCALLWR_CODE
MOVA,#'T'
LCALLWR_DATA
MOVP0,#0C2H
LCALLWR_CODE
MOVA,#'I'
LCALLWR_DATA
MOVP0,#0C3H
LCALLWR_CODE
MOVA,#'M'
LCALLWR_DATA
MOVP0,#0C4H
LCALLWR_CODE
MOVA,#'E'
LCALLWR_DATA
MOVP0,#0CCH
LCALLWR_CODE
MOVA,#':
'
LCALLWR_DATA
MOVP0,#0C9H
LCALLWR_CODE
MOVA,#':
'
LCALLWR_DATA
MOVP0,#08EH
LCALLWR_CODE
MOVA,#0DFH
LCALLWR_DATA
MOVP0,#08FH
LCALLWR_CODE
MOVA,#'C'
LCALLWR_DATA
RET
;***************************************************************
;显示数据时分秒年月日周地址数据都在变化没用循环体
;***************************************************************
XIANSHI:
MOVHHH,MIAO
LCALLHEX
MOVP0,#0CDH
LCALLWR_CODE
MOVCA,@A+DPTR
LCALLWR_DATA
MOVA,B
MOVP0,#0CEH
LCALLWR_CODE
MOVCA,@A+DPTR
LCALLWR_DATA
MOVHHH,FEN
LCALLHEX
MOVP0,#0CAH
LCALLWR_CODE
MOVCA,@A+DPTR
LCALLWR_DATA
MOVA,B
MOVP0,#0CBH
LCALLWR_CODE
MOVCA,@A+DPTR
LCALLWR_DATA
MOVHHH,SHI
LCALLHEX
MOVP0,#0C7H
LCALLWR_CODE
MOVCA,@A+DPTR
LCALLWR_DATA
MOVA,B
MOVP0,#0C8H
LCALLWR_CODE
MOVCA,@A+DPTR
LCALLWR_DATA
MOVHHH,DAY
LCALLHEX
MOVP0,#088H
LCALLWR_CODE
MOVCA,@A+DPTR
LCALLWR_DATA
MOVA,B
MOVP0,#089H
LCALLWR_CODE
MOVCA,@A+DPTR
LCALLWR_DATA
MOVHHH,YUE
LCALLHEX
MOVP0,#085H
LCALLWR_CODE
MOVCA,@A+DPTR
LCALLWR_DATA
MOVA,B
MOVP0,#086H
LCALLWR_CODE
MOVCA,@A+DPTR
LCALLWR_DATA
MOVHHH,NIAN
LCALLHEX
MOVP0,#082H
LCALLWR_CODE
MOVCA,@A+DPTR
LCALLWR_DATA
MOVA,B
MOVP0,#08