自动打铃器YJ+.docx

上传人:b****7 文档编号:9833131 上传时间:2023-02-06 格式:DOCX 页数:35 大小:23.16KB
下载 相关 举报
自动打铃器YJ+.docx_第1页
第1页 / 共35页
自动打铃器YJ+.docx_第2页
第2页 / 共35页
自动打铃器YJ+.docx_第3页
第3页 / 共35页
自动打铃器YJ+.docx_第4页
第4页 / 共35页
自动打铃器YJ+.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

自动打铃器YJ+.docx

《自动打铃器YJ+.docx》由会员分享,可在线阅读,更多相关《自动打铃器YJ+.docx(35页珍藏版)》请在冰豆网上搜索。

自动打铃器YJ+.docx

自动打铃器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;可以调用一次显示程序

cjner1,#60,t0fwz

incr2;1分数(在0aH中)

movr1,#0

cjner2,#60,t0fwz

incr3;60分=1小时数(在0bH中)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1