纷纭教育
您的当前位置:首页PIC单片机课设报告

PIC单片机课设报告

来源:纷纭教育
 本文由zb110yz贡献

doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 目 录

„„„„„„„„„„„„„„„„„„„„„„ „„„2 一、目 的„„„„„„„„„„„„„„„„„„„„„„2 二、描述和要求„„„„„„„„„„„„„„„„„„„„2 描述和要求„„„„„„„„„„„„„„„„„„„„ „„„„„„„„„„„„„„„„„„„ 三、硬件选择„„„„„„„„„„„„„„„„„„„„„2 硬件选择„„„„„„„„„„„„„„„„„„„„„2 „„„„„„„„„„„„„„„„„„„„„ 四、硬件电路图„„„„„„„„„„„„„„„„„„„„5 硬件电路图„„„„„„„„„„„„„„„„„„„„ „„„„„„„„„„„„„„„„„„„ 五、程序设计„„„„„„„„„„„„„„„„„„„„„5 程序设计„„„„„„„„„„„„„„„„„„„„„5 „„„„„„„„„„„„„„„„„„„„„ „„„„„„„„„„„„„„„„„„„„„„ „„„„7 六、总 结„„„„„„„„„„„„„„„„„„„„„„7 七、参考书目„„„„„„„„„„„„„„„„„„„„„8 参考书目„„„„„„„„„„„„„„„„„„„„„8 „„„„„„„„„„„„„„„„„„„„„ 附录:程序代码„„„„„„„„„„„„„„„„„„„„ 附录:程序代码„„„„„„„„„„„„„„„„„„„„9 „„„„„„„„„„„„„„„„„„„ 1

一、目的 随着社会物质财富的日益增长和人们生活水平的提高, 安全成为现代居民最 关心的问题之一。而创自古以来就是把守门户的铁将军,人们对它要求甚高。即 要安全可靠地防盗,又要使用方便,这也是制锁者长期以来研制的主题。传统的 门既要备有大量的钥匙。又要担心钥匙丢失后的麻烦。另外,如:宾馆、办公大 楼、仓库、保险柜等由于人员的变动,开锁的钥匙也不再是只有一人拥有。购得 新居的家庭。由于装修施工等人住时也要把原有的锁胆更换,况且钥匙随身携带 也诸多不便。 随着单片机的问世,出现了带微处理器的电子密码锁,它的出现解决了传统 锁的许多缺点,使密码锁具有很高的安全性、可靠性。目前已经大量地应用于日 常生活之中。希望通过本课设完成具有一定实用性的电子密码锁,从而培养对单 片机学习的兴趣,巩固 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 引脚图如下: 2

本系统用到的引脚主要有: 引脚 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、 点阵型 LCD YB1602A 3

采用 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

4 列(RB4~RB7)作为输入状态,输出低电平 4、 5、 微型直流电机(5V 供电) 蜂鸣器

四、硬件电路图

五、程序设计 1.模块介绍 该电子密码锁系统的软件设计分为以下几个模块: (1)主程序模块 主程序主要完成初始化、 设置中断向量、 检查有无按键按下、 以及调用显示等等。 主程序的流程图如下所示。 (2)键盘扫描及识别子程序 键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环 主程序,一旦有按键按下,便转向相应的子程序处理,处理结束再返回。 (3)显示子程序 由于是分屏显示数据,所以就要用到 4 个显示子程序,分别是: LCD 初始化设定 写入指令数据到 LCD void lcdcsh(void); void xie_ml(unsigned char ml);

5

写入字符显示数据到 LCD 写入字符串到 LCD LCD 字符清除子程序 (4)密码比较子程序 输入密码与正确密码的比较 (5)声响子程序 void xie_sj(unsigned char sj); void xie_zfc(unsigned char *pp,unsigned int n); void qingchu(void)/; int bijiao(void);

通过改变蜂鸣器接口电平高低发声,包括 2 个声响子程序 警报声 按键声 void jingbao (void); void anjiansheng (void); void delay(unsigned int); (6)延时子程序 通过软件程序进行延时 2、程序流程图: 开 始

初始化

按键扫描 N 有键按下? Y 防抖动延时 识别按键

按下“C”键则清除 按下“E”键则确认

错误 比较密码 正确 电机转动 再次提示输入密码 3 次输入错误密码 警报响起 键盘锁定

6

3、程序代码: 详见附录

六、总结 1、LCD YB1602A 的编程,主要要点为: (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 等软件操作, 和 能达到学以致用。 对我们学生来说,理论与实际同样重要,这是我们以后在工作中说明自己能力的 一个重要标准。 在课设实践过程中,我感受到了老师对学生的负责态度,无论是在课堂还是 在网咯上老师都来给我们指导, 使我们少走弯路, 顺利完成课设任务, 感谢你们, 老师! 7

七、参考书目

[1]李荣正、刘启中、陈学军,PIC 单片机原理及应用,北京航空航天大学出版社,2006 年 10 月 [2]江和、鲍光海,PIC 单片机课程设计指导书,2010 年 6 月 [3 谭浩强. C 程序设计(第二版) ,清华大学出版社,1999 [4]Microchip Technology Inc. PIC16F87XA Data Sheet. DS39582B,2003 [5]长沙太阳人电子有限公司.LCD1602 使用说明书 8

附录: 附录:程序代码 #include

__CONFIG(0x20f1); #define RS RD4 #define RW RD5 #define E RD6 #define LCD PORTD void lcdcsh(void); void xie_sj(unsigned char sj); void xie_ml(unsigned char ml); void xie_zfc(unsigned char *pp,unsigned int n); void delay(unsigned int); void anjian(void); void qingchu(void); void jingbao (void); void anjiansheng (void); int bijiao(void); unsigned char k,j=0,errorflag=0; unsigned str1[]=\"password:\ char

void main(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 中断标志位清零

9

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 写入一个“*” } } } }

void xie_ml(unsigned char ml)//写入指令数据到 LCD { RW=0;//选择写入 E=1;//数据使能:下降沿送入有效 RS=0;//选择命令 delay(1);

10

LCD=ml;//命令送入 D 口 delay(1); E=0;//数据使能:写入命令 }

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

void xie_sj(unsigned char sj)//写入字符显示数据到 LCD { char sj_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;//数据使能:写入命令 }

void lcdcsh(void)//LCD 初始化设定 { 11

char i; 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” 位数据格式,2 ,4 行,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); }

void xie_zfc(unsigned char *pp,unsigned int n) { int i; lcdcsh();//LCD 初始化 xie_ml(0x08);//光标移至 LCD 第一行第一位 xie_ml(0x00); for(i=0;ivoid anjian(void)//判断按键值 { unsigned int y; y=PORTB; switch(y) {case(0x0e):{//如果 B 口值为 0x0e,即 RB0==0 第一行按下 TRISB=0xF0;//B 口高 4 位设置为输入,低 4 位设置为输

12

出 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'; } 13

break; default: break; } TRISB=0x0F; PORTB=0X0F; WPUB=0x0F; IOCB=0x0F; while(PORTB!=0x0F);//如果有按键按下则保持循环扫描 } int bijiao(void)//密码比较 { int flag=1; unsigned char h; for (h=0;h<6;h++) { if (pw[h]!=password[h])//如果输入值与原密码有一位不相等则密码错误 flag=0;//标志位为 0 } return(flag);//标志位值返回 }

void jingbao (void)//警报声 {while(1) { RC2=1; delay(500); RC2=0; delay(300); } }

void anjiansheng (void)//按键声 { RC2=1; delay(100); RC2=0; }

14

void delay(unsigned int n) // 延时 { unsigned int i; char j; for(i=0;i

因篇幅问题不能全部显示,请点此查看更多更全内容