硬件课程设计报告通讯设备人机接口设计.docx
- 文档编号:11012365
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:52
- 大小:274.63KB
硬件课程设计报告通讯设备人机接口设计.docx
《硬件课程设计报告通讯设备人机接口设计.docx》由会员分享,可在线阅读,更多相关《硬件课程设计报告通讯设备人机接口设计.docx(52页珍藏版)》请在冰点文库上搜索。
硬件课程设计报告通讯设备人机接口设计
通讯设备人机接口设计
(计算机硬件技术基础课程设计)
专业:
自动化
组员:
重庆大学自动化学院
2012年9月
人员及任务分配
专业班级
学号
姓名
任务分配
一、系统功能和设计方案
1.1基本设计目标实现
根据课程设计任务书所提出的要求,我们小组通过讨论和分析后首先确定出此次电通讯设备人机接口设计中我们需要完成的几个基本功能以及操作方案:
1.1.1基本设计目标
整个系统分为3个大功能模块,分别为接听、拨号和查询3个模块。
接听模块:
当系统运行时,首先判断有无来电,若来电,则在led上面显示来电号码,此时来电指示灯闪烁。
同时,你可以通过键盘来选择是否接听、挂断或者无操作。
当选择接听时,跳入接听子程序,并在led上显示当前的通话时间。
如果没有任何操作,过一段时间程序会自动挂断,同时在led上面显示来电的号码。
来电的号码会自动存入来电存储区,来电存储区会存放最近三次未接来电的信息。
拨号模块:
若没有来电,可以按1号键进入拨号功能,键入拨号功能之后,拨号指示灯会常亮,此时表面你正在输入号码,同时led会等待数字键的按下,你可以选择0-9的号码,每当键入一个数字,就会在led的最低位显示出当前按下的数字,当再次按下数字时,led上的所有数字将会左移一位,这样就始终保持当前输入号码为led的最低位。
若电话号码输入完毕,此时你也可以选择挂断键,这样就会返回主程序。
当你按下拨号键时,首先系统将会判断你是否键入了6个数字键。
若输入正确,对方有没有占线键按下的话,此时,led上会显示连接信息;若所拨号码不足6位或者超过6位,led上会显示error的错误信息。
你可以通过开关来确定是否接听或者挂断当前号码,若接听,则会显示通话时长。
若挂断,led上会显示hangup后,在led上仍会显示你所拨的号码,此时,你可以按挂断键返回主程序。
当然你也可以选择重拨。
若一直无人接听,则会自动挂断,led上会显示autohp的自动挂断信息。
若拨号时对方占线,则在led上显示busy的占线信息,一段时间后系统会自动挂断。
查询模块:
当没有来电时,你可以按下键盘的2号键,进入查询功能。
当进入查询功能后,你可以通过选择按下上翻或下翻按键来查询最近来电的三个号码。
如果你查询到了比较重要的号码,需要回拨时,你可以按下拨号键,此时,led上会显示连接信息,程序也跳入了拨号模块。
1.1.2按键说明
实验箱3×4键盘从左向右,自上而下分别为1,2,3,4,5,6,7,8,9,拨号键,0,挂机键。
开关K1至K6分别为来电,来电2,来电3,占线键,接听键,挂断键。
(1)实验箱面板上3*4小键盘:
表1.13*4键盘功能对照表
按键
功能
按键
功能
按键1
拨号功能键,数字键
按键8
数字键
按键2
查询功能键,数字键
按键9
数字键
按键3
数字键
拨号键
拨号
按键4
数字键
按键 0
数字键
按键5
数字键
挂断键
挂断,退出
按键6
数字键
——
——
按键7
数字键
——
——
(2)实验箱面板上开关功能说明:
表1.2开关功能对照表
开关
功能
开关
功能
开关1
来电1
开关2
来电2
开关3
来电3
开关4
占线
开关5
接听
开关5
挂断
1.2硬件连接
确定了基本功能软件设计方案,我们通过查阅相关资料,综合讨论后设计出了硬件连接方案,下面是我们的硬件连接:
开关K1---K6接B0---B5;
键盘P0---P3接C0---C3
Q0---Q2接C4---C6;
8254定时器0的GATE接+5V,OUT端与8259的IRQ0连接,D0接8255的A0,
8254的CS与CS1(300H)连接。
8259的SP/1接+5V,INTR接INT1,CS-1接CS2(320H)。
1.2.1键盘扫描连接图:
图1.1
1.2.2显示连接图:
图1.2
1.3系统设计思路
将整个系统分为许多个小的模块,各个模块之间相互独立,通过定义不同的接口来实现各个模块的连接。
这样在调试程序的时候,可以分别进行调试。
可以加快课程设计的进程,缩短课程设计时间,简化我们的调试工作。
关于通讯系统的人机接口设计,其实主要是要完成三大功能的设计。
即:
接听功能,拨号功能和查询功能。
我们从这三个功能入手,分别对其进行了模块细化,画出了相应的程序流程。
二、程序流程图
2.1主程序流程
图2.1
2.2子程序流程图
2.2.1查询子程序:
图2.2
2.2.2拨号程序:
图2.3
2.2.3拨号子程序:
图2.4
2.2.4接听子程序:
图2.5
2.2.5时间译码及中断程序:
图2.6
2.2.6键盘和开关扫描程序:
图2.7
三、编程与调试
在明确实现目的与方法后,我们画出了流程图,根据流程图,我们编制出整个设计的主程序和子程序,并且通过组员的反复调试后,实现了提出的基本功能和拓展功能。
再进行综合调试,测试系统的可行性。
四、心得体会
两周的计算机硬件课程设计终于要结束了,总算是实现了所要求的基本功能,所要完善的地方也只能再往后的时间里自己去摸索去改善,但是打从心里觉得这两周真的受益匪浅。
在课程设计刚开始阶段,由于始终感觉按键不够用,导致了前面阶段的进展很慢,但大家都还比较有团队协作精神,没有自己一味的按着自己的思路走,然后大家就坐下来好好的讨论一下,最后是通过小组讨论确定了我们这个设计的统一方案,接着大家就按照个人的专长,分配好每个人的具体任务,我所负责的是程序的主体流程逻辑以及实现细节。
在刚开始画流程图的时候,我没有按照任务书上面的基本要求来画,就是按照自己的想法来设计人机通讯接口,结果浪费了半天的时间,到最后,当考虑到细节问题时,总觉得有些不合理,所以,都舍弃前面那些不合理的流程图,最后还是小组讨论定下了流程方案,然后再把流程图细节化。
到了编程的时候,我们接受了老师的经验,将整个程序模块化了。
其实,这还是我第一次将整个程序进行模块化,以前做的时候,都是比较小的程序,虽然也有模块化,但对于模块化时的接口并没有考虑得那么详细,这次不同了,我得好好的考虑每个模块的接口问题了,我看了很多别人的程序,最后,总算有了一个比较明确的方案。
最后我分配给了每个组员相关的模块任务。
我认为不管组员的编程能力怎么样,对于这样一个课程设计,每一个组员都应该参与到其中,并且体会一下其中的乐趣,能力强的,就分得大一点的模块。
总之让每一个人都能尝试一下,这样每个人在此次课程设计中应该都会有不少的收获。
经过一个星期的努力,我们程序的基本功能都已经实现了。
我们打算在原有的功能上,加上一些比较人性化的细节,虽然这些细节可能不算是附加功能,但我觉得既然要做,就要尽善尽美。
因此,我们又着手修改程序的一些细节,让整个功能更具人性化。
最后我总结出来几点心得:
1、我们模块化时,一定要注意接口问题;
2、我们写程序时,要养成加注释的习惯;
3、不管是子程序还是跳转的入口点,最好使用能体现程序功能的英文缩写表示。
最后也是最重要的一步,调试程序,就比较费时费力了,因为这个不仅仅要看程序逻辑,因为有时候但看程序很难看出其中的错误,需要用到单步调试,这个实在是太考一个人的耐心了,而且有时候程序不一定有错,而且硬件出问题了,比如接线是断的,或者按键是坏的不灵敏的,我刚开始的时候在抱怨学校为什么不换一些好一点的硬件,但是后来想想以后的工作我们不也是会遇到这样的情况吗,难道我们所遇到的硬件机器会一直都是可靠无错的吗?
现在早点遇到这种情况,学会如何去处理也对我们是一种锻炼啊!
我们组本次计算机硬件基础课程设计的题目是通讯设备人机接口设计,我们班采用的是抽签的方式分配题目,当我们接到这个题目的时候顿时傻眼了。
不想选这个题目,原因有两个:
第一,功能多,繁琐;第二,不利于添加新的功能。
说实话,已经放了一学期的硬件知识,到现在我已经忘得差不多了。
本来学习的时候就学得不是很好,为了不拖大家的后腿,我用了第一天整个晚上的时间把硬件的书粗略的过了一遍,把支离破碎的知识重新拾起在脑海里。
第二天,早上八点半,我们准时来到了实验室。
我们几个理清了所有的功能和流程,一个上午我们把整个的流程图画出来了,再用了下午跟晚上的时间修改整理出来了主程序,和各个模块的流程图。
第三天,我们把主程序和各个模块的流程图用专业工具画了出来。
然后进行了任务分工,由于我编程水平一般,所以没有分配到特别复杂的模块,我负责显示模块,以及延时程序。
乍一看,我的任务太简单了,我最初也这么以为,可是当我真正着手干的时候我才发现,各种各样的问题都来了。
比如,我们使用的是三色LED灯的六位显示。
我要把所有需要显示的信息全部设计出来,而且显示的每一个信息都不能超过六位,最重要的是,还要使用能用八段LED显示出来的字母,像如果遇见“w”之类的字母,我想没有哪位大神能用八段LED把它显示出来吧。
所以,这可真不是一件让人省心的事。
遇见像挂断之类的信息还好,直接用英文“hangup”,可是当遇到像接听之类的信息的时候就比较让人头疼了,冥思苦想,最终设计出了“noans”,我想终究还是能够传情达意。
最终我用了1个小时把这些需要显示的八种信息全部用八段LED可以显示的英文或符号设计出来了。
设计好这个问题又来了,三色LED能显示的字形码只有0~F这十六个数字,我们显示需要用到的字母或者符号全都没有,没办法,自己编呗。
对于从来都很不细心的我,这又是一个不小的挑战,还好最终我把这些东西都顺利的弄出来了。
(很不幸,调试的时候还是发现编错了一个码)
在设计和调试的过程中我们遇到了各种各样的问题,还好我们相互帮助,相互提醒,相互鼓励,最终完成了这次的设计。
这次的设计不仅让我复习了计算机硬件基础的基本知识,还让我学会了理论与实际的结合,最重要的是我体会到了一个团队的力量。
本次课程设计我们小组抽到的是通讯设备人机接口的模拟设计,在刚分配好设计任务书后,小组4人快速选好组长,并初步安排好后面两周的工作。
首先是我们每个人各自研究设计任务书的内容要求,分析好要实现的每一功能,然后复习好计算机硬件的知识并拟定好各自的设计思路以及程序流程图。
再接着我们开始进行小组讨论,每个人各自说出自己的设计思路然后由其他组员提出问题,找出不足并提出修改方案并讨论可行性,在整合4个人的思想后初步拟定程序功能以及流程框架,然后一起画出程序流程图并针对细节进行讨论。
最终我们设计的通讯设备人机接口总的分为3大功能模块:
接听、来电以及查询。
在定好框架后我们开始分配任务,我分配到的是键盘扫描、开关扫描、显示代码、时间译码以及LED计时初始化的子程序。
接下来的一天我们通过翻查资料以及参照实验书上的参考程序完成各自的编程工作。
在编写键盘时通过8255C口高位依次给每列送“0”,再由8255低口读取每行的状态查找是否有按键按下,接着延时去抖,判断按下的键并根据键号赋予特定的值。
开关的扫描我是通过8255B口来读取的,在判断是哪个按键按下转入相应的子程序。
在编程的过程中只要思路清晰,画好流程图,还是很好写出来的。
比较痛苦的是调试的时候,历时长,错难找,让人心情烦躁。
语法性的错误还有提示,逻辑推理上的错误,这需要一次次的单步调试,仔细观察以及思索才能找出。
让我记忆深刻的是每个子程序调试都通过了,但在连调的时候却还是错误不断。
很多地方暴露出来的是我们思维的不严谨,例如再通过8255B口读开关的状态时由于只用到低6位,而高2位一直闲置的着不管,最终导致连调时该判断跳转的地方不跳转,足足让我们检查单步调试而来2个多小时才查找到错误的地方。
这次课程设计历时两周,在我们小组成员的分工合作下最终完成了设计任务。
通过这次课程设计我学到了不少东西。
不仅让我们复习了以前学过的知识,更然我们深刻体会到程序模块化设计的便利性以及自身思维严谨的重要性。
相信这些在我今后的学习工作生活中将有很大的帮助。
在这次短暂的两个星期的学习和设计中,我和我的队友们一起合作完成了通讯设备人机接口设计的任务。
通讯设备这个系统设计的难点主要在于其设计过程中功能的复杂性。
经过讨论,考虑到按键并不充足,我们把这次查询号码的任务单独拿出使用一个界面,这样在使用的时候用户按相应的功能键进入所需的界面进行操作。
在这次课程设计中,我负责的主要是查询功能的实现。
在这次合作设计里,我学到了很多东西。
在最初的讨论设计中,组长提出了共用内存的方法,这是我以前没有意识到的。
这样做的好处多多,很好的解决了各模块之间的连接问题并让各个模块之间相互独立。
这样有效的保证了各个组员独立设计的程序能够组合和为一个可行的大程序。
设计完了程序则该轮到调试了,各个模块进行独立的调试。
调试是一件很需要耐心的工作,同时也需要相当的仔细。
也许只是稍微写漏了一句语句也会耽搁相当大的时间。
尤其是当设计者被调试扰乱了思维的时候更应该静下心来仔细阅读程序,检验自己的逻辑是否有误。
这些都是需要慢慢学习的。
当问题被一个个解决之后,我们终于看到了希望。
初步的功能已经可以实现,虽然还有不足,但我们已经向成功迈进。
接下来则是对程序进行优化,对整体功能进行更合理的调整,使其更偏向于使用者的习惯。
最后我们添加了一些更便利的功能,让整个系统更完善。
总之,在这次的课程设计中,我学习到了很多的东西。
这是第一次合作做出一个比较贴近现实生活和实际的系统,感觉自己终于能够将所学的知识跟实际应用联系到了一起。
深刻认识到了自己的动手能力以及知识的熟悉程度等方面的欠缺。
这还需要进行大量的练习才行。
汇编语言与物理硬件靠得很近,这就需要我们对物理硬件有深刻的了解。
如何掌控好一个硬件的特点,则可以更好的进行汇编语言的编程。
作为一个团队各个组员之间的相互沟通是完成好一项工作的前提,也是大家进步的条件。
五、程序清单
.486
CODESEGMENTUSE16
ORG2000H
CTRL_8254EQU30CH
COUNT0EQU300H
COUNT1EQU304H
CTRL_8255EQU20FH
PORTAEQU203H
PORTBEQU207H
PORTCEQU20BH
ADDR0EQU320H
ADDR1EQU328H
INTQEQU40H
KEY_FLAGDB?
;按键标识
SEC_VARDB?
;秒钟存储
SEC_VAR1DB?
MIN_VARDB?
;分钟存储
MIN_VAR1DB?
HOUR_VARDB?
;时钟存储
HOUR_VAR1DB?
DISP_VARDB?
;显存指针
DIAL_FLAGDB?
;拨号位数存储标识
SI_ADDRDW?
;SI地址存储
JINWEIDB?
;进位标识
SWIT_FLAGDB?
;开关标识
CMP_FLAGDB?
;比较标识
KEY_S_FLAGDB?
;是否有按键按下标识
SWIT_S_FLAGDB?
;是否有开关按下标识
CMP_FLAG_N_PDB?
;来电号码个数标志
;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
ASSUMECS:
CODE
DIV_NUMDB10
MUL_NUMDB6;乘法间隔
ERRORDB88H,0C0H,88H,88H,86H,0FFH;错误
BUSYDB0FFH,91H,92H,0C1H,83H,0FFH;占线
NECTEDDB0A1H,84H,87H,0C6H,84H,0C8H;接通信息
HANGUPDB8CH,0C1H,90H,0C8H,0A0H,8BH;挂断
NOANSDB92H,0C8H,0A0H,0FFH,0C0H,0C8H;无人接听
AUTOHPDB8CH,8BH,0C0H,87H,0C1H,0A0H;自动挂断
DIE_OUTDB0FFH,0FFH,0FFH,0FFH,0FFH,0FFH;熄灭
STANDBYDB0BFH,0BFH,0BFH,0BFH,0BFH,0BFH;待机
NUM1DB06H,06H,08H,04H,06H,07H;显示764866
NUM2DB06H,05H,03H,03H,04H,08H;显示843356
NUM3DB06H,05H,01H,00H,01H,03H;显示310156
SEC_CODEDB01H,02H,03H,04H,05H,06H;密码123456
SEC_CODE1DB6DUP(0)
DISP_MEMDB6DUP(0)
DISP_MEM1DB6DUP(0);显存备用
DISP_NUMDB18DUP(?
)
DISP_TABDB0C0H,0F9H,0A4H,0B0H
DB99H,92H,82H,0F8H,80H,90H
ORG2100H
;-----------------------------------------------
;-----------------------------------------------主程序
START:
CALLINITIAL_8254
CALLINITIAL_8255
CALLINITIAL_8259;初始化8254,8255,8259
L0:
LEASI,STANDBY
MOVSI_ADDR,SI
CALLDISP_CODE
CALLSWIT_SCAN;判断是否有来电,开关扫描
CMPSWIT_S_FLAG,01H
JNEL1
CMPSWIT_FLAG,2
JGL1
CALLANSW;接听子程序
L1:
MOVSWIT_S_FLAG,00H
MOVSWIT_FLAG,00H
CALLKEY_SCAN;按键扫描,判断是否拨号
CMPKEY_FLAG,01H
JNEL2
CALLDIAL_P;拨号程序
L2:
CMPKEY_FLAG,2
JNEL0
CALLREFER_P;查询子程序
JMPL0
;--------------------------------------------------------------------------------
;--------------------------------------------------------------------------------显示代码模块
DISP_CODEPROCNEAR
PUSHA
MOVSI,SI_ADDR
LEADI,DISP_MEM
MOVCX,6
ERR_AGN:
MOVAL,[SI]
MOV[DI],AL
INCDI
INCSI
LOOPERR_AGN
CALLDISP
MOVECX,01FFFH;加入了显示延时
LOOP$
POPA
RET
DISP_CODEENDP
;----------------------------
;----------------------------初始化模块
INITIAL_8254PROCNEAR;8254初始化
PUSHA
MOVDX,CTRL_8254
MOVAL,30H;工作方式0,0号通道,先写低后写高字节
OUTDX,AL
MOVDX,COUNT0
MOVAX,47000
OUTDX,AL
MOVAL,AH
OUTDX,AL
POPA
RET
INITIAL_8254ENDP
INITIAL_8255PROCNEAR;8255初始化,键盘扫描初始
PUSHA
MOVDX,CTRL_8255
MOVAL,83H;C口高四位输出,低四位输入,b口输入,a口输出
OUTDX,AL
MOVDX,PORTA
MOVAL,0FFH
OUTDX,AL
CALLDELAY_05S
POPA
RET
INITIAL_8255ENDP
INITIAL_8259PROCNEAR;8259初始化
PUSHA
MOVDX,ADDR0
MOVAL,13H
OUTDX,AL
MOVDX,ADDR1
MOVAL,40H
OUTDX,AL
MOVDX,ADDR1
MOVAL,01H
OUTDX,AL
MOVDX,ADDR1
INAL,DX
ANDAL,0FEH;IR0开放
OUTDX,AL
CLI;关中断,并且填写中断向量表
MOVAX,0
MOVDS,AX
LEAAX,INT_P
MOVDS:
[INTQ*4],AX
MOVAX,SEGINT_P
MOVDS:
[INTQ*4+2],AX
POPA
RET
INITIAL_8259ENDP
;----------------------
;----------------------拨号模块
DIAL_PPROCNEAR;拨号程序
PUSHA
LD5:
LEADI,DISP_MEM1;为了重拨时能显示号码
LEASI,DIE_OUT;清屏
MOVSI_ADDR,SI
CALLDISP_CODE
MOVDIAL_FLAG,00H;拨号位数存储标识
LD0:
MOVCX,20;延时5秒不按任何按键推出,有任何按键按下都要重新赋值
LD:
CALLKEY_SCAN
CMPKEY_S_FLAG,01H
JNELD1;没有按键按下,跳到循环10次程序
MOVAL,KEY_FLAG
CMPKEY_FLAG,0BH;判断是否为挂机键
JEOVER_D
CMPKEY_FLAG,0AH;判断是否为接听键
JEJUDGE_6;判断是否为6位数
CMPKEY_FLAG,0AH
JLNUM_D;为数字
LD1:
CALLDELAY_05S;延时0.5s
LOOPLD
JMPOVER_D
JUDGE_6:
CMPDIAL_FLAG,6
JNEERROR_D;显示错误信息
CALLSUB_DIAL;拨号子程序
;----------------------------------------------显示所拨号码,挂机键反回主程序
LEASI,DISP_MEM1
LEADI,DISP_MEM
MOVCX,6
LD2:
MOVAL,[SI]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 硬件 课程设计 报告 通讯设备 人机 接口 设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)