PIC单片机课设报告.docx
- 文档编号:5342832
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:17
- 大小:266.40KB
PIC单片机课设报告.docx
《PIC单片机课设报告.docx》由会员分享,可在线阅读,更多相关《PIC单片机课设报告.docx(17页珍藏版)》请在冰豆网上搜索。
PIC单片机课设报告
一、目的…………………………………………………………2
二、描述和要求……………………………………………………2
三、硬件选择………………………………………………………2
四、硬件电路图……………………………………………………5
五、程序设计………………………………………………………5
六、总结…………………………………………………………7
七、参考书目………………………………………………………8
附录:
程序代码……………………………………………………9
一、目的
随着社会物质财富的日益增长和人们生活水平的提高,安全成为现代居民最关心的问题之一。
而创自古以来就是把守门户的铁将军,人们对它要求甚高。
即要安全可靠地防盗,又要使用方便,这也是制锁者长期以来研制的主题。
传统的门既要备有大量的钥匙。
又要担心钥匙丢失后的麻烦。
另外,如:
宾馆、办公大楼、仓库、保险柜等由于人员的变动,开锁的钥匙也不再是只有一人拥有。
购得新居的家庭。
由于装修施工等人住时也要把原有的锁胆更换,况且钥匙随身携带也诸多不便。
随着单片机的问世,出现了带微处理器的电子密码锁,它的出现解决了传统锁的许多缺点,使密码锁具有很高的安全性、可靠性。
目前已经大量地应用于日常生活之中。
希望通过本课设完成具有一定实用性的电子密码锁,从而培养对单片机学习的兴趣,巩固PIC单片机的知识内容,提高实践动手能力。
二、描述和要求
1、密码正确则电机转动。
2、密码错误则需重新输入,若连续三次输入错误则报警声响起,键盘被锁。
3、按错键时可按“删除”键删除输入键值。
4、按下一个键时响一声,说明按键按下。
三、硬件选择
1、单片机PIC16F887
本系统设计的核心控制芯片为PIC16F887。
它是一款采用纳瓦技术的40引脚8位CMOS增强型闪存单片机。
PIC16F887具有8K字程序存储器,368字节用户可用数据存储器和256字节EEPROM。
具有36个I/0口,14个A/D通道,1个CCP,1个增强型CCP,1个增强型通用同步/异步收发器,1个主控同步串行端口,2个比较器,2个8位计数器/定时器,1个16位计数器/定时器。
PIC16F887引脚图如下:
本系统用到的引脚主要有:
引脚1:
RE3/MCLR/Vpp,系统复位端。
接操作按键K1。
引脚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口
用到的引脚有:
引脚1:
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
__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;//C口设置为输出
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写入"password:
"
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前一个字符
case'E':
{if(bijiao()==0)//如果密码比较错误
{errorflag++;//密码错误标志位加1
if(errorflag==3)//当密码输入错误三次
{
xie_zfc(str2,4);//LCE写入“lock”
jingbao();//警报声响起
TRISB=0X00;//B口设置为输出,键盘被锁
}
else//当密码输入错误不足三次,允许再次输入
{
xie_zfc(str1,9);//LCD写入"password:
"
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口
delay
(1);
E=0;//数据使能:
写入命令
}
voidqingchu(void)//清除命令
{
xie_ml(0x00);//写入命令:
完成一个字符码传送后,光标左移,AC自动减1
xie_ml(0x04);
delay
(2);
xie_sj('');//在光标目前所在的位置写入空格
delay
(2);
xie_sj('');//在需删除的字符位写入空格
xie_ml(0x01);//写入命令:
没有读写显示数据的情况下光标右移,AC自动加1
xie_ml(0x04);
xie_ml(0x00);//写入命令:
完成一个字符码传送后,光标左右移,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位
E=1;NOP();//数据使能:
下降沿送入有效
RW=0;NOP();//选择写入
RS=1;NOP();//选择数据
delay
(1);
LCD&=0xf0;//B口低4位清0,高4位保留
LCD|=sj_h;//B口低4位为sj_h低4位值,高4位值不变
E=0;//数据使能:
写入命令
delay
(1);
E=1;//数据使能:
下降沿送入有效
LCD&=0xf0;//B口低4位清0,高4位保留
LCD|=sj_l;//B口低4位为sj_l低4位值,高4位值不变
delay
(1);
E=0;//数据使能:
写入命令
}
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);
xie_ml(0x02);//写功能设置命令“0b00101000”,4位数据格式,2行,5*7点阵
xie_ml(0x08);
xie_ml(0x00);//写显示控制命令“0b00001111”,打开显示,光标闪烁
xie_ml(0x0f);
xie_ml(0x00);//写清除命令“0b00000001”
xie_ml(0x01);
delay(10);
xie_ml(0x00);//写模式命令“0b00000110”,每显示一个字符后地址自动加1
xie_ml(0x06);
}
voidxie_zfc(unsignedchar*pp,unsignedintn)//写入字符串
{
inti;
lcdcsh();//LCD初始化
xie_ml(0x08);//光标移至LCD第一行第一位
xie_ml(0x00);
for(i=0;i xie_sj(pp[i]); xie_ml(0x0C);//光标移至LCD第二行第一位 xie_ml(0x00); } 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): { TRISB=0xF0; PORTB=0XF0; WPUB=0xF0; IOCB=0xF0; if(RB4==0)k='4'; if(RB5==0)k='5'; if(RB6==0)k='6'; if(RB7==0)k='7'; } break; case(0x0b): { TRISB=0xF0; PORTB=0XF0; WPUB=0xF0; IOCB=0xF0; if(RB4==0)k='8'; if(RB5==0)k='9'; if(RB6==0)k='A'; if(RB7==0)k='B'; } break; case(0x07): { TRISB=0xF0; PORTB=0XF0; WPUB=0xF0; IOCB=0xF0; if(RB4==0)k='C'; if(RB5==0)k='D'; if(RB6==0)k='E'; if(RB7==0)k='F'; } break; default: break; } TRISB=0x0F; PORTB=0X0F; WPUB=0x0F; IOCB=0x0F; 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; for(i=0;i {for(j=0;j<99;j++) {NOP();NOP();NOP();NOP();} } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PIC 单片机 报告