单片机原理及应用密码锁课程设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机原理及应用课程设计(Project: Principle and Application of Microcontroller)
设计题目:电子密码开关设计
姓名李伟
院系电子与电气工程学院
专业电气工程及其自动化
年级2007级电气3班
学号20072312716
指导教师常新华
2010年7月25日
目录
1. 引言 1
2. 设计要求 1
3.系统硬件设计 1 3.1 STC89C52RC单片机简介 1 3.2 MAX232 简介 5
3.3 硬件原理设计图: 6
4. 软件设计7 4.1 程序流程图:8
4.2调试、实验方法及结果8
5. 设计总结8
6. 附录9 参考文献13 致谢13
电子密码开关设计
李伟
(电子与电气工程学院电气工程及其自动化2007级电气3班20072312716)
摘要:此设计基于STC89C52RC单片机实现密码锁功能,具体分析了硬件和软件的设
计方法。

该密码锁动作可靠,灵活性高、容易实现等优点,具有很好的市场推广价值。

通过
软件编程的方法实现了正确输入密码并以蜂鸣器发出响声作为密码输入正确的要求。

密码输
入正确时蜂鸣器响同时LED灯循环点亮。

该密码器设有四个按键:KEY1,KEY2,KEY3和
KEY4,使之具备了密码的特性。

再利用数码管显示所输入的密码,进一步实现了密码器的基
本功能。

关键词:STC89C52RC;蜂鸣器;LED灯;数码管
1引言
目前,单片机技术在各个领域中正得到越来越广泛的应用,STC89C52RC单片机具有体积小、集成度高、可靠性高、功耗低、结构简单等特点。

现在许多现代先进设备,如保险箱、个人电脑、手机等需要对设备进行密码保护场合,都普遍的使用密码器。

基于STC89C52RC单片机的密码器起因其具有操作灵活,精度高易于控制,设计简单等优点而成为优选的对象。

STC89C52RC单片机在许多场合得到了广泛应用,解决了密码器造价昂贵的问题。

2 设计要求
利用STC89C52RC单片机、LED灯、键盘和蜂鸣器组成一个结构相对简单的密码器。

要求密码器有下述功能:
◆ 1.上电时数码管显示四个0,同时蜂鸣器响一次,提示此时可以输入密码。

◆ 2.每按下一个键蜂鸣器响一次(提示按键已按下),并在数码管上显示出相应
的键值。

◆ 3.当按下四个键值时判断输入的值和密码是否相等,若相等则蜂鸣器响三次,
LED灯循环点亮,以此提示密码输入正确,否则蜂鸣器和LED灯不动作,以
此说明密码输入错误。

◆ 4.当错误密码输入大于三次时数码管全显示零,再输入密码将不再显示,密码
器自锁。

3 系统硬件设计
3.1 STC89C52RC单片机简介
STC89C52RC是STC89系列单片机中应用较为广泛的一种型号,芯片内部有8KB 的闪速存储器Flash ROM。

内部的8KB存储器用于存放可编程控制器监控程序。

STC89C52RC单片机的40条引脚按功能来分,可以分为3部分,电源及时钟引脚、控制引脚和输入/输出引脚。

STC89C52RC单片机原理图
89C52单片机引脚功能:
主电源及时钟引脚
此类引脚包括电源引脚Vcc、Vss、时钟引脚XTAL1、XTAL2。

(1)Vcc(40脚):接+5V电源,为单片机芯片提供电能。

(2)Vss(20脚)接地。

(3)XTAL1(18脚)在单片机内部,它是一个反向放大器的输入端,该放大
器构成了片内的振荡器,可提供单片机的时钟控制信号。

(4)XTAL2(19脚)在单片机内部,接至上述振荡器的反向输出端。

控制引脚
此类引脚包括RESET(即RSR/V
)、ALE、PSEN、EA,可以提供控制信号,
PD
有些具有复用功能。

(9脚):复位信号输入端,高电平有效,当振荡器运行时,(1)RSR/ V
PD
在此引脚加上两个机器周期的高电平将使单片机复位(REST)。

复位后应使此引脚电平保持为不高于0.5V的低电平,以保证单片机正常工作。

),以保持内部RAM中的数据不丢掉电期间,此引脚可接上备用电源(V
PD
失。

当Vcc下降到低于规定值,而V
在其规定的电压范围内(5±0.5V)时,
PD
就向内部RAM提供备用电源。

V
PD
(2)ALE/PROG(30脚):ALE为地址锁存允许信号。

当单片机访问外部存储器时,ALE(地址锁存允许)输出脉冲的下降沿用于锁存16位地址的低8位。

即使不访问外部存储器,ALE端仍有周期性正脉冲输出,其频率为振荡器频率的1/6。

但是每当访问外部数据存储器时,在两个机器周期中ALE只出现一次,即丢失一个ALE脉冲。

ALE端可以驱动8个LSTTL负载。

(3)PSEN(29脚):程序存储器允许输出控制端。

此输出为单片内访问外部程序存储器的读选通信号。

在从外部程序存储器取指令(或取常数)期间,每个机器周期均PSEN两次有效。

但在此期间,每当访问外部数据存储器时,这两次有效的PSEN信号将不会出现。

PSEN同样可以驱动8个LSTTL负载。

(4)EA(31脚):EA功能为内外程序存储器选择控制端。

当EA端保持高电平时,单片机访问内部程序存储器,但在PC(程序计数器)值超过0FFFH 时将自动转向执行外部程序存储器内的程序。

输入/输出引脚
此类引脚包括P0口、P1口、P2口和P3口。

(1)P0(P0.0~P0.7)是一个8位三态双向I/O口,在不访积压处部存储器时,做通用I/O口使用,用于传送CPU的输入/输出数据,当访问外部存储器时,此口为地址总路线低8位及数据总路线分时复用口,可带8个LSTTL负载。

(2)P1(P1.0~P2.7)是一个8位准双向I/O口(作为输入时,口锁存器置1),带有内部上拉电阻,可带4个LSTTL负载。

(3)P2(P2.0~P2.7)是一个8位准双向I/O口,与地址总路线高8位复用,可驱动4个LSTTL负载。

(4)P3(P3.0~P3.7)是一个8位准双向I/O口,除此之外每位还具有第二功能。

P3口功能表:
P3口各个位的第二功能
P3口的位第二功能说明P3.0 RXD 串行数据接收口
P3.1 TXD 串行数据发射口
P3.2 INT
外部中断0输入
外部中断1输入P3.3 INT
1
P3.4 T
计数器0计数输入
P3.5 T
计数器1计数输入
1
P3.6 WR 外部RAM写信号
P3.7 RD 外部RAM读信号89C52单片机内部结构图:
3.2 MAX232 简介
MAX232原理图
MAX232 原理及DB9 引脚定义MAX232 芯片是专门为电脑的RS-232 标准串口设计的接口电路,使用+5v 单电源供电。

内部结构基本可分三个部分:第一部分是电荷泵电路。

由1、2、3、4、5、6 脚和4 只电容构成。

功能是产生+12v 和-12v 两个电源,提供给RS-232 串口电平的需要。

第二部分是数据转换通道。

由7、8、9、10、11、12、13、14 脚构成两个数据通道。

其中13 脚(R1IN)、12 脚(R1OUT)、11 脚(T1IN)、14 脚(T1OUT)为第一数据通道。

8 脚(R2IN)、9 脚(R2OUT)、10 脚(T2IN)、7 脚(T2OUT)为第二数据通道。

TTL/CMOS 数据从T1IN、T2IN 输入转换成RS-232 数据从T1OUT、T2OUT 送到电脑DP9 插头;DP9 插头的RS-232 数据从R1IN、R2IN 输入转换成TTL/CMOS 数据后从R1OUT、R2OUT 输出。

第三部分是供电。

15 脚DNG、16 脚VCC(+5v)。

RS232 (DB9)引脚定义1 :DCD :载波检测。

主要用于Modem 通知计算机其处于在线状态,即Modem 检测到拨号音,处于在线状态。

2 :RXD:此引脚用
于接收外部设备送来的数据;在你使用Modem 时,你会发现RXD 指示灯在闪烁,说明RXD 引脚上有数据进入。

3 :TXD:此引脚将计算机的数据发送给外部设备;在你使用Modem 时,你会发现TXD 指示灯在闪烁,说明计算机正在通过TXD 引脚发送数据。

4 :DTR:数据终端就绪;当此引脚高电平时,通知Modem 可以进行数据传输,计算机已经准备好。

5 :GND:信号地;此位不做过多解释。

6 :DSR:数据设备就绪;此引脚高电平时,通知计算机Modem 已经准备好,可以进行数据通讯了。

7 :RTS:请求发送;此脚由计算机来控制,用以通知Modem 马上传送数据至计算机;否则,Modem 将收到的数据暂时放入缓冲区中。

8 :CTS: 清除发送;此脚由Modem 控制,用以通知计算机将欲传的数据送至Modem。

9 :RI : Modem 通知计算机有呼叫进来,是否接听呼叫由计算机决定R4 R5 一般取20K
3.3 硬件原理设计图:
4 软件设计
4.1 程序流程图:
4.2调试、实验方法及结果
N
Y
Y
开 始
初 始 化
按键是否按下?
显示按键所代表的数; panduan=panduan+10(4-n)
按键次数n>4?
err<3?
Y
err=err+1; n=0
N
比较pangduan 和code_data 是否相等?
蜂鸣器连响三声,流水灯循环点亮,提示密码
正确。

数码管全部显示0,无法再
输入密码。

结 束
Y
N
1)打开设计软件Keil uVision3,新建project,选择CPU类型,并保存,然后新建一个file并保存为扩展名为c的文件。

2)右击Target1 option for Target'target1',然后设置output(选中Create HEX)。

3)编写源程序,编写完之后进行编译,修改错误直至正确。

4)打开程序下载软件,连接好串口和电源,按正确的步骤将HEX文件下载到所焊接的单片机里面,并上电。

观察实现的结果和原本设计的是否一样,倘若不理想,则进一步调试程序,知道出现原本设计的结果。

5 设计总结
在课程设计中我懂得了自己专业的重要性,自己在某些方面还是很欠缺的。

在老师和同学的帮助下最终成功的完成了本次设计。

过程有点曲折,但总是能峰回路转,整个设计过程还是挺快乐的。

在课程设计中我学到了很多专业知识,对原先学的理论知识有了更深的理解。

真正的做到了学有所用,终于体会到了专业的乐趣。

此次课程设计收获颇丰,有专业知识的收获,也有非专业知识的收获。

程序设计调试过程中,同学之间互帮互助,合作的很愉快,使得本次课程设计进行的更加顺利,避免了走弯路,节约了世间。

此次课程设计让我真正的明白了“理论指导实践,实践是检验真理的唯一标准”这一道理。

6 附录
程序清单:
#include <reg52.h>
sbit beep=P1^7;
#define SEG P0
sbit com0=P3^4;
sbit com1=P3^5;
sbit com2=P3^6;
sbit com3=P3^7;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key4=P1^6;
sbit key3=P1^5;
unsigned char key_buf=0; unsigned char led_buf;
unsigned int code code_data=1234; unsigned int code_in=0; unsigned int panduan=0;
bit ledshow=0;
unsigned char err=0;
unsigned char errflag=1;
#define uint unsigned int
void delay(unsigned int a)
{
while(a--);
}
void liushuideng(void)
{ static unsigned int jishu=0;
static unsigned char i=0xfe;
jishu++;
if(jishu>=100)
{
jishu=0;
P2=i;
i<<=1;
i|=0x01;
if(i==0xff) i=0xfe;
}
}
void speak(unsigned char a)
{
unsigned char i;
for(i=0;i<a;i++)
beep=0;
delay(50000);
beep=1;
delay(50000);
}
}
unsigned char scan_key(void)
{
unsigned char key=0;
if((key1&key2&key3&key4)==0)
{
delay(30000);
if((key1&key2&key3&key4)==0)
{
if(key1==0) key=1;
else if(key2==0) key=2;
else if(key3==0) key=3;
else if(key4==0) key=4;
return key;
}
}
return 0;
}
unsigned char leddata[]={
0xC0, //"0"
0xF9, //"1"
0xA4, //"2"
0xB0, //"3"
0x99, //"4"
0x92, //"5"
0x82, //"6"
0xF8, //"7"
0x80, //"8"
0x90 //"9"
}; void display(unsigned int DATA)
{
static unsigned char i=0;
switch(i)
case0:com3=1;
SEG=leddata[DATA%10];
com0=0;break;
case 1:com0=1;
SEG=leddata[(DATA/10)%10];
com1=0;break;
case 2:com1=1;
SEG=leddata[(DATA/100)%10];
com2=0;break;
case 3:com2=1;
SEG=leddata[(DATA/1000)%10];
com3=0;break;
}
i++;
if(i==4) i=0;
}
void Timer0_init(void)
{
TMOD|=0X01;
TH0=0Xf8;
TL0=0Xcd;
ET0=1;
EA=1;
TR0=1;
}
void main(void)
{
Timer0_init();
speak(1);
while(1)
{
key_buf=scan_key();
if(key_buf!=0)
{ static unsigned char i=1;
switch(i)
{
case 1:code_in=(key_buf*1000);
break;
case 2:code_in+=(key_buf*100);
break;
case 3:code_in+=(key_buf*10);
break;
case 4:code_in+=key_buf;
break;
}
led_buf=key_buf;
key_buf=0;
speak(1);
panduan=code_in;
i++;
if(i==5)
{
i=1;
if((panduan==code_data)&&(errflag==1))
{
panduan=0;
speak(3);
ledshow=1;
}
else
{
err++;
if(err==3){code_in=0; errflag=0;}
}
}
}
}
}
void Timer0_ISR(void) interrupt 1
{
TH0=0Xf8;
TL0=0Xcd;
if(errflag==0)
{
display(0);
beep=0;
}
else display(code_in);
if(ledshow) liushuideng();
}。

相关文档
最新文档