PIC单片机课设报告Word文档下载推荐.docx
《PIC单片机课设报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《PIC单片机课设报告Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
![PIC单片机课设报告Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-2/3/2d8b54f6-cecb-4062-a2d1-836c9930b2ba/2d8b54f6-cecb-4062-a2d1-836c9930b2ba1.gif)
引脚11、32:
Vdd,系统电源端。
引脚12、31:
Vss,系统接地端。
引脚13、14:
RA7/OSC1/CLKIN、RA6/OSC2/CLKOUT,接4MHz的晶振,为系统的时钟源。
引脚33:
RB0/AN12/INT,为外部中断输入端。
接操作按键K2。
引脚34:
RB1/AN10/C12IN3,设为输入口,接操作按键K3。
引脚35:
RB2/AN8,设为输入口,接操作按键K4。
引脚19~23:
RD0~RD3,设为输出口,接LCD1602的数据输入端高四位。
引脚27:
RD4,设为输出口,接LCD1602的RS数据/命令选择端。
引脚28:
RD5/P1B,设为输出口,接LCD1602的RW读写选择端。
引脚29:
RD6/P1C,设为输出口,接LCD1602的E使能端。
引脚16:
RC1/T1OSI/CCP2,设为输出口,接微型直流电机。
引脚17:
RC2/P1A/CCP1,设为输出口,接蜂鸣器。
2、点阵型LCDYB1602A
采用4位数据线接线方式,是为节省单片机的I/O口
用到的引脚有:
GND,接地
引脚2;
VCCB,电源正极
引脚3:
VO,液晶显示偏压信号口
引脚4:
RS,命令/数据选择,接单片机RD4口
引脚5:
R/W,读/写选择,接单片机RD5口
引脚6:
E,数据使能,接单片机RD6口
引脚11~14:
DB4~DB7,数据输入口,接单片机RD0~RD3口
3、4x4按键
4行(RB0~RB3)作为输入状态,低4位有弱上拉使能并允许电平变化中断
4列(RB4~RB7)作为输入状态,输出低电平
4、微型直流电机(5V供电)
5、蜂鸣器
四、硬件电路图
五、程序设计
1.模块介绍
该电子密码锁系统的软件设计分为以下几个模块:
(1)主程序模块
主程序主要完成初始化、设置中断向量、检查有无按键按下、以及调用显示等等。
主程序的流程图如下所示。
(2)键盘扫描及识别子程序
键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦有按键按下,便转向相应的子程序处理,处理结束再返回。
(3)显示子程序
由于是分屏显示数据,所以就要用到4个显示子程序,分别是:
LCD初始化设定voidlcdcsh(void);
写入指令数据到LCDvoidxie_ml(unsignedcharml);
写入字符显示数据到LCDvoidxie_sj(unsignedcharsj);
写入字符串到LCDvoidxie_zfc(unsignedchar*pp,unsignedintn);
LCD字符清除子程序voidqingchu(void)/;
(4)密码比较子程序
输入密码与正确密码的比较intbijiao(void);
(5)声响子程序
通过改变蜂鸣器接口电平高低发声,包括2个声响子程序
警报声voidjingbao(void);
按键声voidanjiansheng(void);
(6)延时子程序
通过软件程序进行延时voiddelay(unsignedint);
2、程序流程图:
3、程序代码:
详见附录
六、总结
1、LCDYB1602A的编程,主要要点为:
(1)数据使能端E的控制,高电平变为低电平时写入;
(2)4位数据线的写入方式,要分别将高4位和低4位写入;
(3)体现删除效果时,可在原数据位写入“空格”。
2、键盘扫描及识别子程序的编程,主要要点为:
(1)将RB低4位设置为输入状态,注意弱上拉和电平变化中断设置。
(2)将RB高4位设置为输出状态,通过判断按下键时的PORTB值判断键值
(3)要有防抖动措施,防止按键错误。
3、其他程序要点:
(1)注意switch语句的运用,包括break别漏。
(2)标志位的设置有助于程序的判断。
(3)字符串的运用中用for语句进行各位的比较和写入。
(4)延时子程序的多处运用,如防抖、显示等。
经过将近三周的PIC单片机课程设计,终于完成了我的电子密码锁的设计,虽然功能不算强大,譬如说无法从硬件上修改密码,电路的密码不能遗忘,一旦遗忘,就很难打开,这可以通过增加电路解决,但过于复杂,本次设计未其中;
虽然如此但从心底里说,还是高兴的,毕竟这次设计把实物都做了出来。
通过这三周的学习,我感觉有很大的收获:
首先,通过学习使自己对课本上的知识可以应用于实际,使的理论与实际相结合,加深自己对课本知识的更好理解,同时实习也段练了我个人的动手能力:
能够充分利用网络去查阅资料,增加了许多课本以外的知识。
能对proteus、和mplab-ide等软件操作,能达到学以致用。
对我们学生来说,理论与实际同样重要,这是我们以后在工作中说明自己能力的一个重要标准。
在课设实践过程中,我感受到了老师对学生的负责态度,无论是在课堂还是在网咯上老师都来给我们指导,使我们少走弯路,顺利完成课设任务,感谢你们,老师!
七、参考书目
[1]李荣正、刘启中、陈学军,PIC单片机原理及应用,北京航空航天大学出版社,2006年10月
[2]江和、鲍光海,PIC单片机课程设计指导书,2010年6月
[3谭浩强.C程序设计(第二版),清华大学出版社,1999
[4]MicrochipTechnologyInc.PIC16F87XADataSheet.DS39582B,2003
[5]长沙太阳人电子有限公司.LCD1602使用说明书
程序代码
#include<
pic.h>
__CONFIG(0x20f1);
#defineRSRD4
#defineRWRD5
#defineERD6
#defineLCDPORTD
voidlcdcsh(void);
voidxie_sj(unsignedcharsj);
voidxie_ml(unsignedcharml);
voidxie_zfc(unsignedchar*pp,unsignedintn);
voiddelay(unsignedint);
voidanjian(void);
voidqingchu(void);
voidjingbao(void);
voidanjiansheng(void);
intbijiao(void);
unsignedchark,j=0,errorflag=0;
unsignedcharstr1[]="
password:
"
str2[]="
lock"
password[]="
123456"
pw[6];
voidmain(void)
{
TRISB=0x0F;
//B口高4位设置为输出,低4位设置为输入
TRISC=0x00;
//C口设置为输出
TRISD=0X00;
PORTB=0X0F;
//B口高4位设置为低电平,低4位设置为高电平
PORTC=0x00;
//C口设置为低电平
WPUB=0x0F;
//B口低4位设置为使能弱上拉
IOCB=0x0F;
//B口低4位设置为允许电平变化中断
ANSEL=0X00;
//数字I/O设置
ANSELH=0X00;
OPTION=0X00;
//选项寄存器设置
xie_zfc(str1,9);
//LCD写入"
while
(1)
{
while(PORTB==0x0f)//等待键按下
{
while(RBIF==0);
delay
(2);
RBIF=0;
//RB中断标志位清零
delay
(2);
}
anjiansheng();
//按下一个键响一声
anjian();
//判断哪个键按下
switch(k)
case'
C'
:
{qingchu();
j--;
}break;
//清除LCD前一个字符
E'
{if(bijiao()==0)//如果密码比较错误
{errorflag++;
//密码错误标志位加1
if(errorflag==3)//当密码输入错误三次
{
xie_zfc(str2,4);
//LCE写入“lock”
jingbao();
//警报声响起
TRISB=0X00;
//B口设置为输出,键盘被锁
}
else//当密码输入错误不足三次,允许再次输入
{
xie_zfc(str1,9);
j=0;
}
else//如果密码比较正确
{PORTC=0x02;
//RC2口输出高电平,电机转动
errorflag=0;
//密码错误标志位清0
}
};
break;
default:
{
pw[j]=k;
//按键值依次输入字符串PW中
j++;
xie_sj('
*'
);
//每按一个键,LCE写入一个“*”
}
voidxie_ml(unsignedcharml)//写入指令数据到LCD
{
RW=0;
//选择写入
E=1;
//数据使能:
下降沿送入有效
RS=0;
//选择命令
delay
(1);
LCD=ml;
//命令送入D口
E=0;
写入命令
voidqingchu(void)//清除命令
xie_ml(0x00);
//写入命令:
完成一个字符码传送后,光标左移,AC自动减1
xie_ml(0x04);
delay
(2);
xie_sj('
'
//在光标目前所在的位置写入空格
//在需删除的字符位写入空格
xie_ml(0x01);
没有读写显示数据的情况下光标右移,AC自动加1
完成一个字符码传送后,光标左右移,AC自动加1
xie_ml(0x06);
voidxie_sj(unsignedcharsj)//写入字符显示数据到LCD
charsj_h,sj_l;
sj_h=(sj&
0xf0)>
>
4;
//获得数据高4位写入sj_h低4位
sj_l=sj&
0x0f;
//获得数据低4位写入sj_l低4位
NOP();
RS=1;
//选择数据
LCD&
=0xf0;
//B口低4位清0,高4位保留
LCD|=sj_h;
//B口低4位为sj_h低4位值,高4位值不变
LCD|=sj_l;
//B口低4位为sj_l低4位值,高4位值不变
voidlcdcsh(void)//LCD初始化设定
chari;
delay(50);
for(i=0;
i<
3;
i++)//写控制命令“0b0011”3次
xie_ml(0x03);
delay(10);
}
xie_ml(0x02);
//写数据格式命令“0b0010”
delay(5);
//写功能设置命令“0b00101000”,4位数据格式,2行,5*7点阵
xie_ml(0x08);
xie_ml(0x00);
//写显示控制命令“0b00001111”,打开显示,光标闪烁
xie_ml(0x0f);
//写清除命令“0b00000001”
xie_ml(0x01);
delay(10);
//写模式命令“0b00000110”,每显示一个字符后地址自动加1
xie_ml(0x06);
voidxie_zfc(unsignedchar*pp,unsignedintn)//写入字符串
inti;
lcdcsh();
//LCD初始化
xie_ml(0x08);
//光标移至LCD第一行第一位
for(i=0;
n;
i++)//逐个写入字符串
xie_sj(pp[i]);
xie_ml(0x0C);
//光标移至LCD第二行第一位
voidanjian(void)//判断按键值
unsignedinty;
y=PORTB;
switch(y)
{case(0x0e):
{//如果B口值为0x0e,即RB0==0第一行按下
TRISB=0xF0;
//B口高4位设置为输入,低4位设置为输出
PORTB=0XF0;
//B口高4位设置为高电平,低4位设置为低电平
WPUB=0xF0;
//B口高4位设置为使能弱上拉
IOCB=0xF0;
//B口高4位设置为允许电平变化中断
if(RB4==0)k='
0'
;
//如果RB4口为低电平,则‘0’键按下
if(RB5==0)k='
1'
if(RB6==0)k='
2'
if(RB7==0)k='
3'
}
break;
case(0x0d):
{
4'
5'
6'
7'
case(0x0b):
8'
9'
A'
B'
case(0x07):
D'
F'
break;
}
while(PORTB!
=0x0F);
//如果有按键按下则保持循环扫描
intbijiao(void)//密码比较
intflag=1;
unsignedcharh;
for(h=0;
h<
6;
h++)
if(pw[h]!
=password[h])//如果输入值与原密码有一位不相等则密码错误
flag=0;
//标志位为0
}
return(flag);
//标志位值返回
voidjingbao(void)//警报声
{while
(1)
RC2=1;
delay(500);
RC2=0;
delay(300);
voidanjiansheng(void)//按键声
RC2=1;
delay(100);
RC2=0;
voiddelay(unsignedintn)//延时
unsignedinti;
charj;
i++)
{for(j=0;
j<
99;
j++)
{NOP();