华 北 科 技 学 院
《接 口 技 术》
课 程 设 计 报 告
班级
设计题目: 密码的设置和验证 设计时间: 2012-6-4 至 2012-6-15 指导教师: 评 语:_________________________________ _________________________________________ _________________________________________ _________________________________________ _________________________________________ 评阅成绩: 评阅教师:_____
一、课程设计目的
1、掌握8253的基本工作原理和编程方法。 2、掌握8255的基本工作原理和编程方法。 3、掌握数码管显示数字的原理。
4、了解数/模转换器的基本原理,掌握DAC0832芯片的使用方法。
5、了解双色点阵LED显示器的基本原理,掌握PC机控制双色点阵LED显示程序的设计方法。
进行程序设计方法和芯片使用基本训练,巩固在课堂上学到的有关芯片初始化编程和使用的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉接口技术的原理及应用,达到能独立使用现有芯片编制程序并正确运行的水平。
二、课程设计内容
密码的设置和验证:按原理图连接好电路。将8253OUT0接8255C口PC7,将8255的A口PA0~PA6分别与七段数码管的段码驱动输入端a~g相连,8255的C口PC5~PC4与位码驱动输入端S1、S0相接,dp接地(关闭),8255的C口PC3~PC0与逻辑电平开关K3~K0相接, K3~K0又与LED灯L3~L0相接。编程实现如下功能:
1、
在10秒钟内设定好4位密码(每位为0或1)。七段数码管用于计时:
9-0,8*8双色LED显示红色“SET”,4位密码由逻辑电平开关低四位K3-K0拨入。
2、
输入密码,有三次验证密码的机会。10s内输入密码,七段数码管用
于计时:9-0,8*8双色LED显示红色“IN”,4位密码由逻辑电平开关低四位K3-K0拨入。
3、 4、 5、 SUCCESS。
若输入的错误密码错误,则发出警报声而后继续让输入密码。 若三次都输入错误则报警提示。
若输入密码正确则验证成功,8*8双色LED显示红色“OK”,提示
三、课程设计原理及原理图
原理:⑴8253可编程定时/计数器 方式控制字:
D7~D6:00 计数器0,01 计数器1,10 计数器2,11 非法。
D5~D4:00 计数器锁存命令,01 只读写低字节,10 只读写高字节,11 先 读写低字节后读写高。
D3~D1: 000 方式0,001 方式1,010 方式2,011 方式3,100 方式4,101 方式5。
D0:0 二进制,1 十进制。 ⑵并行I/O接口芯片8255
端口A:PA0~PA7
A组,支持工作方式0、1、2 端口B:PB0~PB7
B组,支持工作方式0、1 端口C:PC0~PC7
仅支持工作方式0、A组控制高4位PC4~PC7、B组控制低4位PC0~PC3 ⑶DAC0832数模转换器
数字量 → 按权相加 → 模拟量 ⑷七段数码管
实验台上的七段数码管为共阴型,段码采用同相驱动,输入端加高电平,选中的数码管亮,位码加反相驱动器,位码输入端高电平选中。
⑸双色点阵LED显示器
实验仪上设有一个共阳极8×8点阵的红绿两色LED显示器,其点阵结构如图所示。该点阵对外引出24条线,其中8条行线,8条红色列线,8条绿色列线。若使某一种颜色、某一个LED发光,只要将与其相连的行线加高电平,列线加低电平即可。如欲显示汉字,采用逐列循环发光。 “SET”点阵代码:
①行代码输出 40H; 红色列代码输 01H;第一列1个红色LED发光。 ②行代码输出 7CH; 红色列代码输 02H;第二列5个红色LED发光。 ③行代码输出 40H; 红色列代码输 04H;第三列1个红色LED发光。 ④行代码输出 54H; 红色列代码输 08H;第四列3个红色LED发光。 ⑤行代码输出 7CH; 红色列代码输 10H;第五列5个红色LED发光。 ⑥行代码输出 08H; 红色列代码输 20 H;第六列1个红色LED发光。 ⑦行代码输出 54H; 红色列代码输 40 H;第七列3个红色LED发光。 ⑧行代码输出 20H; 红色列代码输 80 H;第八列1个红色LED发光。 “IN”点阵代码:
①行7EH; ②行04H;③行08H;④行10H;⑤行20H;⑥行7EH;⑦行00H;⑧行7EH。 “OK”点阵代码:
②行42H; ②行24H;③行14H;④行7EH;⑤行7EH;⑥行42H;⑦行42H;⑧行7EH。
原理图(电路图):
四、流程图
主流程图
熄灭七段数码管灯(LED_OFF): 打开七段数码管灯S0(LED_ONS0):
发出错误警报声(
五、程序源代码
;宏定义
;************************* SCREEN_MODEL MACRO MOV AH,6 MOV AL,0 MOV BH,34H MOV BL,0AH MOV CX,0 MOV DH,24 MOV DL,79 INT 10H ENDM
;----------------------- ;输出字符串
OUTSTR MACRO STR LEA DX,STR MOV AH,09H INT 21H ENDM
;**************************
DATAS SEGMENT MESS1 DB "please input password from the logic_switch! " ,0dh,0ah DB "(10 seconds to do this,the low 4 bits!) $" MESS2 DB 0dh,0ah,"input password form the logic_swith to Open clock!" ,0dh,0ah
DB " ( you have 3 chances ) $" MESS3 DB 0dh,0ah,"Press any key to continue…… ",0dh,0ah,'$' MESS4 DB 0dh,0ah,"you lose a chance! ",0dh,0ah,'$' MESS5 DB 0dh,0ah,"Open success! ",0dh,0ah,'$' PASSWORD DB ? I82531 EQU 0280H
I8253C EQU 0283H I8255A EQU 288H I8255C EQU 28AH I8255K EQU 28BH
I0832A EQU 2A8h
LED_Table DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
ICS1 EQU 0290H ICS2 EQU 0298H
the
ICS3 EQU 02A0H
COLUMN DB 00h,01h,02h,03h,04h,05h,06h,07h WORD_SET DB 40H,7CH,40H,54H,7CH,08H,54H,20H
WORD_IN DB 7EH,04H,08H,10H,20H,7EH,00H,7EH WORD_F DB 00H,00H,90H,90H,90H,0FFH,00H,00H WORD_T DB 00H,40H,40H,7EH,40H,40H,00H,00H
data1 DB 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh DB 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h DB 80h,66h,4eh,38h,25h,15h,09h,04h DB 00h,04h,09h,15h,25h,38h,4eh,66h ;正弦波数据 DATAS ENDS
STACKS SEGMENT DB 200 DUP (?) STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START:
MOV AX,DATAS MOV DS,AX MOV ES,AX
SCREEN_MODEL ;置屏显 OUTSTR MESS1
;****************设定密码*********************************** CALL LED_OFF ;七段数码管灯灭 MOV CX,10 AGAIN:
MOV AL,00110010B ;计数器0,先写高8位后写低8,二进制 MOV AX,3000H MOV DX,I82531 OUT DX,AL MOV AL,AH OUT DX,AL ;写计数初值
MOV DX,I8255K
MOV AL,10001001B ;方式0,A口出,C口入 OUT DX,AL ;写8255控制字
MOV DX,I8255C
TEST1: IN AL,DX ;读C口数据
TEST AL,10000000B;是否计数完1秒 JZ TEST1 PUSH CX
;***********显示计时*********************** MOV AX,CX DEC AX
MOV BX,AX
MOV DX,I8255K
MOV AL,10001001B ;方式0,A口出,C口入 OUT DX,AL ;写8255控制字
LEA SI,LED_Table MOV BH,0 ADD SI,BX CALL LED_ONS0 ;打开七段数码管灯S0 MOV AL,[SI] MOV DX,I8255A OUT DX,AL ;显示计数值
;***********显示SET*********************** MOV CX,080h d2: MOV AH,01h PUSH CX MOV CX,8 MOV SI,OFFSET COLUMN next: MOV AL,[SI] MOV BX,OFFSET WORD_SET XLAT ;得到第一行码 MOV DX,ICS1 OUT DX,AL MOV AL,AH MOV DX,ICS2 OUT DX,AL ;显示第一行红 SHL AH,01 INC SI
;CALL SHORT_DELAY LOOP next POP CX ;CALL SHORT_DELAY LOOP d2
;***********显示SET结束***********************
;***********一轮结束*********************** ;CALL DELAY
POP CX
LOOP AGAIN
CALL LED_OFF
MOV DX,I8255K
MOV AL,10001001B ;方式0,A口出,C口入 OUT DX,AL ;写8255控制字 MOV DX,I8255C IN AL,DX ;从8255C口读入数据,即读入设定的密码 AND AL,00001111B ;取其低4位
MOV PASSWORD,AL ;将设定的密码保存起来
;****************设定密码结束***********************************
;SCREEN_MODEL ;置屏显 OUTSTR MESS2
OUTSTR MESS3 MOV AH,1
INT 21H
;****************输入密码开锁,有3次开锁机会********************* MOV CX,3 OPEN_AGAIN: PUSH CX MOV CX,10 AGAIN2:
PUSH CX
;***********显示计时*********************** MOV AX,CX DEC AX
MOV BX,AX
MOV DX,I8255K
MOV AL,10001001B ;方式0,A口出,C口入 OUT DX,AL ;写8255控制字
LEA SI,LED_Table MOV BH,0 ADD SI,BX CALL LED_ONS0 ;打开七段数码管灯S0 MOV AL,[SI] MOV DX,I8255A OUT DX,AL ;显示计数值
;***********显示IN*********************** MOV CX,080h D1: MOV AH,01h PUSH CX MOV CX,8 MOV SI,OFFSET COLUMN next1: MOV AL,[SI] MOV BX,OFFSET WORD_IN XLAT ;得到第一行码 MOV DX,ICS1 OUT DX,AL MOV AL,AH MOV DX,ICS2 OUT DX,AL ;显示第一行黄 SHL AH,01 INC SI
CALL SHORT_DELAY LOOP next1 POP CX CALL SHORT_DELAY LOOP D1
;***********显示IN结束*********************** POP CX LOOP AGAIN2 CALL LED_OFF
;***********一轮结束*********************** POP CX MOV DX,I8255K
MOV AL,10001001B ;方式0,A口出,C口入 OUT DX,AL ;写8255控制字 MOV DX,I8255C IN AL,DX ;从8255C口读入数据,即读入输入的密码 AND AL,00001111B ;取其低4位 CMP PASSWORD,AL JZ OPEN_SUCCESS OUTSTR MESS4
CALL ALERT;发出错误警报声 LOOP OPEN_AGAIN JMP EXIT OPEN_SUCCESS:
OUTSTR MESS5
;***********显示T*********************** MOV CX,080h
D3: MOV AH,01h PUSH CX MOV CX,8 MOV SI,OFFSET COLUMN next3: MOV AL,[SI] MOV BX,OFFSET WORD_T XLAT ;得到第一行码 MOV DX,ICS1 OUT DX,AL MOV AL,AH MOV DX,ICS2 OUT DX,AL ;显示第一行红 SHL AH,01 INC SI
CALL SHORT_DELAY LOOP next3 POP CX CALL SHORT_DELAY LOOP D3
CALL MUSIC1 ;***********显示T结束***********************
EXIT:MOV AH,4CH INT 21H
;***********七段数码管灯灭与亮***************** LED_OFF PROC NEAR ;熄灭七段数码管灯 PUSH DX
PUSH AX
MOV AL,10000001B ;方式0,A口出,C口高4位出,低4位入 MOV DX,I8255K OUT DX,AL
MOV AL,00001000B ;PC4置0 OUT DX,AL
MOV AL,00001010B ;PC5置0 OUT DX,AL POP AX
POP DX RET
LED_OFF ENDP
;---------------------------------------------------
LED_ONS0 PROC NEAR ;打开七段数码管灯S0 PUSH DX
PUSH AX
MOV AL,10000001B ;方式0,A口出,C口高4位出,低4位入
MOV DX,I8255K OUT DX,AL
MOV AL,00001001B ;PC4置1 OUT DX,AL
MOV AL,00001010B ;PC5置0 OUT DX,AL POP AX
POP DX RET
LED_ONS0 ENDP
;***************************************
;***********延迟子程序****************** SHORT_DELAY PROC NEAR ;短延迟子程序 PUSH CX MOV CX,0ffffh ccc: LOOP ccc POP CX RET
SHORT_DELAY ENDP
;---------------------------------------------- DELAY PROC NEAR ; 长延时子程序 PUSH CX PUSH DX
MOV CX,0A000H _1: MOV DX,8088H _2: DEC DX JNZ _2 LOOP _1 POP DX POP CX RET
DELAY ENDP
;************************************************** ALERT PROC NEAR PUSH CX MOV CX,200 ;取200次32个正弦波数据 ddd: MOV SI,0
lll: MOV AL,data1[SI] ;取正弦波数据 MOV DX,I0832A OUT DX,AL ;放音 CALL SHORT_DELAY INC SI CMP SI,32 ;是否取完32个数据 JL lll ;若没有,则继续
LOOP ddd ;总循环次数60是否完,没有,则继续 POP CX RET
ALERT ENDP
;*************************************** CODES ENDS
END START
六、结果
①提示信息,10s内通过逻辑电平开关设定密码10s内通过逻辑电平开关输入密码实验箱上:设定的密码为
1111
双色点阵LED显示器相识SET
②显示提示信息,
实验箱上:输入的密码为1001,输入的密码与设定的密码1111不相同,发出开锁不成功警报声,再次输入,不同,再次发出警报声,第三次输入1111,提示信息SUCCESS!
实验箱显示:数码管显示倒计时,双色点阵器显示IN,验证密码
④验证成功,实验箱显示“OK”,屏幕提示信息”SUCCESS!”
七、课程设计总结及体会
在设计的过程中我遇到过许多问题。如使用8253 计时,采用方式0,输入时钟频率1MHZ,初值为65536,理论上是每隔1S输出1个高电平,但在实际中利用查询方式查询高电平时,与理论值不同。再如,使用七段数码管显示计时,比如显示‘13’,‘1’显示得极短、‘3’显示得较长,很不协调,最终只用了一位显示计时。
通过两个星期的课程设计,我对有关芯片的初始化编程和使用的基本知识、基本方法有了更深的认识,学会了应用8255、DAC0832、七段数码管等编写程序实现一些简单的功能,同时也意识到自己的不足,所谓越学越感觉到知识的欠缺,自己所想的无法用知识去体现出来或者结果跟思路相悖却找不到症结所在。
动手能力是计算机系学生应具有而且要强加练习的一种能力,这次课设是我充分的发挥了这一点,而且不仅现在,在以后的工作中也要多动手,多实践 。
创新思维也是计算机系培养的重点,再简单的东西动动脑就能做得漂亮,得到同学们的称赞。这次课设也正是在这个的基础之上来完成的。这次课程设计使我收获甚多。在此,感谢培养我的老师们。