PIC单片机课设报告Word文档下载推荐.docx

上传人:b****8 文档编号:22456933 上传时间:2023-02-04 格式:DOCX 页数:19 大小:261.67KB
下载 相关 举报
PIC单片机课设报告Word文档下载推荐.docx_第1页
第1页 / 共19页
PIC单片机课设报告Word文档下载推荐.docx_第2页
第2页 / 共19页
PIC单片机课设报告Word文档下载推荐.docx_第3页
第3页 / 共19页
PIC单片机课设报告Word文档下载推荐.docx_第4页
第4页 / 共19页
PIC单片机课设报告Word文档下载推荐.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

PIC单片机课设报告Word文档下载推荐.docx

《PIC单片机课设报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《PIC单片机课设报告Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。

PIC单片机课设报告Word文档下载推荐.docx

引脚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();

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

当前位置:首页 > 解决方案 > 商业计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1