单片机课程设计参考.docx
《单片机课程设计参考.docx》由会员分享,可在线阅读,更多相关《单片机课程设计参考.docx(23页珍藏版)》请在冰豆网上搜索。
单片机课程设计参考
课程设计报告
姓名:
专业:
计算机科学与技术
课程名称:
单片机系统的开发与应用
班级:
2007级本科班
系(分院):
计算机科学与技术学院
2009年12月
单片机系统的开发与应用课程设计报告
1、课程设计要求:
选取8255A作为扩展接口芯片,输入设备为开关和非编码键盘,输出设备为发光二极管和七段数码管。
要求由键盘输入倒计时时间(至少为三位,分和秒用“-”隔开),要求计时精度高于0.1秒,输入计时时间后,由七段数码管显示并在开关的控制下,实现“开始倒计时”、“暂停倒计时”和“结束倒计时”。
倒计时结束、倒计时暂停、倒计时开始要由不同的发光二极管点亮或闪烁状态予以指示。
2、总体设计
本课程设计中包括开关、非编码矩阵键盘、发光二极管、七段数码管在内的两种输入设备和两种输出设备。
端口A接实验箱218h,端口B接实验箱219h,端口C接实验箱21ah,位选信号接实验箱210h,键盘控制接实验箱21bh。
发光二极管是端口A,端口B输入,端口C输出。
键盘控制为端口A,端口C输入,端口B输出。
开关控制是与80h测试,PB7与K1连接。
编程实现的是开关低电平工作,高电平结束,按任意键开始倒计时,p键暂停倒数(指示灯闪烁),M键恢复暂停倒计时,倒计时为十进制。
3、硬件原理图
图一七段数码管字型码
图二七段数码管图三8255A的方式控制字
图四六位时钟电路
图五键盘接口
4、程序设计。
程序目的:
开关低电平工作,高电平结束,按任意键开始倒计时,p键暂停倒数(指示灯闪烁),M键恢复暂停倒计时,倒计时为十进制。
程序思路:
运行程序时,若开关打开,则将6个七段数码管全部置为‘-’,(编码为40h)并且二极管发光,否则返回重复执行检测开关是否开启。
然后由键盘将数字输入,七段数码管对应显示;检测是否按下任意键,若没有,则重新检测,
否则开始倒计时,若有p键按下,就停止倒计时,若有m键按下,就恢复倒计时,然后按任意键开始倒计时。
程序流程图如下:
paportequ218h;端口A
pbportequ219h;端口B
pcportequ21ah;端口C
wportequ210h;位选端口
dportequ211h;断选端口
ctrlportequ21bh
datasegment
tabledw0101h,0102h,0104h,0108h,0110h,0120h,0140h,0180h
dw0201h,0202h,0204h,0208h,0210h,0220h,0240h,0280h
;dw0410h,0420h,0440h,0480h;键盘编码
chardb12,13,14,15,11,10,9,8,4,5,6,7,3,2,1,0;与键盘编码对照
qdmdb3fh,30h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,58h,5eh,79h,71h,40h
;十进制数的七段显示码
disbufdb16,16,16,16,16,0ffh,0ffh,0ffh,0ffh;16为偏移位,0ff为按任意键倒计时
kzwdb0
dataends
codesegment
assumecs:
code,ds:
data
start:
pushds
xorax,ax
pushax;返回DOS
movax,data
movds,ax
movdx,21bh
moval,89h
outdx,al
movdx,21ah
moval,0ffh
outdx,al;初始化
calldelay
waitks:
inal,dx;等待开始
calldelay
testal,80h;测试开关
jzzsd1
jmpwaitks
zsd1:
movdx,21bh;指示灯1
moval,88h;C口高4位输出
outdx,al
movdx,21ah
moval,0eh;二极管控制一个灯亮
outdx,al
calldelay
kinit:
moval,82h;键盘初始化,端口B输出,端口A和端口C输入
movdx,ctrlport
outdx,al
rk1:
calldjs;入口1,调用倒计时
moval,0
movdx,paport
outdx,al
movdx,pbport
inal,dx
cmpal,0ffh
jzrk1;判断键盘是否输入数字,若没有,继续返回调用倒计时子程序
movbl,al
movcx,0ffffh
loop$;去抖动
movdx,ctrlport
moval,90h
outdx,al
movdx,pbport
moval,bl
outdx,al
movdx,paport
inal,dx
movah,bl
notax;将ax取反,因为从键盘键入的与芯片的ascii码相反
movsi,offsettable;将键位编码的存储单元的首地址送入si
movdi,offsetchar
movcx,17
judge:
cmpax,[si];判断若键入的编码与ax的内容相同
jzbcwy;转到保存位移
deccx
jzkinit;因为字型码有17种情况,循环17次初始化键盘
addsi,2
incdi
jmpjudge
bcwy:
movcx,10;保存位移
leabp,disbuf;偏移位存储单元的首地址送入bp
jy:
moval,[bp];检验
cmpal,16
jzbc;若bp的内容是16,转向保存
cmpal,0ffh
jzgw;按任意键开始倒计时
incbp
incbp
deccx
jzkinit
jmpjy
bc:
moval,[di];保存
mov[bp],al
calldjs
moval,82h
movdx,ctrlport
outdx,al
waitt:
moval,0;等待
movdx,paport
outdx,al
movdx,pbport
inal,dx
cmpal,0ffh
jnzwaitt
movcx,0ffffh
loop$;去抖动
jmpkinit
gw:
leadi,disbuf;个位
moval,[di][4]
cmpal,0;在第五个七段数码管上显示输出个位
jzsw;若个位为0,转到十位
decal
mov[di][4],al
calldjs
jmpgw;个位倒计时
sw:
moval,9;十位
mov[di][4],al
moval,[di][2];第三个七段数码管上显示输出十位数
cmpal,0
jzbw;若十位数为0时,转到百位
decal
mov[di][2],al
jmpgw;十位倒计时,不为0转到个位
bw:
moval,9;百位
mov[di][2],al
moval,[di];在第一个七段数码管上显示输出百位
cmpal,0
jnzjyjrgw;若百位不为0就转向jyjrgw
movdx,210h
moval,0
outdx,al
calldelay
jmpexit
jyjrgw:
decal;检验进入个位
mov[di],al
jmpgw
djsproc;倒计时子程序
movcx,0ffh
dt3:
pushcx
leadi,disbuf;将偏移位的首地址送入di
leasi,qdm;将七段数码管的字型码存储单元的首地址送入si
movbl,1
movcx,5
dt31:
movdx,wport
moval,bl
outdx,al
movdx,dport
xorax,ax
moval,[di]
movbp,ax
moval,[bp][si]
outdx,al
calldelay
incdi
shlbl,1
loopdt31;dt3实现的是将五个七段数码管显示'-'
popcx
loopdt3
movdx,21bh
moval,89h
outdx,al
movdx,21ah
inal,dx
calldelay
testal,80h;测试开关
jzpd
jmpexit
pd:
movcx,50;判断
saom:
callpdzt;扫描
loopsaom
fanh1:
;返回1
ret
djsendp;倒计时结束
zantproc;暂停子程序
pushcx
goon:
movcx,1;继续
movdx,21bh
moval,80h
outdx,al
movdx,21ah
shans:
moval,0ffh;闪烁
outdx,al
calldelay1
moval,0
outdx,al
calldelay1
loopshans;用al置0或置1来实现暂停,中间加延迟
moval,82h
movdx,ctrlport
outdx,al
movcx,50
rk3:
moval,0;入口3
movdx,paport
outdx,al
movdx,pbport
inal,dx
movbl,al
movdx,ctrlport
moval,90h
outdx,al
movdx,pbport
moval,bl
outdx,al
calldelay
movdx,paport
inal,dx
calldelay
movah,bl
notax
cmpax,0440h;判断是否有m键按下,若按下则跳转到fanh
jzfanh5
looprk3
jmpgoon
fanh5:
;返回5
popcx
ret
zantendp
pdztproc;判断暂停子程序
pushbx
pushax
moval,82h
movdx,ctrlport
outdx,al
rk2:
moval,0;入口2
movdx,paport
outdx,al
movdx,pbport
inal,dx
movbl,al
movdx,ctrlport
moval,90h
outdx,al
movdx,pbport
moval,bl
outdx,al
movdx,paport
inal,dx
movah,bl
notax
cmpax,0420h
jnzfanh;这段程序是判断是否有p键按下,若按下则暂停
callzant
fanh:
popax;返回
popbx
ret
pdztendp;判断暂停结束
delayproc;延迟子程序
pushcx
pushbx
movbx,0ffh
loop2:
movcx,02fh
loop3:
looploop3
decbx
jnzloop2
popbx
popcx
ret
delayendp;延迟结束
delay1proc;延迟子程序1
pushcx
pushbx
movbx,0fffh
loop4:
movcx,0fffh
loop5:
looploop5
decbx
jnzloop4
popbx
popcx
ret
delay1endp;延迟子程序1结束
exit:
movdx,21bh;退出
moval,80h
outdx,al
movdx,21ah
moval,0ffh
outdx,al
calldelay
movdx,210h
moval,0
outdx,al
movah,4ch
int21h
codeends
endstart
5、调试过程
(1):
发光二极管调试:
编程实现发光二极管发光或者循环点亮
程序如下:
codesegment
assumecs:
code
start:
movdx,21bh
moval,82h
outdx,al
movdx,219h
inal,dx
testal,80h;测试开关时是否开启
jnzroll
moval,0;若开关没有开启,则发光二级管全部点亮
movdx,218h
outdx,al
calldelay
jmpexit
roll:
moval,0feh
movcx,8
movdx,218h
loop1:
outdx,al
rolal,1
calldelay
looploop1;发光二极管循环点亮
exit:
movah,4ch
int21h
delayproc;延迟子程序
pushcx
movbx,0ffffh
loop2:
movcx,0ffffh
loop3:
looploop3
decbx
jnzloop2
popcx
ret
delayendp
codeends
endstart
此程序实现的是发光二极管循环点亮,循环时延时设定要适合,否则达不到效果。
(2):
七段数码管调试,编程实现七段数码管在指定的位置显示指定的字符,并且倒计时。
datasegment
bufferdb3fh,30h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movcx,10
leabpbuffer+1;bp指向30h
aa:
pushcx
leasi,buffer+9;si指向6fh
tt:
pushcx
movcx,100h
next:
movdx,211h
moval,[bp]
outdx,al
movdx,210h
moval,01h;在第一个七段数码管上显示bp所指的数
outdx,al
calldelay
movdx,211h
moval,[si]
outdx,al
movdx,210h
moval,02h;在第二个七段数码管上显示si所指的数
outdx,al
calldelay;调用延时程序
loopnext1
decsi
popcx
looptt
subcx,9
decbp
popcx
jnsaa
movah,4ch
int21h
delayproc;延时程序
pushcx
movbx,1ffh
loop2:
movcx,1ffh;注意延时时间要适当
loop3:
looploop3
decbx
jnzloop2
popcx
ret
delayendp
codeends
endstart
此程学实现的是19到0的倒计时
(3):
键盘调试:
从键盘键入数据,在七段数码管上显示出来
程序如下:
paportequ218h
pbportequ219h;端口A
pcportequ21ah;端口B
dportequ210h;端口c
wportequ211h;位选端口
ctrlportequ21bh;键盘控制端口
datasegment
tabledw0101h,0102h,0104h,0108h,0110h,0120h,0140h,0180h
dw0201h,0202h,0204h,0208h,0210h,0220h,0240h,0280h
dw0410h,0420h,0440h,0480h;键位编码
chardb58h,5eh,79h,71h,7ch,77h,67h,7fh,66h,6dh,7dh,07h,4fh,5bh,06h,3fh;七段数码管字型编码
dataends
codesegment
assumecs:
code,ds:
data
start:
pushds
xorax,ax
pushax
movax,data
movds,ax
keyprocnear
kinit:
moval,82h初始化键盘
movdx,ctrlport
outdx,al
rk1:
moval,0
movdx,paport
outdx,al
movdx,pbport
inal,dx
cmpal,0ffh
jzrk1
movbl,al
movcx,0ffffh
loop$;去抖动
movdx,ctrlport
moval,90h
outdx,al
movdx,pbport
outdx,al
movdx,paport
inal,dx
movah,bl
notax
movsi,offsettable
movdi,offsetchar
movcx,17
judge:
cmpah,04h
jzexit;若按r键时退出
cmpax,[si]
jznxt
deccx
jzkinit
addsi,2
incdi
jmpjudge
nxt:
movbl,[di]
movdx,dport
moval,0ffh
outdx,al
movdx,wport
moval,bl
outdx,al
movdx,ctrlport
moval,82h
outdx,al;从键盘上输入字符,六个七段数码管全部显示
waitt:
moval,0
movdx,paport
outdx,al
movdx,pbport
inal,dx
cmpal,0ffh
jnzwaitt
movcx,0ffffh
loop$
jmpkinit
exit:
movah,4ch
int21
keyendp
codeends
endstart
调试过程中,为了实现键盘数据快速可靠的输入,输入接口与键盘软件需要解决的问题:
一个是抖动问题,另一个是重键问题。
当键盘上的一个键被按下或抬起时,在接触点按键会在闭合和断开的状态之间跳几下才稳定下来。
这是由于人们的按键动作本身以及键盘的机械特性所引起的,也就是所谓的抖动问题。
在键闭合及断开的瞬间都会有一个抖动过程,在此过程中键盘电路中会出现一系列的脉冲。
抖动时间的长短,与开关的机械特性有关,一般为5~10ms。
一个键被按下并抬起时的抖动波形如图六所示。
图六抖动波形
可用下面程序去抖动:
Movcx.0ffffh
Loop$
6、心得体会
这次课程设计中我对不但课堂理论知识有了实践经验,并且对一些实践中的问题有了很好的解决,如:
七段数码管动态显示原理是利用人眼视觉暂留的原理,通过设置位选信号控制不同位按照一定的时间间隔有序的打开与关断实现多位数的动态显示。
在调试的过程中由于刷新频率过高而导致显示码重叠,而由于刷新率过低又造成多位显示的闪烁。
解决办法是延长或缩短刷新时间间隔。
通过该实践环节不但掌握了动态显示原理,也进一步理解了刷新率与人眼视觉之间的关系。
另外,电子器件的开关速度直接决定了最高刷新率。
键盘输入时,为了实现键盘数据快速可靠的输入,输入接口与键盘软件需要解决键入时的抖动问题。
当键盘上的一个键被按下或抬起时,在接触点按键会在闭合和断开的状态之间跳几下才稳定下来。
这是由于人们的按键动作本身以及键盘的机械特性所引起的,也就是所谓的抖动问题。
抖动时间的长短,与开关的机械特性有关,一般为5~10ms。
尽管如此,我在实践中还存在着许多的不足之处,这是不容置疑的,但是在老师和同学的帮助下,我顺利完成了我的课程设计,在此,我向帮助我的老师和同学表示我衷心地谢意!
!
!
7、主要参考文献
[1]吴向军,罗源明,刘广旋等.汇编语言程序设计.北京:
高等教育出版社,2002.7.
[2]葛韧秋等.实用微机接口技术.北京:
高等教育出版社,2006.7
[3]庄琴生.计算机接口技术.西安:
西安电子科技大学出版社,2004.6
[4]吴秀清,周荷琴.微型计算机原理与接口技术.合肥:
中国科技大学出版社,1999
[5]赵秀珍,单永磊.单片微型计算机原理及应用.北京:
中国水利水电出版社,2001.8