PIC单片机课设报告.docx

上传人:b****5 文档编号:7496785 上传时间:2023-05-11 格式:DOCX 页数:17 大小:266.40KB
下载 相关 举报
PIC单片机课设报告.docx_第1页
第1页 / 共17页
PIC单片机课设报告.docx_第2页
第2页 / 共17页
PIC单片机课设报告.docx_第3页
第3页 / 共17页
PIC单片机课设报告.docx_第4页
第4页 / 共17页
PIC单片机课设报告.docx_第5页
第5页 / 共17页
PIC单片机课设报告.docx_第6页
第6页 / 共17页
PIC单片机课设报告.docx_第7页
第7页 / 共17页
PIC单片机课设报告.docx_第8页
第8页 / 共17页
PIC单片机课设报告.docx_第9页
第9页 / 共17页
PIC单片机课设报告.docx_第10页
第10页 / 共17页
PIC单片机课设报告.docx_第11页
第11页 / 共17页
PIC单片机课设报告.docx_第12页
第12页 / 共17页
PIC单片机课设报告.docx_第13页
第13页 / 共17页
PIC单片机课设报告.docx_第14页
第14页 / 共17页
PIC单片机课设报告.docx_第15页
第15页 / 共17页
PIC单片机课设报告.docx_第16页
第16页 / 共17页
PIC单片机课设报告.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

PIC单片机课设报告.docx

《PIC单片机课设报告.docx》由会员分享,可在线阅读,更多相关《PIC单片机课设报告.docx(17页珍藏版)》请在冰点文库上搜索。

PIC单片机课设报告.docx

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();}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2