自动打铃器YJ+.docx
《自动打铃器YJ+.docx》由会员分享,可在线阅读,更多相关《自动打铃器YJ+.docx(30页珍藏版)》请在冰豆网上搜索。
自动打铃器YJ+
自动打铃器YJ+
————————————————————————————————作者:
————————————————————————————————日期:
;将原来的自动光照控制器,改进成自动打铃控制器
;仍然可以记录32次,每次操作使电铃响10秒
;液晶显示时分秒,按钮设置打铃时刻
;使用方法:
;临时打铃:
按临时打铃按钮,铃响;放开则铃停
;对表:
按对表按钮,出现闪动显示的项目,再按向上(或向下),改变闪动项目;再按增加(或减少)按钮调整当前项目值
;对表时可以调整的项目有:
星期-月-日小时-分-秒
;定时设定:
可以设定的项目有:
小时-分,序号只是个便于区别的记录号,与打铃顺序无关
;按定时设定按钮,出现闪动的项目,按向上(或向下)可以改变闪动项目,按增加(或减少)可以修改当前闪动项目的值
;再次按对表(或设定)按钮则退出对表(或设定)状态,对表(或设定)状态下,5秒不操作自动退出
;自动打铃时间到,会响铃10秒
;一个记录的小时设置为24,这个记录就不用
;走时误差的调整:
;进入对表状态后,按一下临时打铃键,进入快慢调整状态,再同时按下上下左右四个键,就可以开始调整快慢啦
;此时,按一下向上键,调整数值加一,按一下向下键,调整数值减一,达到你需要的数值,等待2秒,自动完成调整
;调整数值一个负数,每24小时慢1.728秒,一个正数,每24小时快1.728秒。
;打铃时间的调整:
;进入定时设定,按临时打铃键,进入打铃时间调整状态,按增加键秒数增加,按减少键秒数减少
;秒数合适后,等待2秒,自动完成。
最多50秒。
;单片机采用AT89C2051
;晶振采用6MHZ,机器周期=2us(微秒)
;定时器0方式一,
;显示格式变时-分-秒11-43-35星期月日405_22
;内存分配:
;主程序使用工作寄存器第0区,
;定时器中断使用第1区
;显示子程序使用第2区10h-17h,
;20H-21H:
延时子程序
;22H定时器0中断使用,计算月份日数
;23H响铃秒数值,默认10秒,可以调整
;24H快慢调整时计数用。
改变一个数,每24小时快(或慢)1.728秒
;25H液晶显示程序用于控制循环次数
;26H:
响铃时间计数
;27H:
秒状态记实
;28H:
分状态记实
;29h:
29H.0对表标志,0=对表,1=不对表
;29h.1防止一分钟响铃2次标志,
;29h.1=0,一分钟内不查找其他记录
;29h.1=1,指示可以查找记录
;29h.2:
;29H.60=可以调用一次显示时间子程序,1=不可以
;29H.7定时设定标志
;2AH-2BH:
定时器时间常数=3CB0H
;2ch-2DH:
;2EH-2FH:
干扰标志AAH55H
;30H-3FH:
堆栈区
;40H-7FH:
开关时间记录,格式:
时1字节+分1字节=2字节,共可以有32个记录
;I/O口分配:
;p1.0内部比较器同相输入端,输入,没用
;p1.1内部比较器反相输入端,输入,没用
;p1.2:
输出控制,出0=铃响灯亮,1=不响灯灭
;p1.3:
工作指示出0=讯响器响,1=不响
;p1.4:
选择向上开关入按下=0
;p1.5:
选择向下开关入
;p1.6:
调整增加开关入
;p1.7:
调整减少开关入
;p3.0:
串行口TXD,显示
;p3.1:
串行口RXD,显示
;p3.2:
INT0,对表按钮入
;p3.3:
INT1,定时按钮入
;p3.4:
T0,没用
;p3.5:
T1,没用
;p3.6:
内部是比较器的输出信号,P1.0电平高于P1.1时得1,没有引出片外
;p3.7:
临时打铃用按钮
org0000h
ljmpmain
org0003h
ljmpint0fw;外中断0服务
;CPL29H.0;对表设定标志
;RETI
org000bh
ljmpt0fw;定时器0中断服务
org0013h
ljmpint1fw;外中断1服务
;cpl29h.1;定时设定标志
;reti
org001bh
ljmpganrao
ljmpganrao
;ljmpt1fw
org0023h
ljmpganrao
ljmpganrao
ljmpganrao
ljmpganrao
;ljmptirifw
org0030h
main:
mova,2eh
xrla,2fh
cjnea,#0ffh,maina
ljmpmain1
maina:
;mov08h,#0;时间从0开始
;mov09h,#0
;mov09h,#0
;mov0ah,#0
;mov0bh,#0
;mov0ch,#0
;mov0dh,#0
;mov0eh,#01;星期一
;mov0fh,#0
MOV23H,#10;响铃10秒
MOV26H,#0;当前响铃时间倒计时
MOVP1,#0FFH;输出全1,
MOVP3,#0FFH
mov29h,#0ffh
MOV2AH,#03CH;定时器初值高字节(计算值是3CBOH,补偿13个周期,
;就是3CBDH)
MOV2BH,#0BDH;定时器初值低字节(补偿时间包括:
中断响应3个,
;中断服务程序开头到重新装入初值14个周期,频率误差根据经验少补4)
main1:
nop
movsp,#2fh;堆栈从30H开始
movie,#87h;允许T0、INT0、INT1中断
movip,#02h;T0高优先
movtmod,#01h;t0方式1
MOVTCON,#05H;外中断下降沿触发
movth0,#03ch;T0初值6计数250个
movtl0,#0b0h;定时500us(250*2us=500us)
setbtr0;启动定时器0
mov2eh,#0;清除干扰标志
mov2fh,#0
lcallxssj
lm:
nop;主循环从此开始======================
movie,#87h;允许外部中断和T0中断
JB29H.6,LM1;29H.6=1,不调用显示
SETB29H.6;29H.6=0,可以,并清除此标志
lcallxssj;显示时间
JNBP1.7,XSYRXQZZ
JNBP1.6,XSYRXQZZ
JNBP1.5,XSYRXQZZ
JNBP1.4,XSYRXQZZ
LM1:
jnb29h.0,duibiao;转对表
JNB29H.7,dssdZZ;转定时设定
LM2:
;SETBP1.3;蜂鸣器不响
lm3:
JBP3.7,LM10;没有临时打铃,转自动1=自动
clrp1.2;临时打铃,铃响0=临时打铃
lcallzssd;蜂鸣器响
sjmplm
lm10:
mova,26h;响铃时间秒
cjnea,#0,lm10z;响铃秒数不为0,继续响铃
setbp1.2;响铃秒数为0,不响铃
setbp1.3;蜂鸣器不响
jb29h.1,lm1000;29h.1=1,指示可以查找记录
mova,0Ah;为保证一次记录(一分钟内)只响铃一次(10秒)
xrla,28h;比较当前时间和记录时间的分
jzlm10z;相同时,A中内容为0,不再查找别的记录
setb29h.1;29h.1=1,指示可以查找记录,
;在下一个小时同一分钟也可以查找
lm1000:
MOVR7,#20H;记录总数------查找记录开始
MOVR0,#40H;记录的开始地址
lm100:
MOVA,@R0;取记录的第一字节--小时
CJNEA,#24,LM101;小时设置24,这个记录就不用比较,亦即不打铃
SJMPLM10A;是24,不用比较,查找下一个记录
LM101:
CJNEA,0bH,LM10A;记录小时与当前小时比较,不相等转移
INCR0;相等,指向下一个地址
mova,@r0;取记录的第二字节--分
cjnea,0Ah,lm10b;记录的分比较,不相等
clrp1.2;分也相等,操作时间到,响铃
lcallzssd;蜂鸣器响
mov26h,23H;响铃10秒
mov27h,09h;当前秒状态记实
mov28h,0Ah;当前分状态记实
clr29h.1;29h.1=0,一分钟内不查找其他记录
sjmplm10z
lm10a:
incr0
lm10b:
incr0
;incr6;记录号加1
djnzr7,lm100;查找下一个记录
lm10z:
mova,26h;响铃时间秒
cjnea,#0,lm10z1;响铃秒数不为0,继续响铃
setbp1.2;响铃秒数为0,不响铃
setbp1.3;蜂鸣器不响
ljmplm10z3;
lm10z1:
clrp1.2;响铃
lcallzssd;蜂鸣器响
mova,09h;秒
cjnea,27h,lm10z2;检查秒数是否变化
ljmplm10z3;没有变化
lm10z2:
mov27h,09h;有变化,保存新秒
dec26h;响铃秒数倒计时
lm10z3:
ljmplm;主循环到此结束===================
DSSDZZ:
LJMPDSSD;中转到定时设定
XSYRXQZZ:
LJMPXSYRXQZ
ljmpganrao
ljmpganrao
ljmpganrao
ljmpganrao
DUIBIAO:
NOP;对表程序
clrex1;禁止外部中断1
movr7,#15h;对表操作空闲时间限制,15h*0.15=3.15秒
movr1,#09h;秒地址
duibiao1:
CJNER1,#0CH,DUIBIAO1A
DUIBIAO1A:
JNCDUIBIAO1B;地址大于等于0CH是日月星期
lcallxssj;显示时间
SJMPDUIBIAO1C
DUIBIAO1B:
LCALLXSYRXQ;显示月日星期
DUIBIAO1C:
lcallbbb;延时50MS
CJNER1,#0CH,DUIBIAO1D
DUIBIAO1D:
JNCDUIBIAO1E;地址大于等于0CH是日月星期
lcallXGSJA;修改时间暗点
LCALLYJXS;显示暗点
SJMPDUIBIAO1F
DUIBIAO1E:
LCALLXGYRXQA;修改月日星期暗点
LCALLYJXS;显示
DUIBIAO1F:
lcallbbb;延时50MS
CJNER1,#0CH,DUIBIAO1G
DUIBIAO1G:
JNCDUIBIAO1H;地址大于等于0CH是日月星期
lcallxssj;显示时间
SJMPDUIBIAO1I
DUIBIAO1H:
LCALLXSYRXQ;显示月日星期
DUIBIAO1I:
lcallbbb;延时50MS
movp1,#0ffh
mova,p1
jnbacc.4,db4;选择向上按钮
jnbacc.5,db5;选择向下按钮
jnbacc.6,db6;调整增加按钮
jnbacc.7,db7zz;调整减少按钮
jnbp3.7,kmzz
jb29h.0,duibiaoz;对表结束
djnzr7,duibiao1
setb29h.0;自动结束对表
duibiaoz:
LJMPLM;对表结束
;--
db4:
incr1;指示调整的项目地址,向上一个
cjner1,#0fh,db41;判断地址范围
db41:
jcdb42;小于等于上限,可以了
movr1,#09h;大于上限,回到最小地址,秒
db42:
movr7,#15h
ljmpduibiao1
;---
db5:
decr1;向下一个
cjner1,#09h,db51;判断地址范围
db51:
jNcdb52;大于等于下限,可以了
movr1,#0eh;小于下限,回到最大地址,星期
db52:
movr7,#15h
ljmpduibiao1
;-----------------
db7zz:
ljmpdb7
kmzz:
ljmpkm
;------------------
db6:
inc@r1;加1
cjner1,#0eh,db61;不是星期,下一个
cjne@r1,#08h,db601;判断星期上限
db601:
jcdb602;小于8,正常,继续
mov@r1,#1;大于等于8,回到最小值1
db602:
movr7,#15h;重置自动结束时间
db603:
ljmpduibiao1;继续对表
db61:
cjner1,#0dh,db62;不是月,下一个
cjne@r1,#13,db611;判断月上限
db611:
jcdb602;小于13,正常,继续
mov@r1,#1;大于等于13,回到最小值1
movr7,#15h;重置自动结束时间
ljmpduibiao1;继续对表
db62:
cjner1,#0ch,db63;不是日,下一个
cjne@r1,#32,db621;判断日上限
db621:
jcdb602;小于32,正常,继续
mov@r1,#1;大于等于32,回到最小值1
movr7,#15h;重置自动结束时间
ljmpduibiao1;继续对表
db63:
cjner1,#0Bh,db64;不是小时,下一个
cjne@r1,#24,db631;判断小时上限
db631:
jcdb602;小于24,正常,继续
mov@r1,#0;大于等于24,回到最小值0
movr7,#15h;重置自动结束时间
ljmpduibiao1;继续对表
db64:
cjner1,#0Ah,db65;不是分,下一个
cjne@r1,#60,db641;判断分上限
db641:
jcdb602;小于60,正常,继续
mov@r1,#0;大于等于60,回到最小值0
movr7,#15h;重置自动结束时间
ljmpduibiao1;继续对表
db65:
cjner1,#09h,db66;不是秒,下一个
cjne@r1,#60,db651;判断秒上限
db651:
jcdb602;小于60,正常,继续
mov@r1,#0;大于等于60,回到最小值0
movr7,#15h;重置自动结束时间
ljmpduibiao1;继续对表
db66:
ljmpganrao;是干扰,进入干扰处理
;--------------------------
org0202h
ganrao:
clrea
movsp,#2fh
movdptr,#ganrao1
pushdpl
pushdph
reti
ganrao1:
mov2eh,#0aah
mov2fh,#055h
clra
pusha
pusha
reti
;--------------------------
ljmpganrao
ljmpganrao
ljmpganrao
DB7:
DEC@r1;减1
cjner1,#0Eh,db71;不是星期,下一项
cjne@r1,#08h,db701;判断星期上限
db701:
jcdb702;小于8,正常,继续
mov@r1,#7;大于等于8,回到最大值7
db702:
CJNE@R1,#0,DB703;不等于0,继续
MOV@R1,#7;等于0,回到最大值7
db703:
movr7,#15h;重置自动结束时间
ljmpduibiao1;继续对表
db71:
cjner1,#0Dh,db72;不是月,下一个
cjne@r1,#13,db711;判断月上限
db711:
jcdb712;小于13,正常,继续
mov@r1,#12;大于等于13,回到最大值12
db712:
CJNE@R1,#0,DB703;不等于0,继续
MOV@R1,#12;等于0,回到最大值12
SjmpDB703;继续对表
db72:
cjner1,#0ch,db73;不是日,下一个
cjne@r1,#32,db721;判断日上限
db721:
jcdb722;小于32,正常,继续
mov@r1,#32;大于等于32,回到最大值31
db722:
CJNE@R1,#0,DB703;不等于0,继续
MOV@R1,#31;等于0,回到最大值31
SjmpDB703;继续对表
DB73:
cjner1,#0Bh,db74;不是时,下一个
cjne@r1,#24,db731;判断时上限
db731:
jcdb703;小于24,正常,继续
mov@r1,#23;大于等于24,回到最大值23
SJMPDB703
db74:
cjner1,#0Ah,db75;不是分,下一个
cjne@r1,#60,db741;判断分上限
db741:
jcdb703;小于60,正常,继续
mov@r1,#59;大于等于60,回到最大值59
sjmpdb703;继续对表
db75:
cjner1,#09h,db76;不是秒,下一个
cjne@r1,#60,db751;判断秒上限
db751:
jcdb703;小于60,正常,继续
mov@r1,#59;大于等于60,回到最大值59
movr7,#15h;重置自动结束时间
ljmpduibiao1;继续对表
db76:
ljmpganrao;是干扰,进入干扰处理
ljmpganrao
ljmpganrao
km:
mov24h,#0;快慢调整,初值0
movr7,#10;
LCALLKMXS
kml:
MOV17H,R7
lcallYJxs;显示倒计时
lcallbbb
mova,p1;P1口输入
anla,#0f0h;屏蔽低四位
jnzkmx;高四位不全是0,下一次
lcallyjxs;同时按下四个键,显示
lcallbbb;延时80毫秒
mova,p1;P1口输入
anla,#0f0h;屏蔽低四位
jnzkmx;高四位不全是0下一次
ljmpkmtz;同时按下四个键,且保持80毫秒以上,
;进入快慢调整
kmx:
djnzr7,kml
setb29h.0
ljmplm
kmtz:
movr7,#10;快慢调整
kmtz1:
MOV11H,R7
lcallYJxs
lcallbbb
jnbp1.6,kmtz2
jnbp1.7,kmtz3
sjmpkmtz4
kmtz2:
inc24h;加1,加快
movr7,#10
sjmpkmtz4
kmtz3:
dec24h;减1,减慢
movr7,#10
kmtz4:
MOVA,24H
JBACC.7,KMTZ42;负数处理
MOV16H,#10H;正数无符号
CJNEA,#10,KMTZ41;正数,判断值
KMTZ41:
JCKMTZ44;小于10,继续
MOV24H,#0;大于等于10,回到0
MOVA,24H
SJMPKMTZ44
KMTZ42:
MOV16H,#11H;负号
CPLA;取反
INCA;末位加1,得到绝对值
CJNEA,#10,KMTZ43;判断绝对值
KMTZ43:
JCKMTZ44;其绝对值小于等于9,可以继续
MOV24H,#0;绝对值大于等于10,回到0
MOVA,24H
KMTZ44:
MOV17H,A;
lcallYJxs;显示值
lcallbbb
djnzr7,kmtz1;循环10次
mova,17h;显示的结果
cjnea,#10,kmtz5;比较
kmtz5:
jnckmtzz;大于等于10无效
mova,16h;符号位
cjnea,#11h,kmtz6;正数处理
mova,2bh;负数
clrc
subba,17h;直接相减
mov2bh,a;送到常数单元保存
sjmpkmtzz
kmtz6:
mova,2bh
adda,17h;正数要加
mov2bh,a
kmtzz:
setb29h.0
ljmplm;快慢调整结束
;-
kmxs:
MOV10H,#10h;不显示
MOV11H,#10h
MOV12H,#10H
MOV13H,#10h
MOV14H,#10h
MOV15H,#10H
MOV16H,#10h
MOV17H,#10H
LCALLYJXS
RET
;---
ljmpganrao
ljmpganrao
ljmpganrao
;延时程序80MS
bbb:
mov20h,#80
bbb1:
mov21h,#250
bbb2:
nop
nop
djnz21h,bbb2
djnz20h,BBB1
ret
;INT0中断服务
int0fw:
lcallbbb
cpl29h.0;对表标志
lcallbbb
reti
;INT1中断服务
int1fw:
lcallbbb
CPL29H.7;定时设定记录标志
lcallbbb
reti
;定时器0中断服务程序,t0方式1,初值15536,100毫秒中断一次,高优先级
t0fw:
pusha
pushb;保护现场
pushpsw;
setbrs0;选择工作寄存器第1组
clrrs1
MOVTH0,2AH;定时器重新赋值,高字节
MOVTL0,2BH;低字节
INCR0;100毫秒数(在08H中)
CJNER0,#10,T0FWZ
INCR1;1秒数(在09H中)
MOVR0,#0
CLR29H.6;可以调用一次显示程序
cjne