课 程 设 计(论文)
课程名称 单 片 机
题目名称简易密码锁的设计
学 院 高等技术学院
专业班级 高 1 1 0 9
学 号 20113869
学生姓名 刘 欢
指导教师 胡 立 强
2013年 11月 28 日
目录
一, 任务目的………………………………………………………3
二, 任务要求………………………………………………………3
三, 电路与元器件…………………………………………………4
四, 程序设计………………………………………………………5
五, 程序运行测试…………………………………………………6
六, 任务小结………………………………………………………7
七, 心得体会………………………………………………………8
八, 参考文献………………………………………………………9
1.任务目的
通过对具有四个按键输入和一个数码管显示的简易密码锁的设计与制作,让读者理解C语言中数组的基本概念和应用技术,并初步了解单片机与键盘和LED数码管的接口电路设计及编程控制方法。
2.任务要求
在一些智能门控管理系统,需要输入正确的密码才能开锁。基于单片机控制的密码锁硬件电路包括三部分:按键、数码显示和电控开锁驱动电路,三者的对应关系如图表3.16所示。
表3.16 简易密码锁状态
简易密码锁的基本功能如下:4个按键,分别代表数字0,1,2,3:密码在程序中事先设定,为0-3之间的一个数字;上电复位后,密码锁初始状态为关闭,密码管显示符号“—”;当按下数字键后,若与事先设定的密码相同,则数码管显示字符“P”,打开锁,3秒后恢复锁定状态,等待下一次密码的输入,否则显示字符“E”持续3秒,保持锁定状态并等待下次输入。
3.电路与元器件
根据任务要求,用一位LED数码管作为显示器件,显示密码锁的状态信息,数码管采用静态连接方式;4个按键连接到P0口的低四位P0.0-P0.3引脚,设P0.0连接数字“0”按键、P0.1连接数字“1”按键,依次类推;锁的开、关电路用P3.0控制的一个发光二极管代替,发光二极管点亮表示锁打开,熄灭表示锁定。根据以上分析,采用如图3.21所示的连接电路。
图3.21 简易密码锁电路
简易密码锁电路所需元器件清单如表3.17所示。
4.程序设计
程序设计思路:主程序主要负责按键输入、密码比较判断与显示处理。设初始密码关闭,显示符号为“—”。当按下数字键后,若与预先设计的密码相同则显示“P”,打开锁,过3秒后恢复锁定状态,等待下一次密码输入;否则显示“E”持续3秒,保持锁定状态并等待下一次密码输入。
LED数码管采用共阳极显示方式,密码设定为“2”。
程序流程图如图3.22所示
图3.22 简易密码锁的程序流程图
程序如下
#include<reg51.h>
Sbit p3_0=p3^0;
void delay(unsigned int i);
void main()
{
unsigned char buttion;
unsigned char code tab[7]={0xc0,0xf9,0xa4,0xb0,0xbf,0x86,0x8c};
p0=0xff;
while(1){
p1=tab[4];
p3_0=1;
button=p0;
button&=0x0f;
switch (button)
{case 0x0e: p1=tab[0];delay(400);p1=tab[5];dealy(1200);break;
case 0x0d: p1=tab[1];delay(400);p1=tab[5];dealy(1200);break;
case 0x0b: p1=tab[2];delay(400);p1=tab[6];p3_0=0;dealy(1200);break;
case 0x07: p1=tab[3];delay(400);p1=tab[5];dealy(1200);break;
}
}
}
void delay(unsigned int i)
{
unsigned int k ;for(k=0;k<I;k++);
}
5.程序运行测试
(1)输入并编译源程序
(2)将程序下载到密码锁电路的单片机中
(3)接通电路板电源,观察初始显示符号“—”是否正确,锁是否关闭(发光二级管灭)。
(4)分别按下各数字键,根据LED数码管显示及二极管的亮灭,判断结果是否正确。
6.任务小结
本任务采用MSC51系列的单片机实现了简易密码锁功能。电路中使用了4个独立式按键
实现密码输入,用一个LED数码管显示密码锁的状态,让读者初步了解了单片机与键盘和数码显示管接口电路设计及编程控制方法。
在ex3_10.c程序中,使用了名为tab的无符号字符数组,定义如下:
Unsigned char code tab [7]={0xc9,0xf9,0xa4,0xb0,0xbf,0x86,0x8c};
该数组包含7个分量tab[0]、tab[1]…..tab[6],数组名为tab,表示数组的地址,即数组的第一个分量tab[0]所在的地址。在这个数组定义语句中,关键字“code”是为了把tab数组存储在片内程序存储器ROM中,该数组与程序代码一起固化在程序存储器中。
7.心得体会
单片机课程设计是的做的第三个课程设计,在设计过程中,遇到了很多困难,但最终我还是坚持了下来,虽然实现的功能有些单一,但是自己付出了努力,还是有些收获的首先通过这次课程设计,让我比较全面并且系统的回顾了有关单片机的知识,对于以前老师在讲课过程中听的似懂非懂的知识,进一步加深了理解。其次,对于自己已经了解和掌握的东西能够在实践中应用,把抽象的东西具体化。对于编程软件keil的应用也更加的熟练。在设计中,也有自己好多迷糊和不懂的东西,这些是在课堂上和书本中没有的,因此只好采用在图书馆查看资料和上网查询的方法把这些问题一一解决。但是由于时间有限,这次的设计最大的遗憾就是实现的功能太少了,本来是想加个
计数器密码错误输入三次就会出现报警,但是最终没有实现。不过并不可惜和遗憾,因为单片机课程设计的结束不是我学习单片机知识的结束,假期就要到了,这段时间我会花更多的时间和经历用在单片机上,争取学以致用。课程设计完成后,我最大的感受就是勤奋加上实践才能有所收获。
8,参考文献
[1] 王新颖、李贞主编《单片机原理及应用》北京大学出版社
[2]江志红主编《51单片机技术与应用系统开发案例精选》清华大学出版社
[3]陈权昌、李兴富主编《单片机原理及应用》华南理工大学出版社
第二篇:单片机课程设计之自动打铃系统
单片机课程设计之自动打铃系统
这是我们本学期的单片机课程设计题目,程序就是在昨天的数字钟的基础上增加了一些内容,不想继续做了,还有一门考试要复习。
设计一台自动打铃系统
一、设计任务
用单片机器件为主体,设计一台自动打铃系统。
(1)按照设计标准,画出系统框图和系统硬件电路图。
(2)完成该课题的程序设计,提交程序设计框图及程序设计清单。
(3)提交课程设计报告
二、设计要求
(一)基本要求
(1)基本计时和显示功能(用12小时制显示)。包括上下午标志,时、分的数字显示,秒信号指示。
(2)能设置当前时间(含上、下午,时,分)
(3)能实现基本打铃功能,规定:
上午6:00起床铃:打铃5秒、停2秒、再打铃5秒。
下午10:30熄灯铃:打铃5秒、停2秒、再打铃5秒。
铃声可用小喇叭播放,凡是用到铃声功能的均按此处理
(二)发挥部分
(1)增加整点报时功能,整点时响铃5秒,要求有控制启动和关闭功能。
(2)增加调整起床铃、熄灯铃时间的功能。
(3)增设上午4节课的上下课打铃功能,规定如下:
7.30 上课,8.20下课:8.30上课,9.20下课;9.40 上课,10.30下课;10.40上课,11.30下课;每次铃声5秒。
(4)特色和创新自选。
三、设计步骤
(1)设计能正常工作的一个单片机最小硬件系统,外围电路包括设置键盘,LCD或LED的显示屏;
(2)进行软件设计,利用单片机系统时钟先设计一个高精度的内部时钟系统,最小精确时间为期1秒;
(3)在秒计数器的基础上设计一个24小时时钟,并设计若干定时功能;
(4)设计打铃执行机构,完成自动打铃功能。
四、课程设计说明书要求
后面略......
公开我的主要设计资料:
主程序流程图:
汇编程序清单:
/***************************************************************
程序名称:51单片机自动打铃系统
简要说明:实现24小时制电子钟,8位数码管显示,显示时分秒
显示格式:23-59-59(小时十位如果为0则不显示)
到预定时间启动蜂鸣器模拟打铃,蜂鸣器BEEP:P3.7
打铃方式分起床、熄灯铃和上、下课铃两种
系统使用4只按键,3只按键用来调整时间,fpc连接器,防水连接器,连接器论坛,供应 http://www.ljqw.com/sell另一只为强制打铃按钮
调整选择键SET_KEY:P1.0;通过选择键选择调整位,选中位闪烁
增加键ADD_KEY:P1.1;按一次使选中位加1
减少键DEC_KEY;P1.2;按一次使选中位减1
如果长按ADD_KEY或DEC_KEY,识别后则进行调时快进,此时停止闪烁
如果选中位是秒,则按增加键或减少键都是将秒清零
强制打铃键DALING_KEY:P1.3;用来强制打铃或强制关闭铃声
P0口输出数码管段选信号,P2口输出数码管位选信号。晶振12M
编 写:JiangX.net
最后更新:09/1/2晚
***************************************************************/
BEEP EQU P3.7 ;定义蜂鸣器(电铃)控制信号输出口
ORG 0000H ;程序入口地址
LJMP START
ORG 000BH ;定时器0中断入口地址
LJMP TIMER_0
ORG 0300H
/*****程序开始,初始化*****/
START:
SETB BEEP ;关闭蜂鸣器(电铃)
SETB 48H ;使用一个bit位用于调时闪烁标志
SETB 47H ;使用一个bit位用于产生脉冲用于调时快进时基
CLR 45H ;关闭响铃方式1标志
CLR 44H ;关闭响铃方式2标志
MOV R1,#0 ;调整选择键功能标志:0正常走时、1调时、2调分、3调秒
MOV 20H,#00H ;用于控制秒基准时钟源的产生
MOV 21H,#00H ;清零秒寄存器
MOV 22H,#00H ;清零分寄存器
MOV 23H,#00H ;清零时寄存器
MOV 24H,#00H ;用于控制调时闪烁的基准时钟的产生
MOV IP,#02H ;IP,IE初始化
MOV IE,#82H
MOV TMOD,#01H ;设定定时器0工作方式1
MOV TH0,#3CH
MOV TL0,#0B0H ;赋定时初值,定时50ms
SETB TR0 ;启动定时器0
MOV SP,#40H ;重设堆栈指针
/*****主程序*****/
MAIN:
CJNE R1,#00H,MAIN1 ;是否为正常走时状态
LCALL BIJIAO1 ;调用起床、熄灯打铃比较子程序
LCALL BIJIAO2 ;调用上、下课打铃比较子程序
LCALL DALING1 ;调用响铃方式1执行子程序
LCALL DALING2 ;调用响铃方式2执行子程序
MAIN1:
LCALL DISPLAY ;调用显示子程序
LCALL KEY_SCAN ;调用按键检测子程序
JZ MAIN ;无键按下则返回重新循环
LCALL SET_KEY ;调用选择键处理子程序
JB 46H,MAIN ;如果已进行长按调整(调时快进),则不再执行下面的单步调整
LCALL ADD_KEY ;调用增加键处理子程序
LCALL DEC_KEY ;调用减少键处理子程序
LCALL DALING_KEY ;处理强制打铃/强制关闭铃声键
LJMP MAIN ;重新循环
/*****定时中断服务程序*****/
TIMER_0:
PUSH ACC
PUSH PSW ;保护现场
MOV TH0,#3CH
MOV TL0,#0B0H ;重新赋定时初值
CPL 47H ;产生脉冲用于调时快进时基
INC 24H
MOV A,24H
CJNE A,#10,ADD_TIME ;产生0.5秒基准时钟,用于调时闪烁
CPL 48H ;取反调时闪烁标志位
MOV 24H,#00H
ADD_TIME:
INC 20H
MOV A,20H
CJNE A,#20,RETI1 ;产生1秒基准时钟
MOV 20H,#00H ;一秒钟时间到,清零20H
MOV A,21H
ADD A,#01H
DA A ;作十进制调整
MOV 21H,A
CJNE A,#60H,RETI1
MOV 21H,#00H ;一分钟到
MOV A,22H
ADD A,#01H
DA A
MOV 22H,A
CJNE A,#60H,RETI1
MOV 22H,#00H ;一小时到
MOV A,23H
ADD A,#01H
DA A
MOV 23H,A
CJNE A,#24H,RETI1
MOV 23H,#00H ;到24点,清零小时
RETI1:
POP PSW
POP ACC ;恢复现场
RETI ;中断返回
/*****显示处理*****/
DISPLAY:
MOV A,21H ;秒
ANL A,#0FH
MOV 2FH,A ;转换出秒个位,存入2FH
MOV A,21H
ANL A,#0F0H
SWAP A
MOV 2EH,A ;转换出秒十位,存入2EH
JB 46H,MIN ;如果长按按键(调时快进),则跳过闪烁处理
CJNE R1,#3,MIN ;如果R1为3,闪烁秒位待调整
JB 48H,MIN
MOV 2FH,#0AH ;使该位为10,查表得到使该位不显示的输出
MOV 2EH,#0AH
MIN:
MOV A,22H ;分
ANL A,#0FH
MOV 2DH,A ;转换出分个位,存入2DH
MOV A,22H
ANL A,#0F0H
SWAP A
MOV 2CH,A ;转换出分十位,存入2CH
JB 46H,HOUR ;如果长按按键(调时快进),则跳过闪烁处理
CJNE R1,#2,HOUR ;如果R1为2,闪烁分位待调整
JB 48H,HOUR
MOV 2DH,#0AH ;使该位为10,查表得到使该位不显示的输出
MOV 2CH,#0AH
HOUR:
MOV A,23H ;时
ANL A,#0FH
MOV 2BH,A ;转换出时个位,存入2BH
MOV A,23H
ANL A,#0F0H
SWAP A
MOV 2AH,A ;转换出时十位,存入2AH
JB 46H,DISP ;如果长按按键(调时快进),则跳过闪烁处理
CJNE R1,#1,DISP ;如果R1为1,闪烁时位待调整
JB 48H,DISP
MOV 2BH,#0AH ;使该位为10,查表得到使该位不显示的输出
MOV 2AH,#0AH
/*****数码管动态扫描显示*****/
DISP:
MOV DPTR,#TABLE
MOV A,2FH
MOVC A,@A+DPTR
MOV P0,A
CLR P2.7
LCALL DELAY
SETB P2.7 ;显示秒个位
MOV A,2EH
MOVC A,@A+DPTR
MOV P0,A
CLR P2.6
LCALL DELAY
SETB P2.6 ;显示秒十位
MOV A,#0BFH
MOV P0,A
CLR P2.5
LCALL DELAY
SETB P2.5 ;显示“-”
MOV A,2DH
MOVC A,@A+DPTR
MOV P0,A
CLR P2.4
LCALL DELAY
SETB P2.4 ;显示分个位
MOV A,2CH
MOVC A,@A+DPTR
MOV P0,A
CLR P2.3
LCALL DELAY
SETB P2.3 ;显示分十位
MOV A,#0BFH
MOV P0,A
CLR P2.2
LCALL DELAY
SETB P2.2 ;显示“-”
MOV A,2BH
MOVC A,@A+DPTR
MOV P0,A
CLR P2.1
LCALL DELAY
SETB P2.1 ;显示时个位
MOV DPTR,#TABLE1 ;该位使用TABLE1以消除前置0
MOV A,2AH
MOVC A,@A+DPTR
MOV P0,A
CLR P2.0
LCALL DELAY
SETB P2.0 ;显示时十位
RET
/*****按键检测子程序*****/
KEY_SCAN:
CLR 46H ;关闭长按调整(调时快进)标志
MOV P1,#0FFH ;将P1口设置成输入状态
MOV A,P1
CPL A
ANL A,#0FH ;P1口低4位连接4个按键,只判断该4位
JZ EXIT_KEY ;无键按下则返回
LCALL DELAY ;延时去抖动
MOV A,P1 ;重新判断
CPL A
ANL A,#0FH
JZ EXIT_KEY ;键盘去抖动
MOV R5,A ;临时将键值存入R5
MOV R4,#00H ;用于控制调时快进速度
;设置为00H是为了在进入长按处理前加长延时区分用户的长按与短按,防止误快进
LOOP: ;进入长按处理
LCALL DISPLAY ;使长按时显示正常
MOV A,P1
CPL A
ANL A,#0FH
JB 47H,LOOP1
INC R4 ;调时快进间隔时间基准加1
LOOP1:
CJNE R1,#03H,LOOP2 ;如果调秒时长按,则不处理
LJMP LOOP3
LOOP2:
CJNE R4,#99H,LOOP3
MOV R4,#70H ;确认用户长按后,重新设定起始值,加快调时快进速度
SETB 46H ;长按调整(调时快进)标志
LCALL ADD_KEY
LCALL DEC_KEY
LOOP3:
JNZ LOOP ;等待键释放
MOV A,R5 ;输出键值
RET
EXIT_KEY:
RET
/*****延时子程序*****/
DELAY:
MOV R7,#150
DJNZ R7,$
RET
/*****选择键处理子程序*****/
SET_KEY:
CJNE R5,#01H,EXIT ;选择键键值
INC R1 ;调整选择功能标志加一
SETB BEEP
CJNE R1,#4,EXIT
MOV R1,#0
MOV 24H,#00H ;调时闪烁基准清零
RET
/*****增加键处理子程序*****/
ADD_KEY:
CJNE R5,#02H,EXIT ;增加键键值
CJNE R1,#01H,NEXT1 ;选择键功能标志为1,调时,否则跳出
MOV A,23H
ADD A,#01H
DA A
MOV 23H,A
CJNE A,#24H,EXIT
MOV 23H,#00H
NEXT1:
CJNE R1,#02H,NEXT2 ;选择键功能标志为2,调分,否则跳出
MOV A,22H
ADD A,#01H
DA A
MOV 22H,A
CJNE A,#60H,EXIT
MOV 22H,#00H
NEXT2:
CJNE R1,#03H,EXIT ;选择键功能标志为3,调秒,否则跳出
MOV 21H,#00H ;如增加键按下直接清零秒
RET
/*****减少键处理子程序*****/
DEC_KEY:
CJNE R5,#04H,EXIT ;减少键键值
CJNE R1,#01H,NEXT3 ;选择键功能标志为1,调时,否则跳出
MOV A,23H
ADD A,#99H
DA A
MOV 23H,A
CJNE A,#99H,EXIT
MOV 23H,#23H
NEXT3:
CJNE R1,#02H,NEXT4 ;选择键功能标志为2,调分,否则跳出
MOV A,22H
ADD A,#99H
DA A
MOV 22H,A
CJNE A,#99H,EXIT
MOV 22H,#59H
NEXT4:
CJNE R1,#03H,EXIT ;选择键功能标志为3,调秒,否则跳出
MOV 21H,#00H ;如较少键按下直接清零秒
RET
/*****强制响铃键处理子程序*****/
DALING_KEY:
CJNE R5,#08H,EXIT ;选择键键值
CPL BEEP
RET
/*****万用返回程序*****/
EXIT:
RET
/*****数码管字形编码表*****/
TABLE:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH ;字形显示编码
TABLE1:
DB 0FFH,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH ;小时位的十位数编码,该位如果为0则不显示
/*****打铃时间对比程序(起床、熄灯)*****/
BIJIAO1:
MOV A,23H
CJNE A,#06H,B0
MOV A,22H
CJNE A,#00H,B0 ;6:00到
SETB 45H ;开启响铃方式1
RET
B0: MOV A,23H
CJNE A,#22H,EXIT_1
MOV A,22H
CJNE A,#30H,EXIT_1 ;22:30到
SETB 45H ;开启响铃方式1
RET
EXIT_1:
CLR 45H
RET
/*****打铃时间对比程序(上、下课)*****/
BIJIAO2:
MOV A,23H
CJNE A,#07H,B1
MOV A,22H
CJNE A,#30H,B1 ;7:30
SETB 44H ;开启响铃方式2
RET
B1: MOV A,23H
CJNE A,#08H,B2
MOV A,22H
CJNE A,#20H,B2 ;8:20
SETB 44H
RET
B2: MOV A,23H
CJNE A,#08H,B3
MOV A,22H
CJNE A,#30H,B3 ;8:30
SETB 44H
RET
B3: MOV A,23H
CJNE A,#09H,B4
MOV A,22H
CJNE A,#20H,B4 ;9:20
SETB 44H
RET
B4: MOV A,23H
CJNE A,#09H,B5
MOV A,22H
CJNE A,#40H,B5 ;9:40
SETB 44H
RET
B5: MOV A,23H
CJNE A,#10H,B6
MOV A,22H
CJNE A,#30H,B6 ;10:30
SETB 44H
RET
B6: MOV A,23H
CJNE A,#10H,B7
MOV A,22H
CJNE A,#40H,B7 ;10:40
SETB 44H
RET
B7: MOV A,23H
CJNE A,#11H,EXIT_2
MOV A,22H
CJNE A,#30H,EXIT_2 ;11:30
SETB 44H
RET
EXIT_2:
CLR 44H
RET
/*****响铃方式1程序(响5秒停2秒再响5秒)*****/
DALING1:
JNB 45H,EXIT_DALING
MOV A,21H ;响铃起始时间由秒实时控制
CJNE A,#00H,L1
CLR BEEP
L1:
MOV A,21H
CJNE A,#05H,L2
SETB BEEP
L2:
CJNE A,#07H,L3
CLR BEEP
L3:
CJNE A,#12H,EXIT_DALING
SETB BEEP
RET
/*****响铃方式2程序(响5秒)*****/
DALING2:
JNB 44H,EXIT_DALING
MOV A,21H ;响铃起始时间由秒实时控制
CJNE A,#00H,L4
CLR BEEP
L4:
MOV A,21H
CJNE A,#05H,EXIT_DALING
SETB BEEP
RET
EXIT_DALING:
RET
END ;程序结束