
(这是一个非常不错的网站,从廉价的编程器,到KILE的汉化版,再到种类齐全的免费学习和应用软件和资料,可见站长的良苦用心。我的编程器就是在这里买的,非常不错!)
强烈推荐之二: 单片机爱好者://www.mcufan.com
强烈推荐之三: 单片机学习网:www.mcustudy.com
(以上这两个有不少学习资料供浏览和下载。)
强烈推荐之四: 电子制作实验室:www.xie-gang.com
(这里有单片机学习的网上教程,连载哟!)
强烈推荐之五: 51单片机://www.mcu51.com
(这可是大名鼎鼎的哟!她的论坛在单片机世界的影响就象HELLOCQ在HAM中的影响一样。)
强烈推荐之六: 哦,没有了! :D :D :D
衷心祝愿单片机爱好者及学习者们马到成功!!!(我也是正在学习中的菜鸟哟! ) )
这是我根据自己的单片机设计的程序。请根据自己的需要修改各个参数。org 0000H
ajmp begin
org 000BH时钟中断0入口
mov tl0,#00000B每次中断设初值
mov th0,#110B
ajmp time0转跳到定时器0子程序
org 0040H
begin:初始化部分
设置变量RAM位置
x equ 50H
y equ 51H
z equ 52H
times equ 53H此变量是中断次数,只有中断250次,才能积累2M个机器周期,即1秒钟,
rtimes equ 54H
wtimes1 equ 55H
wtimes2 equ 56H
设置字型码
mov 60H,#005H0
mov 61H,#0DDH1
mov 62H,#046H2
mov 63H,#054H3
mov 64H,#09CH4
mov 65H,#034H5
mov 66H,#024H6
mov 67H,#05DH7
mov 68H,#004H8
mov 69H,#014H9
mov 5FH,#0FEH-
设置各LED位数字的RAM单元
n8 equ 71H
n7 equ 72H
n6 equ 73H
n5 equ 74H
n4 equ 75H
n3 equ 76H
n2 equ 77H
n1 equ 78H
设置数位选线的位置
l8 bit p3.0
l7 bit p3.6
l6 bit p3.5
l5 bit p3.7
l4 bit p3.1
l3 bit p3.2
l2 bit p3.3
l1 bit p3.4
设置定时器
setb ea
setb et0
mov th0,#11111111B
mov tl0,#11111B
clr tr0
mov p3,#00H
start:r2-小时/r3-分钟/r4-秒/r1是按键的值,无按键时为10H
mov r2,#00
mov r3,#00
mov r4,#00
第3、6位显示横线“-”
mov n6,5FH
mov n3,5FH
main:主程序
mov r1,#10Hr1赋10H,没按键
acall chcut调用r2-r4值转换为字型码并存入n1-n8的子程序
acall show扫描一遍LED
acall key调用键盘扫描子程序(此程序在51dz提供的程序上略加修改,保留注释)
jb tr0,walkstop若在走时,不允许调时,跳到walkstop
cjne r1,#4,s2若r1不是4则跳到下一个计时部分s2(下同)
acall hinc调用小时加1子程序
acall chcut
acall longdelay调用长延时子程序
ajmp main此次设置完成,跳到主程序
s2:
cjne r1,#5,s3
acall minc调用分钟加1子程序
acall chcut
acall longdelay
ajmp main此次设置完成,跳到主程序
s3:
cjne r1,#6,s4
acall sinc调用秒加1子程序
acall chcut
acall longdelay
ajmp main此次设置完成,跳到主程序
s4:
cjne r1,#7,s5
acall hdec调用小时减1子程序
acall chcut
acall longdelay
ajmp main此次设置完成,跳到主程序
s5:
cjne r1,#8,s6
acall mdec调用分钟减1子程序
acall chcut
acall longdelay
ajmp main此次设置完成,跳到主程序
s6:
cjne r1,#9,s7
acall sdec调用秒减1子程序
acall chcut
acall longdelay
ajmp main此次设置完成,跳到主程序
s7:
cjne r1,#0,walkstop
mov r2,#0时分秒清0
mov r3,#0H
mov r4,#0H
acall chcut
acall longdelay
ajmp main此次设置完成,跳到主程序
walkstop:
cjne r1,#11,s0
acall stop调用停止走时子程序
ajmp main此次设置完成,跳到主程序
s0:
cjne r1,#12,main
acall walk调用开始走时子程序
ajmp main此次设置完成,跳到主程序
以下是子程序
show:扫描子程序
mov p1,n8将第8位数字型码送上P1(下同)
setb l8使第8位LED亮
acall delay调用扫描延时子程序
clr l8使第8位LED灭
mov p1,n7
setb l7
acall delay
clr l7
mov p1,n6
setb l6
acall delay
clr l6
mov p1,n5
setb l5
acall delay
clr l5
mov p1,n4
setb l4
acall delay
clr l4
mov p1,n3
setb l3
acall delay
clr l3
mov p1,n2
setb l2
acall delay
clr l2
mov p1,n1
setb l1
acall delay
clr l1
ret
hdec:
cjne r2,#0,hdnext如果小时不是0就到hdnext
jnb tr0,hskip小时是0且tr0是0即不在计时,到hskip
acall warning小时是0且tr0是1即在计时,就调用报警子程序
clr tr0停止计时
ret返回
hskip:mov r2,#100小时是0又不在计时,就让r2赋100,到下一些条减1后就是59
hdnext:dec r2如果小时不是0就到这里减1
ret
mdec:分钟减1子程序
cjne r3,#00,mdnext如果分钟不是0就到minext
mov r3,#60如果分钟是0就到变为60,到下一些条减1后就是59
acall hdec从小时退位
mdnext:dec r3如果分钟不是0就到这里减1
ret
sdec:秒减1子程序
cjne r4,#00,sdnext如果秒不是0就到sdnext
mov r4,#60如果秒是0就到变为60,到下一些条减1后就是59
acall mdec从分钟退位
sdnext:dec r4如果秒不是0就到这里减1
ret
hinc:小时加1子程序
cjne r2,#99,hinext如果小时不是99就到hinext
mov r2,#255如果小时是23就到变为255,到下一些条加1后就是0
hinext:inc r2如果小时不是99就到这里加1
ret
minc:
cjne r3,#59,minext如果分钟不是23就到minext
mov r3,#255如果分钟是59就到变为255,到下一些条加1后就是0
acall hinc分钟满,向小时进位
minext:inc r3如果分钟不是59就到这里加1
ret
sinc:
cjne r4,#59,sinext如果秒不是23就到sinext
mov r4,#255如果是秒是59就到变为255,到下一些条加1后就是0
acall minc秒满,向分钟进位
sinext:inc r4如果秒不是59就到这里加1
ret
chcut:将r2-r4值转换为字型码并存入n1-n8的子程序
mov a,r2小时值送Acc(下同)
mov b,#10B赋10
div abAB相除,此时A是小时的十位,B是小时的个位
mov n7,b小时的个位B送第七位数
mov n8,a小时的十位A送第八位数
mov a,r3分解分钟到第四、五位数
mov b,#10
div ab
mov n4,b
mov n5,a
mov a,r4分解秒到第一、二位数
mov b,#10
div ab
mov n1,b
mov n2,a
以下开始转换各数位的二进制数到字型码(第6、3位是横线,由定时器控制有无)
mov a,n8第8位数送Acc(下同)
add a,#60HAcc加60H,此时Acc中值所指的RAM地址中为第8位数的字型码
mov r0,aAcc送r0
mov n8,@r0r0间接地址送回n8
mov a,n7转换第7位数
add a,#60H
mov r0,a
mov n7,@r0
mov a,n5转换第5位数
add a,#60H
mov r0,a
mov n5,@r0
mov a,n4转换第4位数
add a,#60H
mov r0,a
mov n4,@r0
mov a,n2转换第2位数
add a,#60H
mov r0,a
mov n2,@r0
mov a,n1转换第1位数
add a,#60H
mov r0,a
mov n1,@r0
ret
longdelay:长延时子程序
mov r6,#0FFH
reshow1:acall show
djnz r6,reshow1
mov r6,#0FFH
reshow2:acall show
djnz r6,reshow2
ret
delay:扫描延时子程序
mov r5,#40H
djnz r5,$
ret
ringdelay:mov r5,#0FFH
djnz r5,$
ret
time0:定时器0子程序
push AccAcc压栈
mov a,times已中断次数送Acc
inc a次数加1
mov times,a加1后送回次数变量
cjne a,#250,gotoend如果Acc不是250说明不到1秒,跳过加秒 *** 作
mov times,#0是250说明到1秒了,次数变量清0
mov n6,#0FFH第3、6位清除横线“-”
mov n3,#0FFH
acall sdec调用秒减1子程序
ajmp next退出
gotoend:cjne a,#125,next若Acc不是125就退出
mov n6,5FH若是125就给第3、6位显示5FH中的字型码横线“-”
mov n3,5FH
next:pop Acc退出时,从栈中d出Acc
reti此程序中次数在0-124就不显示横线,在125-250就显示横线
walk:开始走时子程序
setb tr0
ret
stop:停止走时子程序
clr tr0
ret
warning:报警子程序
放入-FINISH-字型码
mov n8,#0FEH-
mov n7,#02EHF
mov n6,#0DDHI
mov n5,#00DHN
mov n4,#0DDHI
mov n3,#034HS
mov n2,#08CHH
mov n1,#0FEH-
mov wtimes1,#50设置蜂鸣次数50次
res1:mov wtimes2,#08FH一次蜂鸣开始
res2:clr p2.0从此句开始蜂鸣器发声
mov p3,#0HLED熄灭
mov r6,#5扫描延时子程序延时太短,要重复5次
redelay:acall delay此2句重复5次
djnz r6,redelay
setb p2.0
djnz wtimes2,res2转到RES2让蜂鸣器发声,转wtimes2次,即8FH次
mov p3,#0H从此句开始蜂鸣器不发声
mov r7,#08FHLED扫描次数
reshow:acall show
djnz r7,reshowLED扫描08FH次,即不发声延时
djnz wtimes1,res1到RES1开始一次蜂鸣
finish:acall show这两句使LED显示,并进入死循环
ajmp finish
key:mov p0,#00001111b上四位和下四位分别为行和列,所以送出高低电压检查有没有按键按下
jmp k10跳到K10处开始扫描,这里可以改成其它条件转移指令来决定本次扫描是否要继续,例如减1为0转移或者位为1或0才转移,这主要用来增加功能,确认上一按键功能是否完成?是否相当于经过了延时?是否要封锁键盘?
goend:jmp kend如果上面判断本次不执行键盘扫描程序,则立即转到程序尾部,不要浪费CPU的时间
k10:jb p0.0,k20扫描正式开始,先检查列1四个键是否有键按下,如果没有,则跳到K20检查列2
k11:mov p0,#11101111b列1有键按下时,P0.0变低,到底是那一个键按下?现在分别输出各行低电平
jb p0.0,k12该行的键不按下时,p0.0为高电平,跳到到K12,检查其它的行
mov r1,#13如果正好是这行的键按下,将寄存器R0写下1,表示1号键按下了
k12:mov p0,#11011111b
jb p0.0,k13
mov r1,#15如果正好是这行的键按下,将寄存器R0写下2,表示2号键按下了
k13:mov p0,#10111111b
jb p0.0,k14
mov r1,#0如果正好是这行的键按下,将寄存器R0写下3,表示3号键按下了
k14:mov p0,#01111111b
jb p0.0,kend如果现在四个键都没有按下,可能按键松开或干扰,退出扫描(以后相同)
mov r1,#14如果正好是这行的键按下,将寄存器R0写下4,表示4号键按下了
jmp kend已经找到按下的键,跳到结尾吧
k20:jb p0.1,k30列2检查为高电平再检查列3、4
k21:mov p0,#11101111b列2有健按下时,P0.0会变低,到底是那一行的键按下呢?分别输出行的低电平
jb p0.1,k22该行的键不按下时p0.0为高电平,跳到到K22,检查另外三行
mov r1,#12如果正好是这行的键按下,将寄存器R0写下5,表示5号键按下了(以后相同,不再重复了)
k22:mov p0,#11011111b
jb p0.1,k23
mov r1,#9
k23:mov p0,#10111111b
jb p0.1,k24
mov r1,#8
k24:mov p0,#01111111b
jb p0.1,kend
mov r1,#7
jmp kend已经找到按下的键,跳到结尾吧(以后相同,不要重复了)
k30:jb p0.2,k40
k31:mov p0,#11101111b
jb p0.2,k32
mov r1,#11
k32:mov p0,#11011111b
jb p0.2,k33
mov r1,#6
k33:mov p0,#10111111b
jb p0.2,k34
mov r1,#5
k34:mov p0,#01111111b
jb p0.2,kend
mov r1,#4
jmp kend
k40:jb p0.3,kend
k41:mov p0,#11101111b
jb p0.3,k42
mov r1,#10
k42:mov p0,#11011111b
jb p0.3,k43
mov r1,#3
k43:mov p0,#10111111b
jb p0.3,k44
mov r1,#2
k44:mov p0,#01111111b
jb p0.3,kend
mov r1,#1
kend: ret
end
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)