PIC单片机电子密码锁实验Word文件下载.docx
《PIC单片机电子密码锁实验Word文件下载.docx》由会员分享,可在线阅读,更多相关《PIC单片机电子密码锁实验Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
![PIC单片机电子密码锁实验Word文件下载.docx](https://file1.bdocx.com/fileroot1/2023-1/9/ee5884ce-09bd-4643-915f-5b55fa981702/ee5884ce-09bd-4643-915f-5b55fa9817021.gif)
本实验的核心是编写程序,实验中采用c语言,通过软件MPLAB进行程序的烧写,将一块块的子程序进行嵌套最终融合起来成为整个项目的完整程序。
关键词:
PIC32单片机,电子密码锁,4*4矩阵键盘,LCD1602液晶显示,DS18B20
一.系统框图与硬件图
本系统电子密码锁的设计主要由以下部分组成:
LLCD1602显示CD
4*4矩阵键盘
PPIC32
蜂鸣器报警
DS18B20测温
开锁电路
4*4矩阵键盘模块:
VCC
行线
RE4第四行1234
RE3第三行5678
RE2第二行
90AB
RE0第一行
列线RB13第四列RB12第三列RF5第二列RF4第一列
CDEF
键盘上16个键的功能表如下
1
2
3
4
5
6
7
8
9
0
A<
开锁)
B<
设置密码)
C<
查看摄氏度温度&
确定键)
D<
查看华氏度温度)
E<
退出)
F<
删除)
说明:
0-9用做密码输入和密码设置等。
A键为开锁键,按下后可以输入密码进行开锁。
B键为修改密码键,按下后需要先输入原有密码,密码输入正确后可以进行密码修改。
C键为双用键,在刚进入电子锁时,直接按C键可以查看当前的温度<
摄氏度),当进入开锁或者设置密码功能时,C键为确定键。
D键为查看华氏度温度键。
E键为退出键,当在进行开锁或者设置密码功能时,按下退出键可以返回到主菜单。
F键为删除键,当输入密码不小心输错时可以清除输入密码重新输入
LCD1602液晶显示模块:
Gnd
+5V
RD12
RD13
RD4
RD5
RD6
RD7
RF0
RF1
RG1
RG0
RA1
VSS
VDD
V0
RS
RW
E
DB0
DB1
DB2
DB3
DB4
DB5
DB6
DB7
BLA
BLK
LCD通过RS,RW,E三个控制线来控制显示屏的读写命令,因为本实验中只需要写命令与写数据两种方式,以下是两种方式下三个引脚的电平状态
写命令
RSRW
DB0DB1DB2DB3DB4DB5DB6DB7
00
数据
写数据
10
DS18B20测温模块:
RF12
二.系统总体设计
1.系统模块总体框图
2.主程序流程图
液晶屏初始化
主程序
检测是否有按键按下
No
判断按下的键值
Yes
按下B
测温模块
Readtemperature(>
设置密码模块
Set_code(>
按下C
开锁程序
Users_code(>
按下A
3.各子程序流程图
(1)键盘扫描子程序keyboard(>
检测行线电平
第一行为低return15第三行为低return8
第二行为低return11第四行为低return4
else
第一行为低return14第三行为低return7
第二行为低return10第四行为低return3
第一行为低return13第三行为低return6
第二行为低return0第四行为低return2
第一行为低return12第三行为低return5
第二行为低return9第四行为低return1
2)LCD显示模块流程图
(3>
DS18B20测温模块流程图:
复位
结束
(4>
开锁子程序user_code(>
流程图:
密码识别子程序m=identify(>
开锁
return
m=1m=0
(5>
修改密码子程序change_code(>
设置密码子函数
Shezhi(>
m=0
m=1
(6>
密码识别子程序identify(>
流程图:
按下删除键
输入密码
键盘扫描
显示屏输出F
Return0
按下退出键E输入0-9数字键
按下确定键
判断密码正确性
错误
right=0
return0
times<
3
Ifright=1
再次输入一遍
正确
按下退出键E
扫描键盘
按下确定键D
return1
Ifright=2
密码设置子函数流程图:
按下删除键F
return
输入0-9数字键
new++
Ifnew=1
Ifnew=2
判断两次输入新密码是否一样
一样
new=0
不一样(重新输入否?
>
按下退出键
三.部分软件分析
一.LCD1602的显示:
LCD存在对数据的读写操作,这些操作是通过函数来对LCD进行写入各种指令来实现的,本实验中因为只需要显示屏完成字符及数字的显示,因此只需要完成LCD的写数据操作以及对显示屏的初始化操作。
(1)写操作
LCD的写操作包括两个步骤,写命令和写数据操作,以下是LCD写操作的时序图
由时序图可知,当对LCD进行写命令操作时,要先令RS控制信号为低电平,RW信号为低电平,然后把数据在DB0-DB7准备好之后,令使能控制信号E为高电平,然后等待一段时间,之后将E再拉低为低电平,这样就完成了对LCD的写命令操作。
当对LCD进行写数据操作时,要先令RS控制信号为高电平,RW信号为低电平,然后把数据在DB0-DB7准备好之后,令使能控制信号E为高电平,然后等待一段时间,之后将E再拉低为低电平,这样就完成了对LCD的写数据操作。
LCD的初始化操作主要是通过写入一些特定的指令来实现的,LCD的一般初始化过程如下:
(1>
写指令38H:
显示模式设置
(2)写指令08H:
显示关闭
(3)写指令01H:
显示清屏
(4)写指令06H:
显示光标移动设置
(5)写指令0CH:
显示开及光标设置
LCD模块相关代码如下:
/*LCD写命令*/
voidwrite_com(ucharcom>
{
rs=0。
DB0=(com>
%2。
DB1=(com/2>
DB2=((com/2>
/2>
DB3=(((com/2>
DB4=((((com/2>
DB5=(((((com/2>
DB6=((((((com/2>
DB7=(((((((com/2>
delay_ms(150>
。
E=1。
E=0。
}
/*LCD写数据*/
voidwrite_date(uchardate>
rs=1。
DB0=(date>
DB1=(date/2>
DB2=((date/2>
DB3=(((date/2>
DB4=((((date/2>
DB5=(((((date/2>
DB6=((((((date/2>
DB7=(((((((date/2>
delay_ms(150>
/*LCD初始化*/
voidInit_LCD(>
E=0。
write_com(0x38>
//显示模式设置
write_com(0x08>
//关闭显示
write_com(0x01>
//显示清屏
write_com(0x06>
//显示光标移动设置
write_com(0x0c>
//显示清屏:
数据指针清零;
所有显示清零
write_com(0x80>
//数据指针初始化
二.矩阵式键盘
用行列扫描法判断键盘是否有按键按下以及按键的位置,具体扫描过程为:
四根列线外部拉高,然后将第一根列线拉低为低电平,其他三根列线还为高电平,然后分别检测四根行线的电平状态,若第一行为低电平说明按下了F键,若第二行为低电平说明按下了B键,若第三行为低电平说明按下了8键,若第四行为低电平说明按下了4键,然后将四根列线拉高,然后只将第二根列线拉低,同理扫描四根行线,这样就能把所有键都扫描出来。
以下是扫描第一列四个键的代码。
line1=0。
line2=1。
line3=1。
line4=1。
delay_ms(100>
if(row1==0>
{
delay_ms(50>
if(row1==0>
{while(!
(row1>
return15。
}
if(row2==0>
delay_ms(50>
if(row2==0>
{while(!
(row2>
return11。
}
if(row3==0>
if(row3==0>
(row3>
return8。
if(row4==0>
{while(!
(row4>
return4。
三.DS18B20测温模块
DS18B20模块测温功能的实现主要通过向其读写一些指令来完成温度转换,温度读取等功能来实现的。
而要实现这些功能,主要包括初始化,以及读写操作来完成。
(1)初始化
18B20的初始化操作的时序图如下
DS18B20初始化时序
主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答,若无低电平出现一直都是高电平说明总线上无器件应答。
作为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备,若没有检测到就一直在检测等待。
对DS18B20的写和读操作
接下来就是主机发出各种操作命令,但各种操作命令都是向DS18B20写0和写1组成的命令字节,接收数据时也是从DS18B20读取0或1的过程,因此首先要搞清楚主机是如何进行写0、写1、读0和读1的。
写周期最少为60微秒,最长不超过120微秒,写周期一开始作为主机先把总线拉低1微秒表示写周期开始,随后若主机想写0,则继续拉低电平最少60微秒直至写周期结束,然后释放总线为高电平;
若主机想写1,在一开始拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束。
而作为从机的DS18B20则在检测到总线被拉低后等待15微秒然后从15μs到45μs开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。
DS18B20写操作
对于读数据操作时序也分为读0时序和读1时序两个过程,读时序是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。
DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束;
若要送出1则释放总线为高电平。
主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0,采样期内总线为高电平则确认为1,完成一个读时序过程,至少需要60μs才能完成。
DS18B20读操作
四.调试过程及相关问题
一.硬件调试
硬件调试在初期我们主要是在面包板上完成的,在面包板上实现之后才开始焊板子,但是后面发现焊完板子之后又出现新的问题,于是又要重新开始调试。
以下是硬件调试过程中出现的一些问题:
在调节LCD的时候,在将程序正确的烧入实验板后,发现LCD显示字符时出现了问题,显示屏本来该显示B,却显示的是C,本来该显示D,却显示成E,发现每隔一个字符就显示错误一个字符。
后来经过仔细分析,查找字符码和字符关系对照表,发现字符码的最后一位始终是1,即本来是0的也变成了1,DB0线上的信号没有给到液晶屏上。
于是发现时连接显示屏DB0和单片机的连线断了,导致显示屏DB0上悬空始终为高电平。
最后换了一根线后显示正常。
(2>
在初期我们是用插面包板的方式调节显示屏的,在面包板上我们把显示屏和键盘模块调好之后,我们将其焊到板子上,发现显示屏显示字符又不正常了,开始以为又是连线的问题,在反复拆连了电路之后还是没用,最后发现是LCD插座有一个引脚虚焊,没有焊牢,重焊了之后才正常
到最后快做完的时候,发现显示屏总是不稳定,有时候稍微一碰它就显示乱码,必须要用力压着单片机才能稳定下来。
最后发现这是因为与单片机相连的针座与单片机接触不良,换了一个针座后才稳定了。
我想针座在一开始做实验时没有接触不良,到最后为什么会接触不良?
后来觉得应该是电路拆连了太多遍,才会出现这种情况。
这也提醒我下次做实验时不要盲目的拆电路,要找到原因后对症下药,否则会对电路产生不好的影响
在调试18B20时,一开始连好电路之后,发现却始终显示的温度是0度,一开始以为是程序的问题,修改了一天程序后,发现还是没有改观,后来搭档在检查电路的时候发现测温电路没有外接电源,接上后就正确显示了温度。
这也更加告诉我以后一定要注意一些细节问题,否则会给实验造成一些不必要的困难,费时费力。
二.软件调试
软件调试主要是通过设置断点,结合硬件一起进行调试。
有时候也会运用一些小技巧来帮助调试,比如要看一个语句有没有执行,可以在语句后面加一句让单片机上的RD0亮的语句,这样可以通过看灯亮了没有就可以判断语句执行了没有,以下是软件调试时遇到的问题
1)调键盘时,一开始键盘调出来之后,发现存在一点问题,就是如果按一个键的时间太久了会显示出来好多个字符,后来在程序里加了一个防抖动的程序,问题得到了解决。
<
2)键盘一开始出不来,后来改来改去发现改哪都不管用,最后发现在检测按键函数之间的延时函数没有改动过,就尝试去改动了延时的时间,惊喜的发现竟然好了,后面调18B20时候也是如果延时时间有的不对的话也出不来,时间合适才能出来。
现在觉得延时这个东西其实真的很重要,刚开始的时候觉得延时可有可无,现在才知道任何一个细节都是很重要的
3)一开始写程序没有仔细考虑,把所有模块的代码都写在一个程序里,因此看起来很拥挤,很不清晰,于是到后来我们把各个模块分别各自写在一个头文件里,把代码模块化,这样显得清晰了很多
五.实验总结及心得体会
这次实验是我第一次接触单片机,最初刚选好题目时,我们感觉无从下手。
因为之前完全没有学过单片机方面的知识。
在和搭档讨论了之后,我们决定先借几本有关单片机的书籍仔细研读,熟悉了单片机编程和硬件结构方面的知识,并且查阅了大量的资料,终于对单片机有了一个大概的认识。
然后我们按照老师的指导开始最基础的LCD模块和键盘模块。
每天一步一步的边学习单片机的知识,边进行程序的编写,慢慢的对整个过程熟悉起来,对软硬件的调试也慢慢开始得心应手。
心里也没有刚开始的那种茫然不知所措和恐惧感。
这次实验也进一步的让我们体会到做任何事情一定要一步一步脚踏实地的慢慢来,虽然这几周天天都泡在实验室里,到最后确实感觉有点疲劳,但总算功夫不负有心人,到最后总算有所斩获。
通过这次实验也让自己对单片机有了一个直观深入的了解,也算是完成了单片机的入门工作。
我发现如果光看书的话,好多东西看完之后就会忘记,但是通过实验之后就会记得很牢固,所以有时候实验其实是一个很好的老师。
在实验过程中说实话会碰到很多问题,很多时候因为一点小问题,比如说连线断了,或者是没接电源,或者是改了代码之后忘了改引脚,从而导致出现问题而浪费很多时间,很多其实是可以避免的。
这也从侧面映衬出了细心的重要性。
其次,在实验中经常出现反复,比如LCD在调好之后又出现异常,需要耐心的重新调试。
说实话实验过程中经常会沮丧与急躁,每次都想赶快调好,但是越急躁越是没有进展,每次在自己静下心来之后一下就找出了问题的所在。
正所谓心急吃不了热豆腐,耐心真的是非常重要的。
在实验中尽管会遇到挫折,会沮丧失望,但是不到最后一定不要放弃,只要坚持不懈的做下去,最后总会解决问题的。
总之,这次试实验让我了解并学习了单片机,为我以后的学习打下了基础,让我获益匪浅。
五.参考资料
《单片机实用教程—基础篇》
李学海
北京航空航天大学
《单片机实用教程—提高篇》
《30天单片机快速入门》
《单片机C语言编程实例》