小型数字系统设计报告软件.docx
- 文档编号:24492788
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:17
- 大小:126.08KB
小型数字系统设计报告软件.docx
《小型数字系统设计报告软件.docx》由会员分享,可在线阅读,更多相关《小型数字系统设计报告软件.docx(17页珍藏版)》请在冰豆网上搜索。
小型数字系统设计报告软件
河北工程大学科信学院
课程设计说明书
(2011/2012学年第1学期)
课程名称:
小型数字系统设计
(1)
题目:
密码锁(软件)
专业班级:
学生姓名:
学号:
指导教师:
赵建明、高艳芬
设计周数:
1周
二〇一一年十二月二十日
一、设计目的
通过课程设计进一步加深对基础理论和基本知识的理解,掌握相关软硬件应用系统设计开发的基本方法,提高解决实际问题和创新实践的能力。
利用单片机原理及应用、计算机组成原理、微型计算机技术、嵌入式系统等课程理论知识进行实践。
同时,学会查寻资料、方案比较,进一步拓展在生产工艺及工程设计方面的实际知识。
二、设计功能要求
要求使用4X4行列式键盘作为输入,扩展6个LED数码管。
具体要求如下:
1.开机时数码管显示“000000”,初始化密码为“123456”,密码可以更改,并保存在RAM中。
2.按下“#”,则显示全部清零为“000000”。
3.随时可以输入数值,并在LED数码管上实时显示,当键入一个新数值时,原来显示的数字左移一位,并在最右边的一位上显示出新键入的键值,键值为0~9。
4.按下“D”键,则表示确定键按下,则进行密码对比,如相符则在LED数码管上显示“======”以示通过;如不符,则显示“------”。
5.按下“*”键,如当前在已经通过密码验证的状态,则根据当前输入的号码更新原有的密码;如当前在尚未通过密码验证状态,则显示“------”。
6.按下“A”键,如当前在已经通过密码验证的状态,则显示当前的密码;如当前在尚未通过密码验证状态,则显示“------”。
7.按下“C”键,退出通过密码验证状态,进入尚未通过验证状态。
三、程序设计思路
对于这次课程设计来说,最重要的莫过于该程序的设计,是这次实训的核心。
程序设计思路,电子密码锁工作的主要过程是LCD提示开始选择操作功能(选择开锁还是更改密码),通过10号键盘开锁,13号14号进行密码的修改与保存。
当用户选择开锁时,通过键盘输入开锁密码。
如果密码输入正确,则LCD提示密码正确、LED灯亮表示开锁。
如果密码输入错误则LCD提示密码错误。
当用户选择更改密码功能时,要求用户先输入当前密码。
当密码正确时LCD提示用户进一步操作。
单片机向24C04写入新密码,否则提示错误并返回初状态。
四、主程序流程图
五、程序代码
Ⅰ预定义部分
#include
#include
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//上次按键和当前按键序号,该矩阵中序号范围0~15,16表示无按键
ucharpre_keyno=16,keyno=16;
ucharcodeTitle_Text[]="yourpassword...";//标题字符串
ucharDSY_BUFFER[16]="";//显示缓冲
ucharuserpassword[7]="";//用户输入的密码
ucharIIC_Password[7];
ucharIS_Valid_User=0;
uchari=0;
voidBeep();
ucharClear_Password();
sbitLED_OPEN=P2^0;//开锁灯亮
sbitBEEP=P3^7;//蜂鸣器
Ⅱ功能控制
voidkey_main()
{
P1=0xF0;
if(P1!
=0xF0)keyno=keys_scan();//扫描键盘获取键序号KeyNo
if(pre_keyno!
=keyno)
{
if(i<=6)
{
switch(keyno)
{
case0:
case1:
case2:
case3:
case4:
case5:
case6:
case7:
case8:
case9:
if(i==0)display_string("",0x40);
userpassword[i]=keyno+'0';
userpassword[i+1]='';//DSY_BUFFER[i]=userpassword[i];
DSY_BUFFER[i]='*';
DSY_BUFFER[i+1]='';
display_string(DSY_BUFFER,0x40);
i++;break;
case10:
//按A键开锁
if(strcmp(userpassword,IIC_Password)==0)
{
LED_OPEN=0;//点亮LED
Clear_Password();
display_string("UnlockOK!
",0x40);
IS_Valid_User=1;
}
else
{
LED_OPEN=1;//关闭LED
Clear_Password();
display_string("ERROR!
",0x40);
IS_Valid_User=0;
}
i=0;
break;
case11:
//按B键上锁
LED_OPEN=1;
Clear_Password();
display_string(Title_Text,0x00);
display_string("",0x40);
i=0;
IS_Valid_User=0;
break;
case12:
//按C键设置新密码
//如果是合法用户则提示输入新密码
if(!
IS_Valid_User)
display_string("Norights!
",0x40);
else
{
i=0;
display_string("NewPassword:
",0x00);
display_string("",0x40);
}
break;
case13:
//按D键保存新密码
if(!
IS_Valid_User)display_string("Norights!
",0x40);
else
{
sendstring(0xa0,0,userpassword,6);
//重新读入刚写的密码
recstring(0xa0,0,IIC_Password,6);
IIC_Password[6]='';
i=0;
display_string(Title_Text,0x00);
display_string("PasswordSaved!
",0x40);
}
break;
case14:
//按E键消除所有输入
i=0;
Clear_Password();
display_string("",0x40);
}
}
beep();
pre_keyno=keyno;
}
//delay(100);
//Beep();
delay(100);
P1=0xF0;
while(P1!
=0xF0);//如果有键未释放则等待
while(P1==0xF0);//如果没有再次按下按键则等待
}
Ⅲ24C04读写程序
//---------------------从芯片读取1字节
ucharrecbyte()
{
uchari,rd;
rd=0x00;
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;rd<<=1;rd|=SDA;delay4us();SCL=0;delay4us();
}
SCL=0;
delay4us();
returnrd;
}
//----------------------向芯片发送一个字节
ucharsendbyte(ucharwd)
{
uchari;
bitACK0;
for(i=0;i<8;i++)
{
SDA=(bit)(wd&0x80);
_nop_();_nop_();SCL=1;delay4us();SCL=0;wd<<=1;
}
delay4us();
SDA=1;
SCL=1;
delay4us();
ACK0=!
SDA;
SCL=0;
delay4us();
returnACK0;
}
//发送多字节数据函数
ucharsendstring(ucharslave,ucharsubaddr,uchar*buffer,ucharN)
{
uchari;
start();
if(!
sendbyte(slave))
return0;
if(!
sendbyte(subaddr))
return0;
for(i=0;i { if(! sendbyte(buffer[i]))return0; } stop(); return1; } //-------------------接收多字节数据函数 ucharrecstring(ucharslave,ucharsubaddr,uchar*buffer,ucharN) { uchari; start(); if(! sendbyte(slave)) return0; if(! sendbyte(subaddr)) return0; start(); if(! sendbyte(slave+1)) return0; for(i=0;i { buffer[i]=recbyte(); ACK(); } buffer[N-1]=recbyte(); no_ACK(); stop(); return1; } ⅣLCD1602显示部分 //测试LCD忙状态返回result bitlcd_bz() { bitresult; rs=0; rw=1; eq=1; _nop_();_nop_();_nop_();_nop_(); result=(bit)(P0&0x80); eq=0; returnresult; } //写指令数据到LCD voidlcd_wcmd(ucharcmd) { rs=0; rw=0; eq=0; P0=cmd; eq=1; delay_lcd (1); eq=0; } //写入显示数据到LCD voidlcd_wdat(uchardat) { while(lcd_bz()); rs=1; rw=0; P0=dat; delay_lcd (1); eq=1; eq=0; } //LCD初始化 voidlcd_init() { lcd_wcmd(0x38);//显示模式设置,5*7点阵,8位数据接口 while(lcd_bz()); lcd_wcmd(0x0c);//显示开及光标设置不显示 lcd_wcmd(0x06);//显示光标移动设置 lcd_wcmd(0x01);//显示清屏 } voiddisplay_string(uchar*str,ucharlineno)//在液晶指定行显示字符串 { uchari; lcd_wcmd(0x80+lineno); for(i=0;i<16;i++)//length(str) { lcd_wdat(str[i]); } } Ⅴ矩阵键盘扫描部分 //-------------------------矩阵键盘扫描 ucharkeys_scan() { uchartemp,k; P1=0x0f; delay_key (2); temp=P1^0x0f; switch(temp) { case1: k=0;break; case2: k=1;break; case4: k=2;break; case8: k=3;break; default: break; } P1=0xf0; delay_key (2); temp=(P1>>4)^0x0f; switch(temp) { case1: k+=0;break; case2: k+=4;break; case4: k+=8;break; case8: k+=12;break; default: break; } //keyno=k; returnk; } Ⅵ主函数 voidmain() { init_main(); display_string(Title_Text,0x00);//在第1行显示标题 //24C04的内容已由初始化BIN文件导入 //将24C04中预先写入的密码读入pass recstring(0xa0,0,IIC_Password,6); IIC_Password[6]='\0'; while (1) { key_main(); } } 六、仿真调试 用keil编写程序编译运行通过后,用Proteus仿真结果如下,以下是输入密码正确,开锁成功 修改密码,提示输入新密码,并保存成功。 七、心得体会 在着手本次课程设计时,通过查阅网络与图书馆搜集到的资料,加上指导老师指点,结合生活中对密码锁的功能特性要求,设计出了这一套电子密码锁系统的主要软件结构,基本完成了课题所给的要求。 不过由于了解的专业知识尚浅,对课题的研究经验的不足,使得在技术的解决与运用上显得粗糙了一些,特别是功能键功能的设定。 在设计的过程当中经历和克服了许多困难,暴露我们知识和经验不足的同时也积累了实践经验,检阅了大学所学的知识,使所学的知识得到复习和巩固。 通过这次课程设计我学到了很多东西,复习了理论知识,特别是单片机机应用编程;学会收集和处理资料的一些基本问题,提高获取新知识的能力、分析和解决问题的能力以及交流与合作的能力。 课程设计参考资料 [1]清源工作室.Protel99SE原理图与PCB及仿真[M].北京: 机械工业出版社, [2]孙德文.微型计算机技术[M].北京: 高教出版社,2002.11 [3]张培仁.十六位单片微处理器原理及应用(凌阳SPCE061A)[M].北京: 清华 [4]雷思孝.凌阳16位单片机原理及应用[M].西安电子科技大学出版社 [5]王田苗.嵌入式系统设计与实例开发(第2版)[M].北京: 清华大学出版社 [6]黄智伟.凌阳单片机课程设计指导[M].北京: 北航 [7]胥静.嵌入式系统设计与开发实例详解[M].北京: 北航,2005.1 生产实习 评 语 生产实习 成 绩 指导教师 (签字) 年 月 日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 小型 数字 系统 设计 报告 软件