单片机课程设计参考.docx

上传人:b****2 文档编号:24398126 上传时间:2023-05-27 格式:DOCX 页数:23 大小:179.73KB
下载 相关 举报
单片机课程设计参考.docx_第1页
第1页 / 共23页
单片机课程设计参考.docx_第2页
第2页 / 共23页
单片机课程设计参考.docx_第3页
第3页 / 共23页
单片机课程设计参考.docx_第4页
第4页 / 共23页
单片机课程设计参考.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

单片机课程设计参考.docx

《单片机课程设计参考.docx》由会员分享,可在线阅读,更多相关《单片机课程设计参考.docx(23页珍藏版)》请在冰豆网上搜索。

单片机课程设计参考.docx

单片机课程设计参考

 

课程设计报告

 

姓名:

专业:

计算机科学与技术

课程名称:

单片机系统的开发与应用

班级:

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

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

当前位置:首页 > 经管营销 > 金融投资

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

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