当前位置:文档之家› 十字路口红绿灯单片机课程设计

十字路口红绿灯单片机课程设计

黄河科技学院课程设计任务书工学院机械系机械设计制造及其自动化专业10 级班学号姓名指导教师题目: 彩灯控制器的设计课程:单片机课程设计课程设计时间 2013年10月28日至2013年11 月10 日共2 周一、设计要求:利用AT89C51单片机的4位数字加法计算器,能进行加减运算。

创新要求:功能键能清零、超出位数光报警提示、违规操作声报警二、设计方案分析:采用4×4键盘,键盘定义十个数字键,六个功能键,使用串行动态显示显示运算结果。

主程序进行初始化,采用行列扫描进行查表得出键值,每次按键后调用显示子程序。

主要单元电路的设计复位电路复位电路采用上电复位与手动复位相结合的方案。

上电复位时,上电瞬间RST 端的电位与VCC相同,即为高电平,随着充电电流的减小,RST端的电位逐渐下降。

只要高电平保持时间足够长,就可以使AT89C52有效地复位。

手动复位时,按下复位按钮,电容C1通过R2电阻迅速放电,使RST端迅速变为高电平,复位按钮松开后,电容通过R和内部下拉电阻放电,逐渐使RST端恢复为低电平。

电路如图所示晶振电路晶振电路是单片机的心脏,它用于产生单片机工作所需要的时钟信号,晶振电路给数字钟提供一个频率稳定准确的方波信号,可保证数字钟的走时准确及稳定,晶振电路如图键盘电路的设计键盘可分为两类:编码键盘和非编码键盘。

编码键盘是较多按键(20个以上)和专用驱动芯片的组合,当按下某个按键时,它能够处理按键抖动、连击等问题,直接输出按键的编码,无需系统软件干预。

通用计算机使用的标准键盘就是编码键盘。

当系统功能比较复杂,按键数量很多时,采用编码键盘可以简化软件设计。

但大多数智能仪器和电子产品的按键数目都不太多(20个以内),为了降低成本和简化电路通常采用非编码键盘。

非编码键盘的接口电路有设计者根据需要自行决定,按键信息通过接口软件来获取。

本课题需要的是16个按键,故选择用非编码键盘。

计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O 口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。

矩阵键盘采用四条I/O 线作为行线,四条I/O 线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。

这样键盘上按键的个数就为4×4个。

这种行列式键盘结构能有效地提高单片机系统中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.0~P1.3作为行扫描输出,P1.4~P1.7作为列扫描输入,P0.0~P0.3作为键值码输出送出译码器7447,7447是美国仙童公司生产的BCD码到7段数码管的译码器驱动芯片。

它负责将4位BCD码十进制数转换成对应的7段数码管信号,送到数码管的7位段选输入端。

译出的显示码送入数码管的段驱,P0.4~P0.6控制译码器74LS138,74LS138译码器负责数码管显示扫描时依次通过译码选中数码管中,译码输出控制数码管的位驱。

电路图如下图所示:四、软件部分设计程序工作过程如下:(1)首先赋予显示缓冲初始值‘00’,并把数据存储单元清零。

(2)主程序调用键盘扫描子程序,判断键值,是数字第一次直接赋予34H单元,如是第二次输入数字,则把第一次值乘十后与第二次值相加,结果存储到33H单元,如是第三次输入数字,则把前两次值乘十后与第三次值相加,结果存储到32H单元,在等待运算符号的按下,按下等于号就直接计算并显示,如加减乘除就运算后把按键次数清零,表示可以输入下一操作数,与第一次相同,并等待等于键按下。

清零键则不管在任何情况下都清零,相当于软复位。

(3)在扫描完键盘后,调用数据显示转换子程序把值转换为七段码。

(4)调用数码管动态显示子程序,显示数值,重新循环。

系统总流程图主程序主要是用来进行初始化的,调用其他子程序,清空各个标志位,清空缓存区,读取键码,判断功能,在LED 上作出回应。

(1)数字送显示缓冲程序设计简易计算器所显示的数值最大位四位。

要显示数值,先判断数值大小和位数,如果是超过四位,将不显示数字,并调用喇叭程序提示错误。

可重新输入数字,再次计算。

(2)运算程序的设计首先初始化参数,送LED 三位显示“0”,其它位不显示。

然后扫描键盘看是否有键输入,若有,读取键码。

判断键码是数字键、清零键还是功能键,是数值键则送LED 显示并保存数值,是清零键则做清零处理,是功能键则又判断是“=”还是运算键,若是“=”则计算最后结果并送LED 显示,若是运算键则保存相对运算程序的首地址。

流程图判断按键存入内存单元Y将第一次输入的数字×10 +第二次输入的数字YN是否是数字键扫描键盘 有输入则计算键值计算结果并送内存单元是否是清零YN等待输入等号 开始是否第一次输入数字N五、调试与仿真下面用KEIL uVision3与proteus仿真软件介绍十进制加法计算器的仿真与调试。

Keil C51单片机软件开发系统(一)系统的整体结构C51工具包的整体结构中,其中uVision是C51 for Windows的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。

开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。

然后分别由C51编译器编译生成目标文件(.OBJ)。

目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。

ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。

(二)采用KEIL 开发的89c51单片机应用程序步骤:1. 在uVision 集成开发环境中创建新项目(Project),扩展文件名为.UV2,并为该项目选定合适的单片机CPU器件(本设计采用ATMEL 公司下的AT89C51)2. 用uVision 的文本编辑器编写源文件,可以是汇编文件(.ASM),也可以使C语言文件(扩展名.C),并将该文件添加到项目中去。

一个项目文件可以包含多个文件,除了源程序文件外,还可以是库文件、头文件或文本说明文件。

3. 通过uVision 3 的相关选择项,配置编译环境、连接定位器以及Debug调试器的功能。

4. 对项目中的源文件进行编译连接,生成绝对目标代码和可选的HEX文件,如果出现编译连接错误则返回到第2步,修改源文件中的错误后重构整个项目。

5. 对没有语法错误的程序进行仿真调试,调试成功后将HEX文件写入到单片机应用系统的ROM中。

proteus的操作(一)硬件电路图的接法操作1.放置选择(删除)元器件2.移动元器件3.缩放视图4.连接导线5.仿真,调试(二)单片机系统PROTEUS设计与仿真过程Proteus强大的单片机系统设计与仿真功能,使它可成为单片机系统应用开发和改进手段之一。

全部过程都是在计算机上通过Proteus来完成的。

其过程一般也可分为三步:1.在ISIS平台上进行单片机系统电路设计、选择元器件、接插件、连接电路和电气检测等,简称Proteus电路设计。

2.在Keil平台上进行单片机系统程序设计、编辑、汇编编译、代码级调试,最后生成目标代码文件(*.hex)。

简称Proteus源程序设计和生成目标代码文件。

3.在ISIS平台上将目标代码文件加载到单片机系统中,并实现单片机系统的实时交互、协同仿真。

它在相当程度上反映了实际单片机系统的运行情况。

简称Proteus仿真。

(三)Proteus中课程设计的仿真结果在Proteus中将硬件电路全部接好以后,将Keil中生成的.hex文件导入到单片机中,点击开始仿真按钮,电路开始仿真。

可以观察到:数码管显示“000”;分别依次按下按键“5”、“+”、“6”和“=”,可以看到数码管显示“11”;也可以分别调试其它功能键,结果发现调试结果与预期的理论值相吻合,即本次课设已成功。

(四)程序清单:JG EQU 50H ;结果存放JG1 EQU 51H ;中间结果存放GONG EQU 52H ;功能键存放ORG 0000HSTART: MOV R4,#06HMOV GONG,#0MOV R0,#31HCLEAR: MOV @R0,#00HINC R0DJNZ R4,CLEAR ;清除31H~34H地址单元的内容MLOOP: CALL DISP ;调显示子程序WAIT: CALL TESTKEY ;判断有无按键JZ WAITCALL 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,NEXT7LJMP 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: CJNE R3,#1,N1 ;判断第几次按键LJMP E11 ;为第一个数字N1: CJNE R3,#2,N2LJMP E12 ;为第二个数字N2: CJNE R3,#3,N3LJMP E13 ;为第三个数字N3: CJNE R3,#4,N4LJMP E13 ;为第四个数字N4: LCALL ERROR ;调用错误警示喇叭程序LJMP E3 ;第五个数字转溢出E11: MOV R4,A ;输入值暂存R4MOV 34H,A ;输入值送显示缓存MOV 33H,#00HMOV 32H,#00HLJMP M LOOP ;等待再次输入E12: MOV R7,A ;个位数暂存R7MOV B,#10MOV A,R4MUL AB ;十位数ADD A,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,#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 C HENG ;"*"N23: CJNE A,#13,N24LJMP CHU ;"/"N24: CJNE A,#0,N25LJMP FIRST ;首次按功能键N25: LJMP DEN ;"="N4: LJMP 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,R4MOV B,AMOV A,JGDIV AB ;上次结果除输入值MOV JG,AMOV R3,#0LJMP DISP1DEN: MOV R3,#0LJMP DISP1DISP1: MOV B,#10MOV A,JG ;结果送累加器DIV AB ;结果除10MOV JG1,A ;暂存"商"MOV A,B ;取个位数MOV 34H,A ;个位数送显示缓存MOV A,JG1JZ DISP11 ;结果是否为一位数MOV B,#10MOV A,JG1DIV ABMOV JG1,AMOV A,BMOV 33H,A ;十位送显示缓存MOV A,JG1JZ DISP11 ;结果是否为二位数MOV B,#10MOV A,JG1DIV ABMOV JG1,AMOV A,BMOV 32H,A ;十位送显示缓存MOV A,JG1MOV 31H,A ;百位数送显示缓存DISP11: LJMP MLOOPDISP: MOV R0,#34HDIR1: MOV DPTR,#SEGTABMOV A,@R0MOVC A,@A+DPTRMOV P0,ACJNE R0,#34H,DIR2SETB P2.0CALL D1MSCLR P2.0DEC R0SJMP DIR1ERROR:X1: LCALL BZ ;调用喇叭响应程序CLR 26H.0 ;调用喇叭响应程序结束LCALL DELAYCLR 26H.0BZ: MOV C,26H.1CPL P2.4MOV R7,#0FH ;喇叭响应时间T2: MOV R6,#0FHT3: DJNZ R6,T3DJNZ R7,T2SETB P2.3RETTESTKEY:ACALL DISPMOV P1,#0FH ;读入键状态MOV A,P1CPL AANL A,#0FH ;高四位不用RETTABLE:DB 0CH,08H,04H,00H ;键码定义DB 0DH,09H,05H,01HDB 0EH,0AH,06H,02HDB 0FH,0BH,07H,03HGETKEY: MOV R6,#10 ;读键子程序ACALL DELAYMOV P1,#0FHMOV A,P1CJNE A,0FH,K12LJMP MLOOPK12: MOV B,AMOV P1,#0EFHMOV A,P1CJNE A,#0EFH,K13MOV P1,#0DFHMOV A,P1CJNE A,#0DFH,K13MOV P1,#0BFHMOV A,P1CJNE A,#0BFH,K13MOV P1,#07FHMOV A,P1CJNE A,#07FH,K13LJMP MLOOPK13: ANL A,#0F0HORL A,BMOV B,AMOV R1,#16MOV R2,#0MOV DPTR,#TABLEK14: MOV A,R2MOVC A,@A+DPTRCJNE A,B,K16MOV P1,#0FHK15: MOV A,P1CJNE A,#0FH,K15MOV R6,#10ACALL DELAYMOV A,R2RETK16: INC R2DJNZ R1,K14AJMP MLOOP;10ms延时子程序DELAY: MOV R7,#10TS1: MOV R6,#0FFHTS2: NOPNOPDJNZ R6,TS2DJNZ R7,TS1RETEND六、心得体会刚开始的时候还真的不知道从哪里设计好,一点头绪都没有,就开始在上网查资料,还去图书馆查资料,解之后自己尝试编写程序,在此过程中,其中键盘扫描和动态扫描显示扫描程序困扰了我很久,经过三四天的辛苦工作,终于初步把所需要的程序编好了,于是就用Keil uversion3进行仿真,在仿真期间也发现了许多错误,基本上都是平日容易犯的错误,比如忘记了子程序标号、死循环程序、标点符号的漏写等。

相关主题