自动打铃器YJ+

  • 格式:doc
  • 大小:167.00 KB
  • 文档页数:25

自动打铃器YJ+————————————————————————————————作者:————————————————————————————————日期:2;将原来的自动光照控制器,改进成自动打铃控制器;仍然可以记录32次,每次操作使电铃响10秒;液晶显示时分秒,按钮设置打铃时刻;使用方法:;临时打铃:按临时打铃按钮,铃响;放开则铃停;对表:按对表按钮,出现闪动显示的项目,再按向上(或向下),改变闪动项目;再按增加(或减少)按钮调整当前项目值;对表时可以调整的项目有:星期-月-日小时-分-秒;定时设定:可以设定的项目有:小时-分,序号只是个便于区别的记录号,与打铃顺序无关;按定时设定按钮,出现闪动的项目,按向上(或向下)可以改变闪动项目,按增加(或减少)可以修改当前闪动项目的值;再次按对表(或设定)按钮则退出对表(或设定)状态,对表(或设定)状态下,5秒不操作自动退出;自动打铃时间到,会响铃10秒;一个记录的小时设置为24,这个记录就不用;走时误差的调整:;进入对表状态后,按一下临时打铃键,进入快慢调整状态,再同时按下上下左右四个键,就可以开始调整快慢啦;此时,按一下向上键,调整数值加一,按一下向下键,调整数值减一,达到你需要的数值,等待2秒,自动完成调整;调整数值一个负数,每24小时慢1.728秒,一个正数,每24小时快1.728秒。

;打铃时间的调整:;进入定时设定,按临时打铃键,进入打铃时间调整状态,按增加键秒数增加,按减少键秒数减少;秒数合适后,等待2秒,自动完成。

最多50秒。

;单片机采用AT89C2051;晶振采用6MHZ ,机器周期=2us(微秒);定时器0方式一,;显示格式变时-分-秒 11-43-35 星期月日4 05_22;内存分配:; 主程序使用工作寄存器第0区,; 定时器中断使用第1区; 显示子程序使用第2区10h-17h,;20H-21H:延时子程序;22H 定时器0中断使用,计算月份日数;23H 响铃秒数值,默认10秒,可以调整;24H 快慢调整时计数用。

改变一个数,每24小时快(或慢)1.728秒3;25H 液晶显示程序用于控制循环次数;26H : 响铃时间计数;27H :秒状态记实;28H :分状态记实;29h : 29H.0 对表标志,0=对表,1=不对表; 29h.1 防止一分钟响铃2次标志,; 29h.1=0,一分钟内不查找其他记录; 29h.1=1, 指示可以查找记录; 29h.2:; 29H.6 0=可以调用一次显示时间子程序,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:临时打铃用按钮org 0000hljmp mainorg 0003hljmp int0fw ;外中断0服务4; CPL 29H.0 ;对表设定标志; RETIorg 000bhljmp t0fw ;定时器0中断服务org 0013hljmp int1fw ;外中断1服务; cpl 29h.1 ;定时设定标志; retiorg 001bhljmp ganraoljmp ganrao; ljmp t1fworg 0023hljmp ganraoljmp ganraoljmp ganraoljmp ganrao; ljmp tirifworg 0030hmain: mov a,2ehxrl a,2fhcjne a,#0ffh,mainaljmp main1maina: ;mov 08h,#0 ;时间从0开始;mov 09h,#0;mov 09h,#0;mov 0ah,#0;mov 0bh,#0;mov 0ch,#0;mov 0dh,#0;mov 0eh,#01 ;星期一;mov 0fh,#0MOV 23H,#10 ;响铃10秒MOV 26H,#0 ;当前响铃时间倒计时MOV P1,#0FFH ;输出全1,MOV P3,#0FFHmov 29h,#0ffhMOV 2AH,#03CH ;定时器初值高字节 (计算值是3CBOH,补偿13个周期, ; 就是3CBDH)5MOV 2BH,#0BDH ;定时器初值低字节 (补偿时间包括:中断响应3个,; 中断服务程序开头到重新装入初值14个周期,频率误差根据经验少补4) main1: nopmov sp,#2fh ;堆栈从30H开始mov ie,#87h ;允许T0、INT0、INT1中断mov ip,#02h ;T0高优先mov tmod,#01h ;t0方式1MOV TCON,#05H ;外中断下降沿触发mov th0,#03ch ;T0初值6 计数250个mov tl0,#0b0h ;定时500us(250*2us=500us)setb tr0 ;启动定时器0mov 2eh,#0 ;清除干扰标志mov 2fh,#0lcall xssjlm: nop ;主循环从此开始 ======================mov ie,#87h ;允许外部中断和T0中断JB 29H.6,LM1 ;29H.6=1,不调用显示SETB 29H.6 ;29H.6=0,可以,并清除此标志lcall xssj ;显示时间JNB P1.7, XSYRXQZZJNB P1.6, XSYRXQZZJNB P1.5, XSYRXQZZJNB P1.4, XSYRXQZZLM1: jnb 29h.0,duibiao ;转对表JNB 29H.7,dssdZZ ;转定时设定LM2: ;SETB P1.3 ;蜂鸣器不响lm3: JB P3.7,LM10 ;没有临时打铃,转自动 1=自动clr p1.2 ;临时打铃 ,铃响 0=临时打铃lcall zssd ;蜂鸣器响sjmp lmlm10: mov a,26h ;响铃时间秒cjne a,#0,lm10z ;响铃秒数不为0 ,继续响铃setb p1.2 ;响铃秒数为0,不响铃setb p1.3 ;蜂鸣器不响jb 29h.1, lm1000 ;29h.1=1, 指示可以查找记录mov a,0Ah ;为保证一次记录(一分钟内)只响铃一次(10秒) xrl a,28h ;比较当前时间和记录时间的分jz lm10z ;相同时,A中内容为0,不再查找别的记录6setb 29h.1 ;29h.1=1, 指示可以查找记录,; 在下一个小时同一分钟也可以查找lm1000: MOV R7,#20H ;记录总数------查找记录开始MOV R0,#40H ;记录的开始地址lm100: MOV A,@R0 ;取记录的第一字节--小时CJNE A,#24,LM101 ;小时设置24,这个记录就不用比较,亦即不打铃 SJMP LM10A ;是24,不用比较,查找下一个记录LM101: CJNE A,0bH,LM10A ;记录小时与当前小时比较,不相等转移INC R0 ;相等,指向下一个地址mov a,@r0 ;取记录的第二字节--分cjne a,0Ah,lm10b ;记录的分比较,不相等clr p1.2 ;分也相等,操作时间到,响铃lcall zssd ;蜂鸣器响mov 26h,23H ;响铃10秒mov 27h,09h ;当前秒状态记实mov 28h,0Ah ;当前分状态记实clr 29h.1 ;29h.1=0,一分钟内不查找其他记录sjmp lm10zlm10a: inc r0lm10b: inc r0; inc r6 ;记录号加1djnz r7,lm100 ;查找下一个记录lm10z: mov a,26h ;响铃时间秒cjne a,#0,lm10z1 ;响铃秒数不为0,继续响铃setb p1.2 ;响铃秒数为0,不响铃setb p1.3 ;蜂鸣器不响ljmp lm10z3 ;lm10z1: clr p1.2 ;响铃lcall zssd ;蜂鸣器响mov a,09h ;秒cjne a,27h,lm10z2 ;检查秒数是否变化ljmp lm10z3 ;没有变化lm10z2: mov 27h,09h ;有变化,保存新秒dec 26h ;响铃秒数倒计时lm10z3: ljmp lm ;主循环到此结束 ===================DSSDZZ: LJMP DSSD ;中转到定时设定XSYRXQZZ: LJMP XSYRXQZ7ljmp ganraoljmp ganraoljmp ganraoljmp ganraoDUIBIAO: NOP ;对表程序clr ex1 ;禁止外部中断1mov r7,#15h ;对表操作空闲时间限制,15h*0.15=3.15秒 mov r1,#09h ;秒地址duibiao1: CJNE R1,#0CH,DUIBIAO1ADUIBIAO1A:JNC DUIBIAO1B ;地址大于等于0CH是日月星期lcall xssj ;显示时间SJMP DUIBIAO1CDUIBIAO1B:LCALL XSYRXQ ;显示月日星期DUIBIAO1C:lcall bbb ;延时50MSCJNE R1,#0CH,DUIBIAO1DDUIBIAO1D:JNC DUIBIAO1E ;地址大于等于0CH是日月星期lcall XGSJA ;修改时间暗点LCALL YJXS ;显示暗点SJMP DUIBIAO1FDUIBIAO1E:LCALL XGYRXQA ;修改月日星期暗点LCALL YJXS ;显示DUIBIAO1F:lcall bbb ;延时50MSCJNE R1,#0CH,DUIBIAO1GDUIBIAO1G:JNC DUIBIAO1H ;地址大于等于0CH是日月星期lcall xssj ;显示时间SJMP DUIBIAO1IDUIBIAO1H:LCALL XSYRXQ ;显示月日星期DUIBIAO1I:lcall bbb ;延时50MSmov p1,#0ffhmov a,p1jnb acc.4,db4 ;选择向上按钮jnb acc.5,db5 ;选择向下按钮jnb acc.6,db6 ;调整增加按钮jnb acc.7,db7zz ;调整减少按钮jnb p3.7,kmzzjb 29h.0,duibiaoz ;对表结束djnz r7,duibiao1setb 29h.0 ;自动结束对表duibiaoz: LJMP LM ;对表结束8;--db4: inc r1 ;指示调整的项目地址,向上一个 cjne r1,#0fh,db41 ;判断地址范围db41: jc db42 ;小于等于上限,可以了mov r1,#09h ;大于上限,回到最小地址,秒db42: mov r7,#15hljmp duibiao1;---db5: dec r1 ;向下一个cjne r1,#09h,db51 ;判断地址范围db51: jNc db52 ;大于等于下限,可以了mov r1,#0eh ;小于下限,回到最大地址,星期db52: mov r7,#15hljmp duibiao1;-----------------db7zz: ljmp db7kmzz: ljmp km;------------------db6: inc @r1 ;加1cjne r1,#0eh,db61 ;不是星期,下一个cjne @r1,#08h,db601 ;判断星期上限db601: jc db602 ;小于8,正常,继续mov @r1,#1 ;大于等于8,回到最小值1db602: mov r7,#15h ;重置自动结束时间db603: ljmp duibiao1 ;继续对表db61: cjne r1,#0dh,db62 ;不是月,下一个cjne @r1,#13,db611 ;判断月上限db611: jc db602 ;小于13,正常,继续mov @r1,#1 ;大于等于13,回到最小值1mov r7,#15h ;重置自动结束时间ljmp duibiao1 ;继续对表db62: cjne r1,#0ch,db63 ;不是日,下一个cjne @r1,#32,db621 ;判断日上限db621: jc db602 ;小于32,正常,继续mov @r1,#1 ;大于等于32,回到最小值1mov r7,#15h ;重置自动结束时间ljmp duibiao1 ;继续对表db63: cjne r1,#0Bh,db64 ;不是小时,下一个cjne @r1,#24,db631 ;判断小时上限9db631: jc db602 ;小于24,正常,继续mov @r1,#0 ;大于等于24,回到最小值0 mov r7,#15h ;重置自动结束时间ljmp duibiao1 ;继续对表db64: cjne r1,#0Ah,db65 ;不是分,下一个cjne @r1,#60,db641 ;判断分上限db641: jc db602 ;小于60,正常,继续mov @r1,#0 ;大于等于60,回到最小值0 mov r7,#15h ;重置自动结束时间ljmp duibiao1 ;继续对表db65: cjne r1,#09h,db66 ;不是秒,下一个cjne @r1,#60,db651 ;判断秒上限db651: jc db602 ;小于60,正常,继续mov @r1,#0 ;大于等于60,回到最小值0 mov r7,#15h ;重置自动结束时间ljmp duibiao1 ;继续对表db66: ljmp ganrao ;是干扰,进入干扰处理;--------------------------org 0202hganrao: clr eamov sp,#2fhmov dptr,#ganrao1push dplpush dphretiganrao1:mov 2eh,#0aahmov 2fh,#055hclr apush apush areti;--------------------------ljmp ganraoljmp ganraoljmp ganraoDB7: DEC @r1 ;减1cjne r1,#0Eh,db71 ;不是星期,下一项10cjne @r1,#08h,db701 ;判断星期上限db701: jc db702 ;小于8,正常,继续mov @r1,#7 ;大于等于8,回到最大值7db702: CJNE @R1,#0,DB703 ;不等于0,继续MOV @R1,#7 ;等于0,回到最大值7db703: mov r7,#15h ;重置自动结束时间ljmp duibiao1 ;继续对表db71: cjne r1,#0Dh,db72 ;不是月,下一个cjne @r1,#13,db711 ;判断月上限db711: jc db712 ;小于13,正常,继续mov @r1,#12 ;大于等于13,回到最大值12 db712: CJNE @R1,#0,DB703 ;不等于0,继续MOV @R1,#12 ;等于0,回到最大值12Sjmp DB703 ;继续对表db72: cjne r1,#0ch,db73 ;不是日,下一个cjne @r1,#32,db721 ;判断日上限db721: jc db722 ;小于32,正常,继续mov @r1,#32 ;大于等于32,回到最大值31 db722: CJNE @R1,#0,DB703 ;不等于0,继续MOV @R1,#31 ;等于0,回到最大值31Sjmp DB703 ;继续对表DB73: cjne r1,#0Bh,db74 ;不是时,下一个cjne @r1,#24,db731 ;判断时上限db731: jc db703 ;小于24,正常,继续mov @r1,#23 ;大于等于24,回到最大值23 SJMP DB703db74: cjne r1,#0Ah,db75 ;不是分,下一个cjne @r1,#60,db741 ;判断分上限db741: jc db703 ;小于60,正常,继续mov @r1,#59 ;大于等于60,回到最大值59 sjmp db703 ;继续对表db75: cjne r1,#09h,db76 ;不是秒,下一个cjne @r1,#60,db751 ;判断秒上限db751: jc db703 ;小于60,正常,继续mov @r1,#59 ;大于等于60,回到最大值59 mov r7,#15h ;重置自动结束时间ljmp duibiao1 ;继续对表db76: ljmp ganrao ;是干扰,进入干扰处理ljmp ganraoljmp ganraokm: mov 24h,#0 ;快慢调整,初值0mov r7,#10 ;LCALL KMXSkml: MOV 17H,R7lcall YJxs ;显示倒计时lcall bbbmov a,p1 ;P1口输入anl a,#0f0h ;屏蔽低四位jnz kmx ;高四位不全是0,下一次lcall yjxs ;同时按下四个键,显示lcall bbb ;延时80毫秒mov a,p1 ;P1口输入anl a,#0f0h ;屏蔽低四位jnz kmx ;高四位不全是0 下一次ljmp kmtz ;同时按下四个键,且保持80毫秒以上,; 进入快慢调整kmx: djnz r7,kmlsetb 29h.0ljmp lmkmtz: mov r7,#10 ;快慢调整kmtz1: MOV 11H,R7lcall YJxslcall bbbjnb p1.6,kmtz2jnb p1.7,kmtz3sjmp kmtz4kmtz2: inc 24h ;加1,加快mov r7,#10sjmp kmtz4kmtz3: dec 24h ;减1,减慢mov r7,#10kmtz4: MOV A,24HJB ACC.7,KMTZ42 ;负数处理MOV 16H,#10H ;正数无符号CJNE A,#10,KMTZ41 ;正数,判断值KMTZ41: JC KMTZ44 ;小于10,继续MOV 24H,#0 ;大于等于10,回到0MOV A,24HSJMP KMTZ44KMTZ42: MOV 16H,#11H ;负号CPL A ;取反INC A ;末位加1,得到绝对值CJNE A,#10,KMTZ43 ;判断绝对值KMTZ43: JC KMTZ44 ;其绝对值小于等于9 ,可以继续 MOV 24H,#0 ;绝对值大于等于10,回到0MOV A,24HKMTZ44: MOV 17H,A ;lcall YJxs ;显示值lcall bbbdjnz r7,kmtz1 ;循环10次mov a,17h ;显示的结果cjne a,#10,kmtz5 ;比较kmtz5: jnc kmtzz ;大于等于10无效mov a,16h ;符号位cjne a,#11h,kmtz6 ;正数处理mov a,2bh ;负数clr csubb a,17h ;直接相减mov 2bh,a ;送到常数单元保存sjmp kmtzzkmtz6: mov a,2bhadd a,17h ;正数要加mov 2bh,akmtzz: setb 29h.0ljmp lm ;快慢调整结束;-kmxs: MOV 10H,#10h ;不显示MOV 11H,#10hMOV 12H,#10HMOV 13H,#10hMOV 14H,#10hMOV 15H,#10HMOV 16H,#10hMOV 17H,#10HLCALL YJXSRET;---ljmp ganraoljmp ganraoljmp ganrao;延时程序 80MSbbb: mov 20h,#80bbb1: mov 21h,#250bbb2: nopnopdjnz 21h,bbb2djnz 20h,BBB1ret;INT0中断服务int0fw: lcall bbbcpl 29h.0 ;对表标志lcall bbbreti;INT1中断服务int1fw: lcall bbbCPL 29H.7 ;定时设定记录标志lcall bbbreti;定时器0中断服务程序 ,t0方式1,初值15536,100毫秒中断一次,高优先级t0fw: push apush b ;保护现场push psw ;setb rs0 ;选择工作寄存器第1组clr rs1MOV TH0,2AH ;定时器重新赋值,高字节MOV TL0,2BH ;低字节INC R0 ;100毫秒数 (在08H中)CJNE R0,#10,T0FWZINC R1 ;1秒数 (在09H中)MOV R0,#0CLR 29H.6 ;可以调用一次显示程序cjne r1,#60, t0fwzinc r2 ;1分数 (在0aH中)mov r1,#0cjne r2,#60,t0fwzinc r3 ;60分=1小时数 (在0bH中)mov r2,#0cjne r3,#24,t0fwzmov r3,#0inc r4 ;日数? (在0cH中)mov a,r5 ;月份mov dptr,#month_tab ;表首movc a,@a+dptr ;查表得到日数mov 22h,a ;日期送22H,以便比较inc 22h ;超限数mov a,r4 ;日数cjne A,22h,t0fwA ;比较mov r4,#1 ;超过本月最大日期就回到1号INC R5 ;月数 (在0dh中)CJNE R5,#13,T0FWAMOV R5,#1T0FWA: inc r6 ;星期 (在0eh中)cjne r6,#08h,t0fwzmov r6,#1t0fwz: pop psw ;恢复现场pop bpop areti ;定时器0中断服务程序到此结束ljmp ganraoljmp ganrao;每月日数表month_tab: db 31,28,31,30,31,30,31,31,30,31,30,31 ;1月,2月。