系统会报警10 秒,且键盘锁定。结果分析:程序编的不是很完善,缺少错误处理措施。硬件没有断电保护电路,无法记忆前序操作
六、自我评价
1、 设计总结
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。回顾这两个星期的课程设计,我发现自己收获很大,学到很多的东西,不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,更重要的是养成了细致耐心的处理复杂枯燥工作的习惯,刚刚开始时确实遇到很多困难,但随着一项一项的解决,自己也受到了很大的磨练。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有把所学的理论知识与实践相结合起来,才能做出有用、实用的东西来,提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,由于第一次做,有很多不懂的,错误的。在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,对单片机汇编语言掌握得不好,通过这次课程设计之后,把以前所学过的书重新翻了出来,温习以前的相关内容。最终顺利的完成了任务。
2、 进一步改进措施
通过这次课程设计,我学到了很多。首先在设计之前要想好自己要设计什么,设计的东西要达到什么标准,有什么要求,在这次设计过程中我们小组就犯了这样的错误,在选题上没有彻底了解选题的内容,在做到一定程度后发现自己做不下去了,就只能改变选题了。设计必须要有一个清晰地思路,要有一个大体的框架。最初设计的时候,老是觉得设计过于复杂,到现在想一下,整个系统分为键盘,显示,系统,开锁模块是非常容易清晰的。程序的设计必须依据硬件电路,还有就是要考虑各种意外情况,增加错误处理程序这样的系统才能稳定,接下来的改进措施应该注重电子锁的安全性、稳定性进行设计,还可以加上一些人性化设计。
七、附录
1、 软件和硬件工作时的图片
报警中的图片
2、 程序
主程序:
/*********************************************** 程序功能:电子锁
------------------------------------------------ 跳线设置:将跳线座J3 上的短路帽拔下 ------------------------------------------------
测试说明:按动K1~K16 按键,观察数码管显示,聆听 按键时蜂鸣器是否发声
************************************************/ #include
/*******************报警函数*******************/ void alert(void ) {
long int i;
P6OUT = 0; //蜂鸣器报警
for(i = 99999; i > 0; i--); P6OUT |= BIT7; num++; }
/**********************************************/ /********************主函数********************/ void ma in(void) {
uint j,x,fla g,fla g1; long int i; num=0;
fla g=0; //标记新一轮输入 fla g1=0; //改码
a[0]=1; a[1]=2; a[2]=3; a[3]=4;//初始密码值
BoardConfig(0x80); //打开数码管、流水灯,关闭电平转换
WDTCTL = WDT_ADLY_1_9; //设置内部看门狗工作在定时器模 式,1.9ms 中断一次
IE1 |= WDTIE; //使能看门狗中断 P2DIR = 0xff; //LED 显示 P4DIR = 0xff;
P5DIR = 0xff; //设置P2,P4,P5 的IO 方向为输出 P6DIR |= BIT7; P2OUT = 0xff;
P4OUT = 0x00; //设置P4,P5 的输出初值 P5OUT = 0xff;
P6OUT |= BIT7; //蜂鸣器对应IO 设置为输出 _EINT(); //打开全局中断 Init_Keypad();
for(j=0;j<4;j++) //初始显示为“AAAA” Dispbuf[j] = 10; j=0; while(1) {
if(num>2) {
P1DIR = 0x00; P1OUT |= 0x00; P6OUT = 0; P2OUT ^= 0xff;
for(i=999999;i>0;i--); P6OUT |= BIT7; P2OUT = 0xff;
P1DIR = 0xf0; //P1.0~P1.3 设置为输入状态, P1.4~P1.7 设置为 输出状态
P1OUT |= 0xf0; // P1.4~P1.7 输出高电平 num=0; }
Key_Event();
if(key_Fla g == 1) //按键已释放 {
key_Fla g = 0;
if((key_val==12)||(key_val==14)||(key_val==15)) //容错 {
fla g=1; alert();
for(j=0;j<4;j++) Dispbuf[j] = 10; j=0; }
if(key_val==11) //取消密码 {
fla g=1;
for(j=0;j<4;j++) Dispbuf[j] = 10; j=0; }
/*GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGGGGGGGG*/ if(fla g1==2) //改码 {
P2OUT ^= 0xff;
for(i = 2000; i > 0; i--); P2OUT = 0xff; //提示灯 a[j]=key_val; if(j==4) {
fla g=1; //??? fla g1=0;
for(j=0;j<4;j++) Dispbuf[j] = 10; j=0; } }
if(key_val==13) //改码的另一个条件 {
P2OUT ^= 0xff;
for(i = 2000; i > 0; i--); P2OUT = 0xff; //提示灯
fla g=1; fla g1+=1;
for(j=0;j<4;j++) Dispbuf[j] = 10; j=0;
} if(fla g1!=2)
fla g1=0; //若两条件不同时满足,则取消
/*GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGGGGGGGG*/ if(j==4) //验证密码 {
fla g=1;
if(key_val==10) {
if(a[0]==Dispbuf[0]) {
if(a[1]==Dispbuf[1]) {
if(a[2]==Dispbuf[2]) {
if(a[3]==Dispbuf[3]) {
P2OUT ^= 0xff;
for(i = 99999; i > 0; i--); P2OUT = 0xff;
fla g1=1; //改码的一个条件 num=0;
} else alert(); } else alert(); } else alert(); } else alert(); }
else alert(); for(j=0;j<4;j++) Dispbuf[j] = 10; j=0; }
if(fla g==0) {
Dispbuf[3-j] = key_val; //Dispbuf[]为一数组,用于存放键值 switch(3-j) {
case 2:x=Dispbuf[2];Dispbuf[2]=Dispbuf[3];Dispbuf[3]=x;break; case
1:x=Dispbuf[1];Dispbuf[1]=Dispbuf[2];Dispbuf[2]=Dispbuf[3];Dispbuf[3]=x;break; case
0:x=Dispbuf[0];Dispbuf[0]=Dispbuf[1];Dispbuf[1]=Dispbuf[2];Dispbuf[2]=Dispbuf [3];Dispbuf[3]=x;break; } j++; } else fla g=0;
P6OUT = 0; //蜂鸣器响一声 for(i = 2000; i > 0; i--); P6OUT |= BIT7; } } }
/******************************************* 函数名称:watchdog_timer
功能:看门狗中断服务函数,在这里输出数码管的 段选和位选信号 参数:无 返回值:无
********************************************/ #pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void) {
P5OUT = 0xff;
P4OUT = scandata[Dispbuf[cnt]]; //输出段选信号 P5OUT &= ~(1 << (cnt+2)); //输出位选信号 cnt++; //位计数变量在0~4 之间循环 if(cnt == 4) cnt = 0; }