资源描述:
《基于mcs-51单片机的可调六位数字时钟(汇编)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、;本次编程时钟输出码在p0口,控制显示位为p2.7p2.6p2.5,共八个数码管org0000hajmpmainorg0003hajmpsj0;外部中断0跳转到sj0org000bhajmpit0p;计时中断跳转“it0p”org00013hajmpsj1;外部中断0跳转到sj1org0100hmain:movtmod,#01h;设置中断0的工作方式为1clrrs1;设置工作区0clrrs0;设置工作区0movr0,#30h;给r0设置初值30,使设置处于准备状态movsp,#20h;堆栈开始于20-25mov30h,#14h;给计时赋初次数mov41h,#00h;给显示位赋值
2、,用于显示设置位用于对应mov42h,#20h;~~mov43h,#40h;可删除mov44h,#60h;~~mov45h,#80h;~~mov46h,#0a0h;可删除mov47h,#0c0h;~~mov48h,#0e0h;~~mov33h,#0ah;横杠位对应输出值位置mov36h,#0ah;横杠位对应输出值位置mov31h,#00hmov32h,#00hmov34h,#00hmov35h,#00hmov37h,#00hmov38h,#00hsetbet0;开计时中断0setbex0;开外部中断0setbpx1;设置外部中断1优先级高,使其能中断外部中断0setbea;最后
3、将总中断开启movth0,#3ch;给计时器赋初值movtl0,#0afh;setbtr0;开始让计时器工作,计时有效xiansj:;计时器工作后,主程序进入显示时钟状态movdptr,#shuxiang;将数码显示队列起始地址给dptrloop0:;movr1,#31h;31对应秒第一位,movr2,#00h;p2由00对应第一位loop1:;jbex1,tiao111;进入设置后,主程序必须只显示设置位mova,@r1;中断完毕后,跳转回来时,r1改变也无所谓movca,@a+dptr;只要去r1处于31-38即可movp0,#0ffhmovp2,r2;movp0,ainc
4、r1;r1自加1,准备对下一个数值进行显示mova,#20h;p2的显示位对应以20为间隔adda,r2movr2,a;对寄存器进行加法的步骤mova,r1cjner1,#39h,loop1;判断r1达到的值,对下一位数进行显示ajmploop0;当8位数值显示完毕,跳转回显示状态起始处tiao111:;acallfangfuxyw;调用反复显示设置位程序ajmploop1;跳回loop1使设置完毕主程序后进入显示时钟状态shuxiang:db0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,0bfhfangfuxyw:;反复显示设置位程
5、序mova,r0subba,#31hmovb,#20hmulabmovr5,a;r5是显示位置,与r0有对应关系mova,@r0movca,@a+dptrmovp0,#0ffhmovp2,r5movp0,aretsj0:clrex0;中断0程序开始pushaccclrtr0jingts1:mova,#01hadda,r0movr0,acjner0,#33h,tiao3ajmpjingts1tiao3:cjner0,#36h,tiao6;可以不讨论33.36两种情况,因为中断1会处理ajmpjingts1tiao6:cjner0,#39h,tiao000movr5,38h;判断设
6、置是否超过24cjner5,#02h,panduan3mova,37hsubba,#03hjcpanduan3;clrex1decr0mov4bh,#0ffh;to01:mov4ch,#0ffh;to02:acallfangfuxyw;decr0;acallfangfuxyw;incr0;djnz4ch,to02;djnz4bh,to01;movr0,#37h;setbex1ajmptiao000;panduan3:movp0,#0bfhmovp2,#40hacallyanshimovp2,#0a0hacallyanshiclrex1popaccmovr0,#30hsetbex
7、0setbtr0reti;设置时间结束跳回主程序tiao000:setbex1;acallyanshixian;popacc;setbex0;reti;sj1:;外部中断1,对设置位进行加1clrea;在加1时,关闭所有中断,防止抖动。;改为关闭中断1(clrex1)亦可,对应跳出前开启也应修改pushacc;累加器a发生改变,应保护mova,#01h;进行加1,必须使用累加器,由于分支较多,在开始处设置cjner0,#31h,ssj2;现在判断r0为何值,因为不同情况最大值有区别ajmps