您好,欢迎来到测品娱乐。
搜索
您的当前位置:首页单片机教学规划之电子密码锁

单片机教学规划之电子密码锁

来源:测品娱乐
 _

课程设计(综合实验)报告

( 2009 -- 2010 年度第 二 学期)

名 称: 微处理器系统课程设计 题 目: 电子密码锁设计 院 系: 电子与通信工程系 班 级: 电子0702班 学 号: 200703020201 学生姓名: 白羽峰 指导教师: 张宁 设计周数: 1周

成 绩:

日期: 2010 年 7 月

_

单片机课程设计之电子密码锁

一、 课程设计要求

1.通过键盘输入密码。

密码正确与错误进行相应的音乐提示,与液晶显示提示。 3次按下错误密码则锁死,禁止信号输入。

2.通过超级密码(长度为16位)进入密码修改模式,进行密码修正,用户密码长度为8位。

二、实验目的

进一步的掌握使用ICC进行编程以及程序调试,熟悉并掌握AVR单片机片上外设功能及其使用,熟练掌握单片机学习板上矩阵键盘、1602液晶、蜂鸣器、EEPROM(AT24C02)等外设的使用以及和单片机间的通信。

三、设计思路

利用EEPROM(AT24C02)掉电不丢失的特性设计电子密码锁,先向AT24C02中写入一组数据作为密码(密码设定),然后进入密码输入界面,输入密码并进行密码真伪判别,密码真伪有不同对应的提示,表现在液晶显示和蜂鸣器鸣响上,出现三次密码输入错误则锁死,不能进行任何操作,只能关闭电源重新开始。

四、实验源程序代码如下:

#include #include #include

_

#define uchar unsigned char #define uint unsigned int

#define LCD_EN BIT(PC3) #define LCD_RS BIT(PC2)

//EEPROM控制寄存器位定义: #define EERE 0 #define EEWE

//读

//写

1

#define EEMWE 2 #define WWRIE 3

//总写入 //中断

uint add[8]={0x0100,0x0101,0x0110,0x0111,0x1000,0x1001,0x1010, 0x1011};

uchar sc[16]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38, 0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38}; uchar title[]={\"Code:\uchar title1[]={\"Hint:\uchar title2[]={\"Error!\

_

uchar title3[]={\"OK!\

uchar title8[]={\"Hello!I like AVR\uchar title4[]={\"Warnning!\uchar title5[]={\"Super Code:\uchar title6[]={\"Input New Code:\uchar title7[]={\"Set Code:\uint xians[]={0}; uchar key_flag; unsigned data_temp;

void_init(void) {

DDRB=0xff; PORTB=0xff; }

void eeprom_w(uint eeadd, uchar eedata) {

while(EECR&(1 << EEWE)); //写等待

//定义B口输出

_

EEAR=eeadd; EEDR=eedata;

//设置写入地址 //设置写入数据

//总写入允许 //开始写入

EECR|=(1<char eeprom_r(uint eeadd) {

while(EECR&(1 << EEWE)); //写等待 EEAR=eeadd;

//设置读入地址

//读命令

EECR|=(1<void delay_1ms(void) { uint i;

//返回数据

_

for (i=0;i<1140;i++); }

void delay(uint n) {

uint i=0; for (i=0;ivoid LCD_Write_half_char(void) {

PORTC &= 0x0F; //portc0~3=0

PORTC |= (data_temp<<4)&0xF0; //send LOW 4bit

PORTC |= LCD_EN; //EN端产生一个由低电平变高电平,写LCD delay(2);

PORTC &= ~LCD_EN; //EN端产生一个由高电平变低电平,写LCD PORTC &= 0X0F;

delay(2);

}

_

void LCD_write_char(uint command,uint data) {

PORTC &= ~LCD_EN; if (command == 0)

PORTC &=~LCD_RS; //RS=0 发送命令

else

PORTC |=LCD_RS; //RS=1 发送数据

data_temp = data;

data_temp=data_temp >>4;

LCD_Write_half_char();

data_temp = data;

LCD_Write_half_char(); }

void LCD_init(void) {

LCD_write_char(0,0x38); delay(1);

LCD_write_char(0,0x02); delay(1);

delay(1);

_

LCD_write_char(0,0x28); // 显示模式设置(不检测忙信号) delay(1);

LCD_write_char(0,0x08); // 显示关闭 delay(1);

LCD_write_char(0,0x01); // 显示清屏 delay(1);

LCD_write_char(0,0x06); delay(1);

LCD_write_char(0,0x0c); delay(5); }

uchar key_read(void) { uchar i;

DDRA = 0x0E; PORTA = 0x0E; i = PINA;

DDRA = 0xf0; PORTA = 0xf0; i |= PINA;

DDRA = 0x00; switch (i) // 显示光标移动设置 // 显示开及光标设置 //获取列地址 //获取行地址 //输出复位 //将按键码转换成键值

_

{ case 0x7d: return 0x31; case 0xbd: return 0x32; case 0xdd: return 0x33; case 0xed: return 0x34; case 0x7b: return 0x35; case 0xbb: return 0x36; case 0xdb: return 0x37; case 0xeb: return 0x38; case 0x77: return 0x2a; case 0xb7: return 0x39; case 0xd7: return 0x30; case 0xe7: return 0x23; default : return 0x00; delay(10); } }

void chush(void) {

uchar i=0,k,j,temp=0x00,m,n;

_

uchar x[8]={0};

uint add1[8]={0x85,0x86,0x87,0x88,0x,0x8a,0x8b,0x8c};

DDRC=0xff; PORTC=0x00;

LCD_init(); }

void main(void) {

uchar i=0,k,j,temp=0x00,m,n,l,w=0,y=0,z,v,t=0,dkz; LCD_write_char(0,0x80); for(k=0;k<5;k++)

LCD_write_char(1,title[k]); LCD_write_char(0,0x80+0x40); for(j=0;j<5;j++)

LCD_write_char(1,title1[j]);

uchar x[8]={0},dec[8]={0},p[16]={0},c[8]={0};

uint add1[8]={0x85,0x86,0x87,0x88,0x,0x8a,0x8b,0x8c};

_

uint add2[16]={0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9, 0xca,0xcb,0xcc,0xcd,0xce,0xcf}; DDRD=0xFF; PORTD=0xF0; DDRC=0xff; PORTC=0x00; LCD_init();

LCD_write_char(0,0x80); for(k=0;k<9;k++)

LCD_write_char(1,title7[k]);

while(i<8) {

c[i]=key_read();

if(c[i]!=0&&c[i]!=temp) {

LCD_write_char(0,add2[i]); LCD_write_char(1,0x2a); temp=key_read(); i++; }

/*delay(2);

_

dkz=PIND; if(dkz==0x70) } if(i==8) { temp=0;

i=0;

for(m=0;m<8;m++) {

void_init(); { i=8; }*/

eeprom_w(add[m],c[m]); //将数据写入EEPROM中的单元 PORTB=eeprom_r(add[m]);//读取EEPROM中的数据,送显

dec[m]=eeprom_r(add[m]);

delay(20); } while(1) {

delay(2); }

_

dkz=PIND;

if(dkz==0xE0)

{

LCD_write_char(0,0x01); // 显示清屏 LCD_write_char(0,0x80);

for(k=0;k<5;k++)

LCD_write_char(1,title[k]);

LCD_write_char(0,0x80+0x40);

for(j=0;j<5;j++)

LCD_write_char(1,title1[j]); }

x[i]=key_read();

if(x[i]!=0&&x[i]!=temp) {

LCD_write_char(0,add1[i]); LCD_write_char(1,0x2a); temp=key_read();

i++; } if(i==8) { temp=0; i=0;

_

for(m=0;m<8;m++) {

if(x[m]==dec[m])

{ w++; }

} if(w==8) {

LCD_write_char(0,0x80+0x45);

for(n=0;n<3;n++)

LCD_write_char(1,title3[n]);

PORTD^=BIT(5);

delay(100); PORTD^=BIT(5);

w=0; delay(200);

LCD_write_char(0,0x01); // 显示清屏 LCD_write_char(0,0x80);

for(k=0;k<16;k++)

LCD_write_char(1,title8[k]);

}

_

else }

{

LCD_write_char(0,0x80+0x45);

for(n=0;n<6;n++)

LCD_write_char(1,title2[n]);

for(l=0;l<6;l++)

{

PORTD^=BIT(5); delay(50); } y++;

}

if(y==3)

{ y=0;

LCD_write_char(0,0x01); // 显示清屏 LCD_write_char(0,0x80);

for(z=0;z<9;z++)

LCD_write_char(1,title4[z]);

dkz=PIND;

while(dkz==0xF0||dkz==0x70);

_

} delay(2); dkz=PIND; if(dkz==0x70) {

chush(); }

else if(dkz==0xB0) {

LCD_write_char(0,0x01); // 显示清屏 LCD_write_char(0,0x80);

for(z=0;z<11;z++) LCD_write_char(1,title5[z]);

while(i<16) {

p[i]=key_read();

if(p[i]!=0&&p[i]!=temp) {

LCD_write_char(0,add2[i]);

_

LCD_write_char(1,0x2a); temp=key_read();

i++; } } if(i==16) { temp=0; i=0;

for(m=0;m<16;m++) {

if(p[m]==sc[m])

{ t++; } }

} if(t==16) {

LCD_write_char(0,0x01); // 显示清屏

LCD_write_char(0,0x80);

for(z=0;z<15;z++) LCD_write_char(1,title6[z]);

_

while(i<8)

{

c[i]=key_read();

if(c[i]!=0&&c[i]!=temp) {

LCD_write_char(0,add2[i]); LCD_write_char(1,0x2a); temp=key_read(); i++; }

}

if(i==8) { temp=0;

i=0;

for(m=0;m<8;m++) {

void_init();

eeprom_w(add[m],c[m]); //将数据写入EEPROM中

的0x0100单元

PORTB=eeprom_r(add[m]);//读取EEPROM中0x0100

单元的数据,送显

dec[m]=eeprom_r(add[m]);

_

}

delay(20);

}

} }

} }

五、实验心得

通过本次课程设计,我对使用ICC进行编程以及程序调试有了进一步的掌握,并且对AVR单片机片上外设功能及其使用有了一个清晰的了解,较熟悉的掌握了单片机学习板上矩阵键盘、1602液晶、蜂鸣器、EEPROM(AT24C02)等外设的使用以及和单片机间的通信。而且通过本次课程设计的完成,我对基于单片机的设计更加有兴趣,有信心了。

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

Copyright © 2019- cepb.cn 版权所有 湘ICP备2022005869号-7

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务