当前位置:文档之家› 单片机课程设计报告书模板

单片机课程设计报告书模板

. .. . .. ..西南科技大学2011级微机原理与接口技术课程设计报告课题名称微机原理与接口技术姓名学号院、系、部制造科学与工程学院专业指导教师2014年月日目录一、绪言 (1)二、系统设计 (1)2.1系统整体流程图 (1)2.2日历时钟的控制方案论证 (1)2.3单片机的选择方案论证 (2)2.4键盘选择方案论证 (2)2.5显示模块的选择方案论证 (2)2.6模块的选择方案论证 (2)三、硬件电路设计 (2)3.1日历时钟的控制电路图 (2)3.2行列式键盘的设计 (3)3.3数码管显示电路的设计 (3)3.4蜂鸣器驱动电路的设计 (4)3.5主要元器件选择 (4)四、程序流程图 (5)五、c语言程序设计 (5)六、日历时钟的控制器仿真 (19)6.1K e i l调试 (19)6.2P r o t e u s调试 (19)七、结束语 (20)八、参考文献 (21)1、绪言近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月异更新。

在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。

电子时钟是现代社会中的主要计时工具之一,广泛应用于手机,电脑,汽车等社会生活需要的各个方面,及对时间有要求的场合。

本设计采用AT89C51单片机作为主要核心部件,附以上电复位电路,时钟电路及按键调时电路组成。

数字钟已成为人们日常生活中:必不可少的必需品,广泛用于个人家庭以及车站、码头、剧场、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。

由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。

2、系统设计2.1 设计任务1、利用MCS-51内部定时器定时,编程实现年、月、日、时、分、秒的显示,显示格式为:年月日:10-06-18时分秒:09-12-35也可自行设定显示格式,两部分可按键切换显示;2、能按键调整日期、时间的数值;3、可设定时间报警,报警的时间至少有2个,报警时应有报警指示。

4、要求至少调试出任务的前两项。

2.2 方案比较与论证2.2.1 系统整体流程图2.2.2用4*3的行列式键盘组成0-9数字键及确认键、删除键,从矩阵键盘输入8位数密码,起始密码由程序设定,输入完后按确定键开锁,取消键清除所有输入。

用8位数码管组成显示电路提示信息,当输入密码时,只显示“-”,当密码位输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则开锁,此处用LED发光二极管亮一秒钟做为提示。

当密码不正确时,禁止按键输入3秒,同时启动蜂鸣器发出“嘀、嘀”报警声。

2.2.3 单片机的选择方案论证方案一:采用可编程逻辑期间CPLD 作为控制器。

CPLD可以实现各种复杂的逻辑功能、规模大、密度高、体积小、稳定性高、IO资源丰富、易于进行功能扩展。

采用并行的输入输出方式,提高了系统的处理速度,适合作为大规模控制系统的控制核心。

但本系统不需要复杂的逻辑功能,对数据的处理速度的要求也不是非常高,且从使用及经济的角度考虑我们放弃了此方案方案二:采用Atmel公司的AT89S52单片机作为控制器。

AT89S52是一个低功耗,高性能的51内核的CMOS 8位单片机,片内含8k空间的可反复擦些1000次的Flash只读存储器,具有256 bytes的随机存取数据存储器(RAM),32个IO口,2个16位可编程定时计数器。

综合考虑,选择方案二,采用Atmel公司的AT89S52单片机作为控制器。

2.2.4 键盘选择方案论证方案一:采用独立式键盘。

由于各键相互独立,每个按键各接一根输入线,通过检测输入线的电平状态可以很容易的判断哪个按键被按下。

此种键盘适用于按键较少或操作速度较高的场合。

但本题发挥部分要求12个功能键,按键数目较多,这就需要较多的输入口线,而且电路结构复杂。

故此方案不可取。

方案二:采用行列式键盘。

它由行线和列线组成,按键位于行列的交叉点上,行线信号和列线信号分别通过两个接口和CPU相连,通过行列扫描法判定按键的位置,此方案适用于按键较多的场合。

通过对电子密码锁题目的分析,采用4*3行列式键盘。

2.2.5 显示模块的选择方案论证方案一:采用带字库LCD模块显示。

能显示复杂的信息,具有质量轻,体积小,功耗低,指令功能强,接口简单,可靠性强等优点,显示内容丰富,图形美观,易于人机交流。

但是价格昂贵。

方案二:采用LED数码管显示。

数码管能显示数字和符号,但是占用IO口资源较多,对于简单的电路可以选用此方案。

电子密码锁,电路简单,选用方案二,显示所需信息。

2.2.6 模块的选择方案论证当输入密码时,若密码正确,则开锁,此处用LED发光二极管亮一秒钟做为提示。

当密码不正确时,禁止按键输入3秒,同时发出“嘀、嘀”报警声,为实现此功能我们选用LED 发光二极管和蜂鸣器混合使用。

3 硬件电路设计3.1 电子密码锁控制电路图图2 电子密码锁控制线路图3.2 行列式式键盘的设计键盘电路如图3所示。

设计数字键0~9 的键号依次为0~9,取消键的键号为10,确认键的键号为11,键号可按键值=行首键号(0、4、8、12)+列键号(0、1、2、3)公式计算。

图3 键盘电路3.3 数码管显示电路的设计数码管驱动采用8 个共阴极数码管显示,由于单片机的驱动能力有限,采用74LC245 作为数码管的驱动,在7 段码输出线上串联100 欧姆电阻起限流作用。

其电路如图3所示。

图4 数码管显示电路3.4 蜂鸣器驱动电路的设计蜂鸣器的驱动采用NPN 三极管2484 来驱动,低电平有效。

其电路如图5 所示。

图5 蜂鸣器电路图3.5 主要元器件选择主要元器件选用型号和数量如表1所示:表1 主要元器件清单4 程序流程图时间程序流程图5 C语言程序设计程序清单:设置变量缓冲区SEC EQU 30HMIN EQU 31HHOUR EQU 32HDAY EQU 33HMON EQU 34HYEAR EQU 35H;************************************************************************* ORG 0000HLJMP MAINORG 000BHLJMP INT_T0ORG 0030HMAIN: LCALL CHUSHIMOV TMOD,#01HMOV TH0,#4CHMOV TL0,#00HMOV IE,#82HSETB TR0 ;开启定时器T0MOV 50h,#00H ;启用定时器T0的初始值MOV 37H,#0 ;显示日期和时间的标志MOV 38H,#0 ;12进制和24进制的标志MOV 39H,#23 ;默认时间为24进制CLR F0 ;日历定时0和1的标志LOOP: MOV A,37HJZ SHIJIANMOV R1,#33HLJMP BEGIN1SHIJIAN:MOV R1,#30H ;初始化显示BEGIN1: M OV A,38HJZ JZ24MOV 39H,#11LJMP BEGIN2JZ24: MOV 39H,#23BEGIN2: L CALL DISPLAYLCALL KEY ;扫描键盘CJNE A,#05H,DINGS ;判断键值是否为5号键LCALL DY1MS ;若是,则实现调整LCALL TIAOTLCALL TIAOTLCALL DISPLAYLJMP DOWNDINGS: CJNE A,#06H,QIEH ;判断键值是否为6号键,定时LCALL DY1MS ;若是,则实现调整CPL F0JNB F0,DI0 ;F0=0,定时器0LCALL DISHI1 ;F0=1,定时器1LCALL DISPLAYLJMP DOWNDI0: L CALL DISHI0LCALL DISPLAYLJMP DOWNQIEH: CJNE A,#07H,BIANH ;判断键值是否为7号键,切换LCALL DY1MS ;若是,则切换显示,年月日与时分秒切换LCALL DISPLAYMOV A,37HCPL AMOV 37H,ALJMP DOWNBIANH: CJNE A,#08H,DOWN ;判断是否为八号键,变换进制LCALL DY1MSLCALL DISPLAYMOV A,38HCPL AMOV 38H,ADOWN: LJMP loop;调整子程序********************************************************************** TIAOT: push accCLR P SW.1 ;初始化标志位TOP1: LCALL KEY ;扫描键盘CJNE A,#08H,PANFAN ;判断键值是否为8号键,不是8键,则继续判断CPL PSW.1 ;取反标志位JB PSW.1,TC ;标志位为1,调整时间change0LCALL CHG1 ;标志位为0,调整日期change1LCALL DISPLAYLJMP TOP1TC: CLR TR0LCALL CHG0LCALL DISPLAYPANFAN: CJNE A,#5,TOP1pop accRET;调整时间子程序****************************************************************** CHG0: MOV R1,#30HLCALL DISPLAYLCALL KEYS: CJNE A,#01H,M ;判断键值,是否为1号键MOV R0,#SEC ;键值为01,即1号键调整秒MOV A,R0 ;进制CJNE A,#59,L0 ;判断秒是否为59MOV SEC,#00 ;若是,秒清零LCALL DISPLAYLJMP CHG0L0: INC AMOV R0,ALCALL DISPLAYLJMP CHG0M: CJNE A,#02H,H ;判断键值,是否为02HMOV R0,#MIN ;若是,即2号键,则调整分钟MOV A,R0CJNE A,#59,L2 ;判断分是否为59MOV MIN,#00 ;若是,分钟清零LCALL DISPLAYLJMP CHG0L2: INC AMOV R0,ALCALL DISPLAYLJMP CHG0H: CJNE A,#03H,K ;判断键值,是否为03H MOV R0,#HOUR ;键值为03,即3号键调整小时MOV A,R0CJNE A,39H,L4 ;判断小时是否为23MOV HOUR,#00LCALL DISPLAYLJMP CHG0L4: INC AMOV R0,ALCALL DISPLAYLJMP CHG0K: CJNE A,#04H,CHG0SETB TR0RET;调整日期********************************************************************** CHG1: MOV R1,#33HLCALL DISPLAYLCALL KEYR: CJNE A,#01H,Y ;判断键值,是否为1HMOV R0,#DAY ;键值为01,调整日期MOV A,R0 ;进制CJNE A,#31,B0 ;判断30MOV DAY,#00LCALL DISPLAYLJMP CHG1B0: INC AMOV R0,ALCALL DISPLAYLJMP CHG1Y: CJNE A,#02H,N ;判断键值,是否为2MOV R0,#MONMOV A,R0CJNE A,#12,B1 ;判断月是否12MOV MON,#00LCALL DISPLAYLJMP CHG1B1: INC AMOV R0,ALCALL DISPLAYLJMP CHG1N: CJNE A,#03H,K1 ;判断键值,是否为FBMOV R0,#YEAR ;键值为3,调整年MOV A,R0CJNE A,#99,B2MOV YEAR,#0LCALL DISPLAYLJMP CHG1B2: INC AMOV R0,ALCALL DISPLAYLJMP CHG1K1: CJNE A,#04H,CHG1RET;第一次定时子程序***************************************************************** DISHI0: MOV 40H,SEC ;保存原值MOV 41H,MINMOV 42H,HOURLCALL CHG0 ;调用调整子程序MOV 43H,SECMOV 44H,MINMOV 45H,HOURLCALL DIRET;第二次定时子程序***************************************************************** DISHI1: MOV 40H,SECMOV 41H,MINMOV 42H,HOURLCALL CHG0MOV 46H,SECMOV 47H,MINMOV 48H,HOURLCALL DIRETDI: MOV SEC,40H ;恢复原值MOV MIN,41HMOV HOUR,42HLCALL DISPLAYRET;定时器T0子程序******************************************************************* INT_T0: INC 50hmov r5,50hCJNE R5,#20,DUAN11 ;判断是否到一秒LJMP DUAN12DUAN11: LJMP NEXT0DUAN12: MOV 50h,#0 ;若是,则重新初始化循环次数MOV A,SECCJNE A,#59,DUAN21 ;判断秒是否为59LJMP DUAN22DUAN21: LJMP N0DUAN22: MOV SEC,#00 ;若是则秒清零lcall displayMOV A,MINCJNE A,#59,DUAN31 ;判断分钟是否为59LJMP DUAN32DUAN31: LJMP N1DUAN32: MOV MIN,#00 ;若是,则分钟清零lcall displayMOV A,HOURCJNE A,39H,DUAN41 ;判断小时是否23LJMP DUAN42DUAN41: LJMP N2DUAN42: MOV HOUR,#00 ;若是,小时清零lcall displayMOV A,DAYPUSH ACCMOV A,MONCJNE A,#1,YUE3POP ACCLJMP RR2YUE3: CJNE A,#3,YUE5 ;1,3,5,7,8,10,12月31天POP ACCLJMP RR2YUE5: CJNE A,#5,YUE7POP ACCLJMP RR2YUE7: CJNE A,#7,YUE8POP ACCLJMP RR2YUE8: CJNE A,#8,YUE10POP ACCLJMP RR2YUE10: CJNE A,#10,YUE12POP ACCLJMP RR2YUE12: CJNE A,#12,YUE4POP ACCLJMP RR2YUE4: CJNE A,#4,YUE6 ;4,6,9,11月30天LJMP RR1YUE6: CJNE A,#6,YUE9POP ACCLJMP RR1YUE9: CJNE A,#9,YUE11POP ACCLJMP RR1YUE11: CJNE A,#11,YUE2POP ACCLJMP RR1YUE2: MOV A,YEAR ;2月:是闰年29天,是平年28天MOV B,#4DIV ABMOV A,BJZ RYUEPYUE: POP ACCLJMP RR00RYUE: POP ACCLJMP RR01RR00: CJNE A,#28,N3MOV DAY,#1LCALL DISPLAYRR01: CJNE A,#29,N3MOV DAY,#1LCALL DISPLAYLJMP RR3RR1: CJNE A,#30,N3MOV DAY,#1LCALL DISPLAYLJMP RR3RR2: CJNE A,#31,N3MOV DAY,#1LCALL DISPLAYLJMP RR3RR3: MOV A,MONCJNE A,#12,N4 ;判断月份是否为11MOV MON,#1 ;若是,则月份清零lcall displayMOV A,YEAR ;年份加一CJNE A,#99,N5MOV YEAR,#0lcall displayLJMP NEXT0N0: INC A ;否则,秒加一lcall displayLCALL DFGLJMP NEXT0N1: INC A ;分钟加一MOV MIN,Alcall displayLCALL DFGLJMP NEXT0N2: INC A ;小时加一MOV HOUR,Alcall displayLCALL DFGLJMP NEXT0N3: INC A ;日期加一MOV DAY,Alcall displayLJMP NEXT0N4: INC A ;月份加一MOV MON,Alcall displayLJMP NEXT0N5: INC ANEXT0: MOV TH0,#4CHMOV TL0,#00HRETI;判断是否到定时时间子程序******************************************************* DFG: MOV A,SEC ;判断是否到第一个定时时间CJNE A,43H,DOWN1MOV A,MINCJNE A,44H,DOWN1MOV A,HOURCJNE A,45H,DOWN1CLR P3.6 ;若到第一个定时时间,则亮灯DOWN1: MOV A,SEC ;判断是否到第二个定时时间CJNE A,46H,DOWN2MOV A,MINCJNE A,47H,DOWN2MOV A,HOURCJNE A,48H,DOWN2CLR P3.6 ;若到第二个定时时间,则亮灯DOWN2: LCALL KEYLCALL DY1MS ;扫描键盘CJNE A,#04H,DO ;若键值为4号键,则灭灯RET;延时1ms ********************************************************************** DY1MS: MOV R5,#0FAHLOOP7: NOPNOPDJNZ R5,LOOP7RET;初始化CHUSHI****************************************************************** CHUSHI: MOV SEC,#0MOV MIN,#0MOV HOUR,#0MOV DAY,#26MOV MON,#1MOV YEAR,#11RET;子程序KSI :判定有无闭合键的************************************************* KSI: MOV A, #00HMOV P1, A ;P2口送00HLCALL DY1MSMOV A,P3CPL ARET;键盘扫描********************************************************************** key: LCALL KSI ;检查是否有键闭合JNZ LK1LJMP END1LK1: LCALL DY1MSLCALL KSI ;再检查是否有键闭合JNZ LK2 ;有键闭合转移到LK2LJMP END1 ;无键闭合,延时12ms后转KEY1LK2: MOV A,#0FEHMOV P1,AMOV R3,AMOV R4,#00HLK4: MOV A,P3JB ACC.0, LONE ;ACC.3=1,第一列无键闭合,转LONEMOV A, #01HlJMP LKPLONE: JB ACC.1, NEXT ;ACC.2=1,第二列无键闭合,转LTWO MOV A, #05HlJMP LKPLKP: ADD A, R4 ;计算键码PUSH ACC ;保护键码lCALL KSI ;检查是否继续闭合,若闭合再延时JNZ LK3POP ACC ;若键起,则键码送ARETNEXT: INC R4MOV A,R3JNB ACC.3,END1RL AMOV R3,AMOV P1,AlJMP LK4 ;进行下一列扫描END1: RET;显示子程序******************************************************************** DISPLAY: push accMOV R3,#03HMOV R2,#0FEHDISLOOP: MOV A,R2MOV P2,AMOV A,R1MOV B,#10DIV ABMOV 36h,AMOV DPTR,#KEYBOARD MOVC A,A+DPTRMOV P0,A ;显示低位LCALL DY1MSMOV A,R2RL AMOV R2,AMOV P2,AMOV A,36hMOV DPTR,#KEYBOARD MOVC A,A+DPTRMOV P0,A ;显示高位LCALL DY1MSMOV A,R2RL AJNB ACC.0,EXITMOV R2,AMOV P2,AMOV A,#10MOV DPTR,#KEYBOARD MOVC A,A+DPTRMOV P0,AMOV A,R2RL AMOV R2,AINC R1DJNZ R3,DISLOOPEXIT: pop accRET;断码值*********************************************************************** KEYBOARD: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFHEND}6 电子密码锁控制器仿真在完成了电子密码锁硬件设计和软件设计以后,便进入系统的调试阶段。

相关主题