实习报告
- 格式:doc
- 大小:794.50 KB
- 文档页数:26
目录1 设计目的和要求 (2)1.1 设计目的 (2)1.2 设计要求 (2)2 硬件设计 (3)2.1 硬件选择和总体系统框图 (3)2.2 4x4矩阵键盘电路 (3)2.3 数码管动态显示电路 (4)2.4 密码存储电路 (5)3 软件设计 (8)3.1 软件的总体设计 (8)3.2 I²C器件的读写 (10)3.3 键盘反转读键 (11)3.4 数码管扫描显示 (11)4 仿真与调试 (12)4.1 仿真过程中的问题 (12)4.2 软件仿真结果 (13)4.3 硬件调试 (14)5 实习心得 (15)参考文献 (16)附录 (17)1 设计目的和要求1.1 设计目的本课题的主要内容是采用单片机实现一个密码锁的设计,通过这个实习,进一步加深《C语言程序设计》、《单片机原理及应用》等相关课程中的理论知识,熟练掌握单片机的编程、调试和应用系统的开发。
1.2 设计要求1、密码存储在I²C器件中,实现密码掉电不丢失。
2、电路板在上电后四个数码管显示“—”。
3、实现数字键0-9和功能键的设计,4、四个功能键的说明:(1)密码的输入键:按下此键时,屏幕(四个数码管)空白显示(全黑),按下数字键输入原来密码,每输入一个数字,相应的数码管显示“—”。
若输入不正确,屏幕(四个数码管)显示“HHHH”。
若输入正确后,显示“8888”(2)退出键:密码的输入后,按下此键表示退出,屏幕(四个数码管)显示“—”。
(3)密码修改键:按下此键时,屏幕(四个数码管)空白显示(全黑),按下数字键输入原来密码,每输入一个数字,相应的数码管显示输入的数字,若输入正确后,屏幕(四个数码管)显示“8888”。
按下数字键输入新的密码,四个数码管清空显示(全黑),每输入一个数字,相应的数码管显示输入的数字。
如果放弃修改,按退出键放弃保存,进入状态2。
(4)修改确认键:当密码密码修改键按下,若输入密码正确后,按下此键时,将修改的密码进行存储。
2 硬件设计2.1 硬件选择和总体系统框图本设计采用AT89C52单片机,用24C02作为存储密码的芯片,实现断电不丢失,采用16位矩阵键盘输入,四联共阳数码管动态显示密码。
管脚连接如图 2.1所示。
图 2.12.2 4X4矩阵键盘电路矩阵键盘又称行列式键盘。
用I/O口线组成行列结构,按键设置在行列交点上。
N条口线最多可构造N²个按键。
4X4的行列结构可构成16个键的键盘,如图2.2所示。
无按键时各行各列彼此相交而不相连。
由行列线的电平状态可以识别唯一与之相连的按键,此时别过程成为读键。
图 2.2本设计键盘读键程序采用反转读键法。
第一步:先置行线P2.0~P2.3为输入线,列线P2.4~P2.7为输出线,且输出为0。
相应的I/O口的编程数据为0FH。
若读入低4位的数据不等于F,则表明有键按下,保存低4位数据。
其中电平0的位置对应的是被按下键的行位置。
第二步:设置输入输出口对换,行线P2.0~P2.3为输出线,且输出为0,列线P2.4~P2.7为输入线,I/O口编程数据为F0H。
若读入高4位数据不等于F,即可确认是按下的键。
读入高4位数据中为0的位为列位置。
保存高4位数据,将两次所读数值组合,便得按键码。
2.3 数码管动态显示电路本设计采用数码管动态显示方式,它既满足4个数码管的显示要求,又节省了单片机的I/O管脚资源,只使用12条I/O口线。
4个数码管共用一个I/O口P0,如图2.3所示,在每个瞬间,数码管段码相同。
要达到多位显示的目的,就要在每一瞬间只有一位com端有效,即只选通一位数码管。
段码由共用I/O口送来,各位数码管依次轮流选通,使每位显示该位的字符,并保持一段时间,以适应视觉暂留的效果。
图 2.32.4 密码存储电路2.4.1 I²C总线协议I²C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
在CPU与被控IC之间、IC与IC之间进行双向传送,在信息的传输过程中,I²C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。
总线基本状态如图2.4:1)总线空闲(A)数据线和时钟线同时为高电平。
2)启动数据传输(B)时钟(SCL)为高电平时,SDA 从高电平变为低电平表示起始条件产生。
起始条件必须先于所有的命令产生。
3)停止数据传输(C)时钟(SCL)为高电平时, SDA 从低电平变为高电平表示停止条件产生。
所有操作都必须以停止条件结束。
4)数据传送/数据有效(D)数据线的状态表明数据何时有效。
在起始条件之后,数据线在时钟处于高电平期间保持稳定。
必须在时钟信号为低电平期间改变数据线。
一个数据位对应一个时钟脉冲。
数据的每次传输以起始条件开始,以停止条件结束。
在起始条件和停止条件之间传输的数据字节数目由主器件决定。
图 2.4确认信号(ACK)每一个被寻址的接收器在接收到每一字节数据后,应发送一个确认位。
主器件必须提供一个额外的时钟以传输确认位。
在确认时钟脉冲内,器件确认须拉低 SDA 线。
在确认时钟的高电平期间,SDA线以这种方式保持稳定的低电平。
当然,还必须考虑建立时间和保持时间。
图 2.56)无应答信号(NO ACK)在时钟的第9个脉冲期间发送器释放数据总线,接收器不拉低数据总线表示一个 NO ACK,NO ACK有两种用途:a、一般表示接收器未成功接收数据字节;b、当接收器是主控器时,它收到最后一个字节后,应发送一个NO ACK信号,以通知被控发送器结束数据发送,并释放总线,以便主控接收器发送一个停止信号STOP。
2.4.2 E²PROM芯片24C02是2KB二线制I²C串行E²PROM,其特征码为1010B。
模块的电路图如图2.6所示。
图 2.6写数据过程:写操作时,SDA线上的信号依次为:启动START 1010 B2B1B0(0~111B) 0低电平为写操作应答ACK 8位的地址 ACK 数据0 ACK……数据15 应答ACK 结束STOP.24C02每一次写操作最多可连续写16字节(一页),也可以少于16字节。
一旦停止信号被接收到,则24C02内部写周期将开始。
在内部写周期期间,不响应外部信号,直到写周期完成。
如图2.7所示为24系列存储器写周期时序图。
图2.72)读数据过程:读操作时,SDA线上的信号依次为:启动START 1010 B2B1B0(0~111B) 0低电平为写操作应答ACK 8位的地址 ACK START 1010 B2B1B0(0~111B) 1高电平为读操作应答ACK 数据0 ACK……数据N 非应答NO ACK 结束STOP在读数据之前,先写入要读的数据所在的地址。
然后,主器件在“应答”位后产生一个启动信号,以终止刚才的写地址操作。
随后主器件再次发出控制字,R/W位为1,。
24C02接收“应答”信号后,便可读数据,可以读一字节、两字节、……N字节的数据。
读完最后一个数据后,主器件发出“非应答”(NO ACK)信号和停止(STOP)信号。
如图2.8所示为24系列存储器读操作时序图。
图 2.83 软件设计3.1 软件的总体设计软件的设计主要包括:密码从I²C器件的读写,键盘反转读键,数码管扫描显示,密码的比较处理等。
其总体流程图如图3.1所示。
图 3.13.2 I²C器件的读写该模块实现 I²C器件与RAM中40H单元为首地址的连续4个字节的密码读写。
真实密码读在40H单元,R0为地址指针。
其程序流程图3.2、3.3如下:图3.2 读密码流程图图3.3 写密码流程图3.3 键盘反转读键本设计程序中用R4、R5暂存键值,R6、R7进行循环减一。
流程图如图3.4。
图 3.43.4 数码管扫描显示本设计的R为1扫描地址指针,R0为输入密码地址指针。
程序设计流程图如图3.5所示。
图 3.54 仿真与调试4.1 仿真过程中的问题寄存器的混用仿真时延时程序所用到的寄存器,改变了键值暂存寄存器的值,仿真出现错误。
解决方法是编程前一定要对寄存器的用途做好计划,尽量不要重复使用同一个寄存器。
初始密码的烧录I²C器件的存储单元初始值为1,一个字节储存的密码就超过了0~9的范围,因此调用写入对I²C器件程序对其进行初始密码的烧录。
4.2 软件仿真结果能够完整的实现密码锁的输入判断,改密显示等功能。
软件仿真结果如图 4.1所示。
图 4.14.3 硬件调试通过串口下载到单片机中,进行密码锁的硬件调试,实物图如图4.2所示。
图 4.2密码锁整体功能实现良好,当四位数码管同时扫描显示时,可见到明显闪烁。
因此将显示中的延时缩短,闪烁明显减弱。
5 实习心得刚开始面对实习的时候,我们都还是觉得很生疏,不知从哪里入手,尽管做过实验。
具体需要做什么,能不能做出来,我们并不清楚。
但当时间一天天过去后,我们开始认真起来了。
从复习课本,再到复习实验,相互探讨编程思路,上网搜索资料,调试实验等,我们都在努力的自学着。
通过这次密码锁的设计,我们都有不同程度的收获。
首先,是学习上的巩固。
一方面,通过复习课本和实验,对单片机的基础知识又有了很大的巩固。
其次,通过对用汇编语言实现密码锁的功能,熟悉了proteus 软件的一些相关的操作,和电子元器件的组装等等。
第二,增进了与同学的交流。
平常除了上课,大家也比较少接触。
而每次做实习设计的时候,大家总会互相探讨,发表自己的看法,帮忙解决遇到的问题,分享自己的心得,于是交流也就不由自主的变得相对频繁些了,感觉也就更亲切了。
第三,对单片机的接口电路有了进一步了解,比如矩阵键盘,动态扫描数码管,E²PROM的读写等。
这样我们不仅了解单片机的原理,而是真正的会用单片机。
而且进一步培养了我们的动手能力和兴趣。
参考文献[1]李鸿等.单片机原理及应用[M].湖南大学出版社,2005.[2]何立民.单片机高级教程---应用与设计[M].北京航空航天大学出版社,2000,8.[3]戴佳.51单片机C语言应用程序设计实例精讲[M].北京:电子工业出版社,2006.[4]于京. 51系列单片机C程序设计与应用案例[M].北京:中国电力出版社,2006.[5]孙育才. ATMEL新型AT89S52系列单片机及其应用[M].北京:清华大学出版社, 2005.[6]李华.MCS-51系列单片机实用接口技术[M].北京:北京航空航天大学出版社,2000.附录源程序清单:SDAK BIT P3.3 ;位定义SCLK BIT P3.2ORG 0STAR: LCALL RD24C ;读存储器密码MOV R0,#50H ;设定R0为输入密码首地址50HMOV P0,#0BFH ;显示4条短横开段显MOV P3,#0H ;开位显MOV R3,#0H ;R3为输入模式,0等待,1输密,2改密;输原密,3改密输新密KEY: MOV P2,#0FHMOV A,P2CPL A ;取反查件ANL A,#0FHJNZ KEY1 ;判断是否有键按下CJNE R3,#3,KEY ;选择模式3时显示CJNE R0,#50H,KEY0SJMP KEYKEY0: LCALL DISPSJMP KEYKEY1: MOV R5,AMOV P2,#0F0HMOV A,P2CPL AANL A,#0F0HORL A,R5MOV R5,ALCALL DLYKEY2: MOV A,P2CPL AANL A,#0F0HJZ KEY5 ;检查按键是否松开CJNE R3,#3,KEY2CJNE R0,#50H,KEY3 ;没松开模式3继续显示SJMP KEY2KEY3: LCALL DISPSJMP KEY2KEY5: MOV B,R5MOV R1,#0MOV DPTR,#TABVAL0: MOV A,R1MOVC A,@A+DPTR ;查表将显示码转为按键码CJNE A,B,VALCJNE R1,#0AH,ST1 ;比较是否为输密键MOV R0,#50H ;更改相应模式寄存器和存密码指针寄存器MOV P0,#0BFHMOV P3,#0F0H ;段码显示-,位选关闭MOV R3,#1HLJMP KEYVAL: INC R1AJMP VAL0TAB: DB 11H,21H,41H,81HDB 12H,22H,42H,82HDB 14H,24H,44H,84HDB 18H,28H,48H,88HST1: CJNE R1,#0BH,ST2 ;比较是否为改密键MOV R0,#50HMOV P0,#0BFHMOV P3,#0F0HMOV R3,#2HLJMP KEYST2: CJNE R1,#0CH,ST3 ;比较是否为清除键LJMP STARST3: CJNE R1,#0DH,ST4 ;比较是否为确认键CJNE R3,#3H,_KEYCJNE R0,#54H,_KEYLJMP SURE ;当输入完新密码后跳转ST4: JNC _KEY ;无效输入键返回CJNE R3,#0,ST5 ;等待模式返回LJMP KEYST5: CJNE R0,#54H,ST7LJMP KEY ;密码输满返回ST7: MOV A,R1MOV @R0,A ;键输入的数字给当前指针制定位置INC R0 ;地址指针加1MOV A,P3RR A ;位显移位MOV P3,ACJNE R0,#54H,_KEYCJNE R3,#3H,ST6 ;非模式3密码输满后自行跳转比较LJMP KEYST6: MOV A,40HCJNE A,50H,ERROR ;按位比较,有一位不对则报错MOV A,41HCJNE A,51H,ERRORMOV A,42HCJNE A,52H,ERRORMOV A,43HCJNE A,53H,ERRORMOV P0,#80H ;密码正确,显示8888并延时 MOV P3,#0HLCALL DE100CJNE R3,#1H,CHANGE ;模式2跳转输入新密码LJMP STARCHANGE: MOV R0,#50HMOV P0,#0BFHMOV P3,#0F0HMOV R3,#3H_KEY: LJMP KEYERROR: MOV P0,#89H ;错误显示HHHHMOV P3,#0HLCALL DE100LJMP STARSURE: MOV 40H,50H ;按下确认键更改密码MOV 41H,51HMOV 42H,52HMOV 43H,53HLCALL WR24C ;将新密码写入存储器LJMP STARDISP: MOV R1,#50H ;显示子程序MOV R4,#7FHDS2: MOV A,@R1LCALL SEG7CPL AMOV P0,AMOV A,R4MOV P3,ALCALL DLYMOV P3,#0FFHINC R1MOV A,R0CJNE A,1H,DS3 ;扫描指针显示不超过密码地址指针 RETDS3: MOV A,R4RR AMOV R4,ASJMP DS2DE100: MOV R7,#0MOV R6,#0D1: DJNZ R6,$DJNZ R6,$DJNZ R7,D1RETDLY: MOV R7,#10MOV R6,#0DLY1: DJNZ R6,$DJNZ R7,DLY1RETSEG7: INC AMOVC A,@A+PCRETDB 3FH,6,5BH,4FHDB 66H,6DH,7DH,7DB 7FH,6FH,77H,7CHDB 39H,5EH,79H,71HRD24C: MOV R0,#40H ;读存储器子程序LCALL STARTMOV A, #0A0HLCALL WRBYTLCALL TACKMOV A,#0LCALL WRBYTLCALL TACKLCALL STARTMOV A,#0A1HLCALL WRBYTRD1: LCALL TACKLCALL RDBYTMOV @R0,AINC R0CJNE R0,#44H,RD1LCALL NOTACKLCALL STOPRETWR24C: MOV R0,#40H ;写入存储器子程序LCALL STARTMOV A,#0A0HLCALL WRBYTLCALL TACKMOV A,#0HLCALL WRBYTWR1: LCALL TACKMOV A,@R0LCALL WRBYTINC R0CJNE R0,#44H,WR1LCALL TACKLCALL STOPRETSTART: SETB SDAKNOPSETB SCLKNOPNOPNOPCLR SDAKNOPNOPNOPCLR SCLK NOPRETSTOP: CLR SDAKSETB SCLKNOPNOPNOPNOPSETB SDAKNOPNOPNOPNOPCLR SCLKNOPNOPRETTACK: CLR SDAKNOPSETB SCLKNOPNOPNOPCLR SCLKNOPNOPRETNOTACK: SETB SDAKNOPNOPSETB SCLKNOPNOPNOPNOPCLR SCLKNOPRETWRBYT: MOV R7,#8 WRBYT1: RLC AJC WRBYT2CLR SDAKSETB SCLKNOPNOPNOPNOPCLR SCLKDJNZ R7,WRBYT1RETWRBYT2: SETB SDAKSETB SCLKNOPNOPNOPNOPCLR SCLKCLR SDAKDJNZ R7,WRBYT1 RETRDBYT: MOV R7,#8RDBYT1: SETB SDAKSETB SCLKMOV C, SDAKRLC ACLR SCLKDJNZ R7, RDBYT1RETEND。