; *************************************************日期:2007.10.26 12MHZ晶振
********
设置的时间和秒显示的数字闹钟
;创建的:星级徒劳
P3.2设置键P3.3分钟调整键调整键P3.5,P3.7输出表示
时机; ********************* *****************************************
; **** ************************************************** ***
;变量地址分配
; ********************************** ***********************
SwDelay EQU 2;去抖时间设置按钮
DisplayBuffer EQU 30H;设置显示的地址6个字节的缓冲EQU 38H 30H-35H
BeepVal,蜂鸣器持续时间内存地址
OneSecondCounter EQU 39H;设置一个第二个地址计数器,1个计数器是用来计数的秒计时器中断< /小时EQU 3AH;小时计数器地址
分钟EQU 3BH;
二EQU 3CH分钟计数器地址设置秒计数器地址
年EQU 3DH,地址
计数器的设定月日年月EQU 3EH;
日EQU 3FH;
P1Val EQU 40H;,驱动器的设定值数码管的位地址
ClockMode EQU 20h.0;模式设置注册地址(正常行车时间/故障),值的正常0:00,1:00麻烦的设置
AlarmOnOff EQU 20h.1报警开启/关闭标志0关闭1个开放式
AlarmTimeOn EQU 20h.2这组报警时至下午1
DataMode EQU 20h.3
DispHour EQU 21H;固定时间显示的寄存器地址
DispMinute EQU 22H;显示寄存器地址
DispSecond EQU 23H分钟;秒注册地址
Dnum EQU 24小时
AlarmHour EQU 2EH,一套市中心的小时计数器地址
AlarmMinute EQU 2FH;分钟计数器地址/> AlarmSetKey嘈杂位P3.2;报警设置键
MinuteKey位P3.3,关键定义的子集
HourKey位P3.4;定义的小时设置键
DataSetKey位P3.5;
重新布局EQU P3.7;定义输出引脚
; *************************** *******************************************
;程序开始
; ********************************************* *************************组织结构0BH
组织结构,00H
AJMP的复位程序开始
Timer0中断向量地址
AJMP TimeInt。跳转到中断处理程序
ORG 0020H
复位:下面的初始化过程,初始值?为每个变量
MOV SP,# 70H;
SETB重新布局
MOV OneSecondCounter,#125
MOV小时,23#
MOV分钟,第59
MOV二,#30;设定时钟显示时,上电的初始值
的MOV年,第07
MOV月12
MOV日第27
/> MOV AlarmHour,#00
MOV AlarmMinute,#00;初始时间
设定的功率市中心
CLR AlarmOnOff麻烦复位后的最后一点是关闭
CLR AlarmTimeOn
清SETB重新布局;市中心输出
CLR DataMode
;
MOV 36H,#10
MOV 37H ,#11
; ************************************ BR />使用定时器0模式1
;速度400us中断
; ***************************** *******
MOV TMOD,#00000001B
MOV TH0,#0E3h
MOV TL0,#5DH
MOV IE,#82H;开放全局中断
> SETB EA
SETB ET0
SETB TR0;打开定时器中断
; ********************* ********************
以下主要程序
; ***************** ************************
主循环:
JB AlarmSetKey,CheckMinuteKey;市中心键被按下时设置的吗?没有秒检测到的关键
的呼叫时延
JB AlarmSetKey,CheckMinuteKey按下超过500ms?
SETB ClockMode的设置模式设置麻烦
呼叫AlarmSet
CheckMinuteKey:
JB MinuteKey,CheckHourKey子键被按下?然后打开检测时间设置键
如按通话蜂鸣器发音程序
MOV一分钟
ADD A,#1,如果记者是钟加小数点后一位数调整
的MOV分钟,;
CJNE A,#3CH,NotOver1到60分钟呢?
MOV分钟,#0;清除分钟到60分钟0
NotOver1:等待按键释放和抖动
的JNB MinuteKey下面的$。
CheckHourKey:
JB HourKey,CheckDataKey
;如按
MOV A呼叫蜂鸣器发音的程式小时
ADD A,#1,如果记者会时间加
的MOV小时,一个
CJNE A,#18H,NotOver2
MOV小时,0至24小时将被清除小时0
NotOver2:下面的按钮释放等待和抖动
JNB HourKey,
CheckDataKey:
JB DataSetKey,CheckAlarm
呼叫时延
JB DataSetKey,CheckAlarm
SETB DataMode
调用数据集
CheckAlarm“
JNB AlarmTimeOn,一去不复返
呼叫AlarmProcess
一去不复返:
AJMP主循环
; ************* *********************************
定时器定时器0中断服务程序(此程序执行一次8毫秒)
; ******************************************* *** BR /> TimeInt:
MOV TH0,#0E3h;的重载时序参数
MOV TL0,#5DH;
推按
PUSH PSW;保护累加器和程序状态字的内容
SETB RS0的选择工作寄存器设置为1
CLR RS1,这可以保护原来的工作寄存器组(0组)的内容
DJNZ OneSecondCounter NotoneSecond中断125次呢?这是一秒钟,足够吗?
MOV OneSecondCounter,#125;足够的第二次重设“OneSecondCounter”反
调用时钟子程序调用加上一个第二个时钟
呼叫Daynum
呼叫ConvertoBuffer调用转换的时钟显示缓冲区的内容子程序
NotoneSecond的:
呼叫ScanDisplay呼叫扫描子程序
POP PSW
弹出ACC恢复累加器和程序状态字的内容/> RETI;中断返回
; ********************************** ***********
;扫描显示子程序
; ************************** *******************
ScanDisplay:
MOV R1,#DisplayBuffer指向显示数据的第一个站点
MOV R5,# 0FEH;扫描控制字的初始价值
PLAY“:
MOV A,R5;扫描字为MOV P2,A; P2口输出
MOV A,_at_ R1;一个
MOV DPTR,#TAB的数据段表地址
MOVC A _at_ A + DPTR;调查显示对应的数据段代码
MOV P1,A;段代码到P1端口
LCALL延迟
INC R1;指向下一个地址
MOV A,R5;扫描控制字中的一个
JNB ACC 0.7,ENDOUT扫到第六位,在最后
RL A; A中的数据循环左移
MOV R5,A,把
和AJMP R5的范围内发挥;跳一个播放循环
ENDOUT:MOV P2,#0FFH;端的显示,P2端口复位
MOV P1,#00H; P1端口复位
RET子程序返回
共阴极段表中“0”,“1”,“2”,“ 3“,”4“5”“6”“7”“8”“9”,“ - ”,“C”
; ******************* *********************************
;子程序时钟加一
; **************************************************
时钟:
MOV A,第二,原来的第二个值到一个
ADD A,#1,添加1秒
MOV二一
CJNE ,#3CH,NotOverFlow够60秒?
MOV其次,#0;足够的,那么第二个值被清为0
MOV A,分
一个
MOV分钟#1,加1;分钟
CJNE A,#3CH NotOverFlow,足够为60点?
MOV分钟,#0;足够的话得分0 / a>
MOV A,小时
添加#1
MOV小时,小时加1
CJNE A,#18H,NotOverFlow的24小时,足够吗? BR /> MOV小时,#0;将足够小时0
值清;
MOV,日
添加#1
MOV日, BR /> CJNE A,Dnum,NotAlarm
MOV日,#1
;
月MOV A,
添加,#1
MOV月, /> CJNE A,#13,NotAlarm
MOV月,#1
MOV A,年
添加,#1
的MOV年,
CJNE A,#11,NotAlarm
MOV年,#0
NotOverFlow:
JNB AlarmOnOff,NotAlarm报警打开如果没有是否麻烦时,你不这样做吗?需要费心时间
MOV A,第二
的JNZ NotAlarm秒零?
MOV A,分
CJNE A,AlarmMinute,NotAlarm分钟的时间值吗?时有噪音等于分钟值吗?
MOV A,小时
CJNE A,AlarmHour,NotAlarm小时的时间值和设定小时故障时同等价值吗?
SETB AlarmTimeOn;时间到市中心设置闹钟时间到“标志设置为1
NotAlarm:
RET; ************ ************************************************** ************
;转换的时钟内容或市中心的设定值的显示缓冲区子程序
; **************** ************************************************** ********
MOV R1,ConvertoBuffer:#DisplayBuffer
是JNB dataMode,TimeDisp
MOV A,日
MOV DispSecond,
MOV DispMinute,的
MOV A,年
MOV DispHour,一个
AJMP转换
TimeDisp:JB ClockMode,DispAlarmSet判断时钟模式,以决定是否显示实时或报警时间
MOV A,第二
MOV DispSecond,
MOV A,分
MOV Dispminute,;
MOV A,小时;
MOV DispHour;显示实时
AJMP转换
DispAlarmSet:
JB AlarmOnOff的AlarmOn
传送DispSecond,#00H
AJMP
AlarmOn:
MOV DispSecond,#11;显示,故障和报警状态:显示00“关闭报警
下一页:“十一”开放式报警
MOV A AlarmMinute
MOV Dispminute,在
MOV A AlarmHour
MOV DispHour,
;
转换:
MOV A,DispSecond;秒值
MOV B,#10
DIV AB
MOV _at_ R1,B;
加R1;缓冲寄存器地址加1
MOV @ R1,A;10秒值值的缓冲
公司R1
MOV A,DispMinute
MOV B,第10
DIV AB
MOV @ R1,B;
INC R1缓冲寄存器地址加1
MOV _at_ R1,10秒值的值到缓冲区
;
INC R1
MOV A DispHour
MOV B,#10
DIV AB
MOV _at_ R1,B,地址加
INC R1;有缓冲寄存器
MOV @ R1,A;十秒钟值?值?存储在缓冲区
RET;
; ********** *********************************************
;判断的天数,闰年,闰年
; ********************************* **********************
Daynum:MOV A,月的
MOV DPTR,#TABL
MOVC A,@ A + DPTR的
MOV,
MOV A,Dnum年
MOV B,#4
DIV AB
MOV A,B
CJNE A,#0 ,BB
MOV A,月
CJNE A,#2,BB
公司Dnum
BB:RET
TABL:DB 31,32,29,32,31 ,32,31,32,32,31,32,31,32
; ********************* *****************************
;麻烦时,子程序
; ******* *******************************************
AlarmSet: BR /> JNB AlarmSetKey
通话延时,等待“AlarmSetKey键释放
CheckArmMinuteKey:
JB MinuteKey,CheckArmHourKey子键被按下?然后打开时检测设置键
的SETB AlarmOnOff的
MOV 37H,#0
MOV A AlarmMinute
ADD A,#1,按分钟加1位小数调整
为MOV AlarmMinute;的
CJNE A#3CH,ArmNotOver1,到60分钟?
MOV AlarmMinute,#0;清将到60分钟0
ArmNotOver1:下面的等待的按钮释放和抖动
JNB MinuteKey。
CheckArmHourKey:
JB HourKey,AlarmSetEnd小时SET键被按下?没回反复测试
SETB AlarmOnOff
MOV A AlarmHour
添加了#1,如果按小时加
MOV AlarmHour一个
CJNE A,# 18小时,ArmNotOver2
MOV AlarmHour,#0;清0小时至24小时将是
ArmNotOver2的:等待下面的按钮释放和抖动
JNB HourKey
AlarmSetEnd:
JB AlarmSetKey,AlarmSet的吗?
JNB AlarmSetKey;
CLR ClockMode;步行模式设置的模式
RET
; ************* **** ****************************
;日起调整
; **** *****************************************
数据集: JNB DataSetKey,$
CALL DELAY
CheckDataYearKey的
JB HourKey,CheckDataMonthKey
MOV A,年
添加,#1
MOV年,
CJNE A,#11,DataNotOver1
MOV年,#0
DataNotOver1:
CheckDataMonthKey JNB HourKey:
JB MinuteKey,CheckDataDayKey < / MOV A,月
A,#1
MOV月一个
CJNE A,#13,DataNotOver2
MOV月,#1的
DataNotOver2: BR /> JNB MinuteKey,
CheckDataDayKey:
JB AlarmSetKey,DataSetEnd
MOV A,天
添加,#1
MOV日,一个
,#1
DataNotOver3 CJNE A,Dnum,DataNotOver3
MOV日:
JNB AlarmSetKey,
DataSetEnd:
JB DataSetKey,数据集
JNB DataSetKey,
CLR DataMode
RET
; ***************************** *********************
;服务程序的问题时
; *************** ***********************************
AlarmProcess:
CLR重新布局; /> JB AlarmSetKey,AlarmReturn停止麻烦时,按下键(即麻烦的是,当设置键)?
CLR AlarmOnOff
JNB AlarmSetKey;
SETB重新布局,停止吵闹时,按下该键停止麻烦
CLR AlarmTimeOn;
MOV 37H,第11 / MOV AlarmMinute,#00
#00 MOV AlarmHour,
AlarmReturn:
RET
; ************** ************************************
;延时子程序
; ** ************************************************ />延迟:
MOV R6,#2
删除:
MOV R7,#124
DJNZ R7,$
DJNZ R6,德尔
RET BR /> DL1s:MOV R3,#4
DD:CALL DELAY的
DJNZ R3,日
RET
结束
这用protues