《十字路口红绿灯单片机课程设计.doc》由会员分享,可在线阅读,更多相关《十字路口红绿灯单片机课程设计.doc(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、黄河科技学院课程设计任务书 工 学院 机械 系 机械设计制造及其自动化 专业 10 级 班学号 姓名 指导教师 题目: 彩灯控制器的设计 课程: 单片机课程设计 课程设计时间 2013年 10月28日 至2013年11 月 10 日 共 2 周一、设计要求:利用AT89C51单片机的4位数字加法计算器,能进行加减运算。 创新要求:功能键能清零、超出位数光报警提示、违规操作声报警二、设计方案分析: 采用44键盘,键盘定义十个数字键,六个功能键,使用串行动态显示显示运算结果。主程序进行初始化,采用行列扫描进行查表得出键值,每次按键后调用显示子程序。主要单元电路的设计 复位电路 复位电路采用上电复位
2、与手动复位相结合的方案。上电复位时,上电瞬间RST端的电位与VCC相同,即为高电平,随着充电电流的减小,RST端的电位逐渐下降。只要高电平保持时间足够长,就可以使AT89C52有效地复位。手动复位时,按下复位按钮,电容C1通过R2电阻迅速放电,使RST端迅速变为高电平,复位按钮松开后,电容通过R和内部下拉电阻放电,逐渐使RST端恢复为低电平。电路如图所示 晶振电路 晶振电路是单片机的心脏,它用于产生单片机工作所需要的时钟信号,晶振电路给数字钟提供一个频率稳定准确的方波信号,可保证数字钟的走时准确及稳定,晶振电路如图 键盘电路的设计 键盘可分为两类:编码键盘和非编码键盘。编码键盘是较多按键(20
3、个以上)和专用驱动芯片的组合,当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。通用计算机使用的标准键盘就是编码键盘。当系统功能比较复杂,按键数量很多时,采用编码键盘可以简化软件设计。但大多数智能仪器和电子产品的按键数目都不太多(20个以内),为了降低成本和简化电路通常采用非编码键盘。非编码键盘的接口电路有设计者根据需要自行决定,按键信息通过接口软件来获取。本课题需要的是16个按键,故选择用非编码键盘。计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种
4、方式,而是采用矩阵键盘的方案。矩阵键盘采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为44个。这种行列式键盘结构能有效地提高单片机系统中I/O 口的利用率。建立键码值,建立键值码表TABLE如下:0CH 08H 04H 00H0DH 09H 05H 01H0EH 0AH 06H 02H0FH 0BH 07H 03H对应的键盘按键为: 8 4 0 9 5 1= + 6 2功能 7 3 报警电路 当超出位数时,调用喇叭程序,信号通过三极管放大后驱动扬声器,发出相应的声音。如图所示三、 硬件电路设计图用P1.0P1.3作为行
5、扫描输出,P1.4P1.7作为列扫描输入,P0.0P0.3作为键值码输出送出译码器7447,7447是美国仙童公司生产的BCD码到7段数码管的译码器驱动芯片。它负责将4位BCD码十进制数转换成对应的7段数码管信号,送到数码管的7位段选输入端。译出的显示码送入数码管的段驱,P0.4P0.6控制译码器74LS138,74LS138译码器负责数码管显示扫描时依次通过译码选中数码管中,译码输出控制数码管的位驱。电路图如下图所示:四、 软件部分设计程序工作过程如下:(1)首先赋予显示缓冲初始值00,并把数据存储单元清零。(2)主程序调用键盘扫描子程序,判断键值,是数字第一次直接赋予34H单元,如是第二次
6、输入数字,则把第一次值乘十后与第二次值相加,结果存储到33H单元,如是第三次输入数字,则把前两次值乘十后与第三次值相加,结果存储到32H单元,在等待运算符号的按下,按下等于号就直接计算并显示,如加减乘除就运算后把按键次数清零,表示可以输入下一操作数,与第一次相同,并等待等于键按下。清零键则不管在任何情况下都清零,相当于软复位。(3)在扫描完键盘后,调用数据显示转换子程序把值转换为七段码。(4)调用数码管动态显示子程序,显示数值,重新循环。系统总流程图主程序主要是用来进行初始化的,调用其他子程序,清空各个标志位,清空缓存区,读取键码,判断功能,在LED上作出回应。(1)数字送显示缓冲程序设计简易
7、计算器所显示的数值最大位四位。要显示数值,先判断数值大小和位数,如果是超过四位,将不显示数字,并调用喇叭程序提示错误。可重新输入数字,再次计算。(2)运算程序的设计判断按键存入内存单元Y将第一次输入的数字10+第二次输入的数字Y N是否是数字键扫描键盘 有输入则计算键值计算结果并送内存单元调用显示子程序显示结果是否是清零YN等待输入等号开始是否第一次输入数字N首先初始化参数,送LED三位显示“0”,其它位不显示。然后扫描键盘看是否有键输入,若有,读取键码。判断键码是数字键、清零键还是功能键,是数值键则送LED显示并保存数值,是清零键则做清零处理,是功能键则又判断是“=”还是运算键,若是“=”则
8、计算最后结果并送LED显示,若是运算键则保存相对运算程序的首地址。流程图五、 调试与仿真下面用KEIL uVision3与 proteus仿真软件介绍十进制加法计算器的仿真与调试。Keil C51单片机软件开发系统(一) 系统的整体结构C51工具包的整体结构中,其中uVision是C51 for Windows的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。A
9、BS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。(二) 采用KEIL 开发的89c51单片机应用程序步骤:1. 在uVision 集成开发环境中创建新项目(Project),扩展文件名为.UV2,并为该项目选定合适的单片机CPU器件(本设计采用ATMEL 公司下的AT89C51) 2. 用uVision 的文本编辑器编写源文件,可以是汇编文件(.ASM),也可以使C语言文件(扩展名.C),并将该文件添加到项目中去。一个项目文件可以包含多个文件,除了源程序文件
10、外,还可以是库文件、头文件或文本说明文件。 3. 通过uVision 3 的相关选择项,配置编译环境、连接定位器以及Debug调试器的功能。 4. 对项目中的源文件进行编译连接,生成绝对目标代码和可选的HEX文件,如果出现编译连接错误则返回到第2步,修改源文件中的错误后重构整个项目。 5. 对没有语法错误的程序进行仿真调试,调试成功后将HEX文件写入到单片机应用系统的ROM中。 proteus的操作 (一)硬件电路图的接法操作 1.放置选择(删除)元器件2.移动元器件3.缩放视图4.连接导线5.仿真,调试 (二) 单片机系统PROTEUS设计与仿真过程Proteus强大的单片机系统设计与仿真功
11、能,使它可成为单片机系统应用开发和改进手段之一。全部过程都是在计算机上通过Proteus来完成的。其过程一般也可分为三步:1.在ISIS平台上进行单片机系统电路设计、选择元器件、接插件、连接电路和电气检测等,简称Proteus电路设计。2.在Keil平台上进行单片机系统程序设计、编辑、汇编编译、代码级调试,最后生成目标代码文件(*.hex)。简称Proteus源程序设计和生成目标代码文件。3.在ISIS平台上将目标代码文件加载到单片机系统中,并实现单片机系统的实时交互、协同仿真。它在相当程度上反映了实际单片机系统的运行情况。简称Proteus仿真。(三) Proteus中课程设计的仿真结果在P
12、roteus中将硬件电路全部接好以后,将Keil中生成的.hex文件导入到单片机中,点击开始仿真按钮,电路开始仿真。可以观察到:数码管显示“000”;分别依次按下按键“5”、“+”、“6”和“=”,可以看到数码管显示“11”;也可以分别调试其它功能键,结果发现调试结果与预期的理论值相吻合,即本次课设已成功。(四) 程序清单:JG EQU50H ;结果存放JG1 EQU51H ;中间结果存放GONG EQU52H ;功能键存放ORG 0000HSTART:MOV R4,#06H MOV GONG,#0 MOV R0,#31HCLEAR: MOV R0,#00H INC R0 DJNZ R4,CL
13、EAR ;清除31H34H地址单元的内容MLOOP:CALL DISP ;调显示子程序WAIT:CALL TESTKEY ;判断有无按键JZ WAIT CALL GETKEY ;读键INC R3 ;按键个数CJNE A,#0,NEXT1 ;判断是否数字键LJMP E1 ;转数字键处理NEXT1:CJNE A,#1,NEXT2LJMP E1NEXT2:CJNE A,#2,NEXT3LJMP E1NEXT3:CJNE A,#3,NEXT4LJMP E1NEXT4:CJNE A,#4,NEXT5LJMP E1NEXT5:CJNE A,#5,NEXT6LJMP E1NEXT6:CJNE A,#6,NE
14、XT7LJMP E1NEXT7:CJNE A,#7,NEXT8LJMP E1NEXT8:CJNE A,#8,NEXT9LJMP E1NEXT9:CJNE A,#9,NEXT10LJMP E1NEXT10:CJNE A,#0AH,NEXT11 ;判断是否功能键LJMP E2 ;转功能键处理NEXT11:CJNE A,#0BH,NEXT12LJMP E2NEXT12:CJNE A,#0CH, NEXT13LJMP E2NEXT13:CJNE A,#0DH,NEXT14LJMP E2NEXT14:CJNE A,#0EH,NEXT16LJMP E2NEXT15:LJMP E3 ;判断是否清除键E1:C
15、JNE R3,#1,N1 ;判断第几次按键LJMP E11 ;为第一个数字N1:CJNE R3,#2,N2LJMP E12 ;为第二个数字N2:CJNE R3,#3,N3 LJMP E13 ;为第三个数字N3:CJNE R3,#4,N4 LJMP E13 ;为第四个数字N4:LCALL ERROR ;调用错误警示喇叭程序 LJMP E3 ;第五个数字转溢出 E11:MOV R4,A ;输入值暂存R4MOV 34H,A ;输入值送显示缓存MOV 33H,#00HMOV 32H,#00HLJMP MLOOP ;等待再次输入E12: MOV R7,A ;个位数暂存R7MOV B,#10MOV A,R
16、4MUL AB ;十位数ADDA,R7MOV R4,A ;输入值存R4MOV 32H,#00H ;输入值送显示缓存MOV 33H,34HMOV 34H,R7LJMP MLOOPE13:MOV R7,AMOV B,#10MOV A,R4MUL ABJB OV,E3 ;输入溢出ADD A,R7JB CY,E3 ;输入溢出MOV R4,AMOV 32H,33H;输入值送显示缓存MOV 33H,34HMOV 34H,R7LJMP MLOOPE3:MOV R3,#0 ;按键次数清零MOV R4,#0 ;输入值清零MOV JG,#0 ;计算结果清零MOV GONG,#0 ;功能键设为零 MOV 32H,#
17、00H;显示清空MOV 33H,#00HMOV 34H,#00HLJMP MLOOPE2:MOV 34H,#00HMOV 33H,#00HMOV 32H,#00HMOV R0,GONG ;与上次功能键交换MOV GONG,AMOV A,R0CJNE A,#10,N21 ;判断功能键LJMP JIA ;N21: CJNE A,#11,N22LJMP JIAN ;N22: CJNE A,#12,N23LJMP CHENG ;*N23:CJNE A,#13,N24LJMP CHU ;/N24:CJNE A,#0,N25LJMP FIRST ;首次按功能键N25:LJMP DEN ;=N4:LJMP
18、E3FIRST:MOV JG,R4 ;输入值送结果MOV R3,#0 ;按键次数清零LJMP DISP1 ;结果处理JIA:MOV A,JG;上次结果送累加器ADD A,R4;上次结果加输入值JB CY,N4;溢出MOV JG,A;存本次结果MOV R3,#0;按键次数清零LJMP DISP1JIAN:MOV A,JGSUBB A,R4;上次结果减输入值JB CY,N4;负数溢出MOV JG,AMOV R3,#0LJMP DISP1CHENG:MOV A,JGMOV B,AMOV A,R4MUL AB;上次结果乘输入值JB OV,N4;溢出MOV JG,ALJMP DISP1CHU:MOV A
19、,R4MOV B,AMOV A,JGDIV AB;上次结果除输入值MOV JG,AMOV R3,#0LJMP DISP1DEN:MOV R3,#0LJMP DISP1DISP1:MOVB,#10MOVA,JG;结果送累加器DIVAB;结果除10MOVJG1,A;暂存商MOVA,B;取个位数MOV34H,A;个位数送显示缓存MOVA,JG1JZDISP11;结果是否为一位数MOVB,#10MOVA,JG1DIVABMOVJG1,AMOVA,BMOV33H,A;十位送显示缓存MOVA,JG1JZDISP11;结果是否为二位数 MOV B,#10 MOVA,JG1DIVABMOVJG1,AMOVA,
20、BMOV32H,A;十位送显示缓存MOVA,JG1MOV31H,A;百位数送显示缓存DISP11:LJMPMLOOPDISP: MOV R0,#34HDIR1: MOV DPTR,#SEGTAB MOV A,R0 MOVC A,A+DPTR MOV P0,A CJNE R0,#34H,DIR2 SETB P2.0 CALL D1MS CLR P2.0 DEC R0 SJMP DIR1ERROR: X1: LCALL BZ ;调用喇叭响应程序 CLR 26H.0 ;调用喇叭响应程序结束 LCALL DELAY CLR 26H.0 BZ: MOV C,26H.1 CPL P2.4 MOV R7,#
21、0FH ;喇叭响应时间 T2: MOV R6,#0FH T3: DJNZ R6,T3 DJNZ R7,T2 SETB P2.3 RETTESTKEY:ACALL DISPMOVP1,#0FH;读入键状态MOVA,P1CPLAANLA,#0FH;高四位不用RETTABLE:DB0CH,08H,04H,00H;键码定义DB0DH,09H,05H,01HDB0EH,0AH,06H,02HDB0FH,0BH,07H,03HGETKEY:MOVR6,#10;读键子程序ACALLDELAYMOVP1,#0FHMOVA,P1CJNEA,0FH,K12LJMPMLOOPK12: MOVB,AMOVP1,#0E
22、FHMOVA,P1CJNEA,#0EFH,K13MOVP1,#0DFHMOVA,P1CJNEA,#0DFH,K13MOVP1,#0BFHMOVA,P1CJNEA,#0BFH,K13MOVP1,#07FHMOVA,P1CJNEA,#07FH,K13LJMPMLOOPK13: ANL A,#0F0HORLA,BMOVB,AMOVR1,#16MOVR2,#0MOVDPTR,#TABLEK14:MOVA,R2MOVCA,A+DPTRCJNEA,B,K16MOVP1,#0FHK15:MOVA,P1CJNEA,#0FH,K15MOVR6,#10ACALLDELAYMOVA,R2RETK16:INCR2DJ
23、NZR1,K14AJMPMLOOP ;10ms延时子程序DELAY:MOVR7,#10TS1: MOV R6,#0FFHTS2:NOPNOP DJNZR6,TS2DJNZR7,TS1RETEND六、心得体会刚开始的时候还真的不知道从哪里设计好,一点头绪都没有,就开始在上网查资料,还去图书馆查资料,解之后自己尝试编写程序,在此过程中,其中键盘扫描和动态扫描显示扫描程序困扰了我很久,经过三四天的辛苦工作,终于初步把所需要的程序编好了,于是就用Keil uversion3进行仿真,在仿真期间也发现了许多错误,基本上都是平日容易犯的错误,比如忘记了子程序标号、死循环程序、标点符号的漏写等。经过反复的编
24、译差错,仿真编译通过后,于是开始在Proteus中连硬件电路,全部接完电路之后将Keil生成的.Hex文件导入进行仿真,发现软件与硬件不能够对应协调工作,于是分别对软件和硬件进行检查,经过反复的仿真调试,并且在同学的帮助和自己对每个子程序进行仿真观察下,终于在课设快结束时成功的调试出结果了。这就是我这一周课设的经过,看似简单,过程却曲折艰辛。 通过这次课程设计,我进一步加深了对电子自动控制的了解。并进一步熟练了对Keil和Proteus软件的操作。在编写程序的过程中,遇到了很多问题,使我发现自己以前学习上存在的不足,对以前所学过的知识理解得不够深刻,掌握得不够牢固,对单片机汇编语言掌握得不够好
25、。通过与同学探讨,终于把问题都解决了,并加深了对计算器工作的原理的了解。同时也掌握了做课程设计的一般流程,为以后的设计积累了一定的经验。做课程设计时,先查阅相关知识,把原理吃透,确定一个大的设计方向,在按照这个方向分模块的把要实现的功能用流程图的形式展示。学会了怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。总之,通过这次的设计,进一步了解了单片微型计算机及应用原理,收获很大,对软件编程、排错调试、查阅资料等方面得到较全面的锻炼和提高。同时通过本次课程设计的学习,掌握了一种系统的研究方法,可以进行一些简单的编程,我还深深的体会到设计课的重要性和目的性所
26、在。为了完成项目,在网络上找到了许多相关的资料,大大扩充自己的知识面,使许多以前想解决却无法解决的困难迎刃而解。将书本上的理论知识和实际有机地结合起来,从理论中得出结论。锻炼了实际分析问题和解决问题的能力,提高了适应实际的能力,为今后的学习和实践打下了良好的基础。此次课设还巩固和综合运用所学过的原理知识,从而提高自己的实际动手能力和独立思考的能力。三、 参考文献1程琤 单片机原理与应用系统开发 -北京:国防工业出版社,2010.112岂兴明 唐杰 赵沛 矫津毅 常春藤等 51单片机编程基础与开发实例详解 人民邮电出版社,2008.113汪道辉 单片机系统设计与实践 -北京:电子工业出版社,2006.54江志红 51单片机技术与应用系统开发案列精选 -北京:清华大学出版 社,2008.125谷树忠 Altium Designer教程原理图、PCB设计与仿真 电子工业出版 社,2008.6