黄河科技学院课程设计任务书工学院机械系机械设计制造及其自动化专业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如下:0CH08H04H00H0DH09H05H01H0EH0AH06H02H0FH0BH07H03H对应的键盘按键为:×840÷951=+62功能-73报警电路当超出位数时,调用喇叭程序,信号通过三极管放大后驱动扬声器,发出相应的声音。如图所示三、硬件电路设计图用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五、调试与仿真下面用KEILuVision3与proteus仿真软件介绍十进制加法计算器的仿真与调试。KeilC51单片机软件开发系统(一)系统的整体结构C51工具包的整体结构中,其中uVision是C51forWindows的集成开发环境(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.通过uVision3的相关选择项,配置编译环境、连接定位器以及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”;也可以分别调试其它功能键,结果发现调试结果与预期的理论值相吻合,即本次课设已成功。(四)程序清单:JGEQU50H;结果存放JG1EQU51H;中间结果存放GONGEQU52H;功能键存放ORG0000HSTART:MOVR4,#06HMOVGONG,#0MOVR0,#31HCLEAR:MOV@R0,#00HINCR0DJNZR4,CLEAR;清除31H~34H地址单元的内容MLOOP:CALLDISP;调显示子程序WAIT:CALLTESTKEY;判断有无按键JZWAITCALLGETKEY;读键INCR3;按键个数CJNEA,#0,NEXT1;判断是否数字键LJMPE1;转数字键处理NEXT1:CJNEA,#1,NEXT2LJMPE1NEXT2:CJNEA,#2,NEXT3LJMPE1NEXT3:CJNEA,#3,NEXT4LJMPE1NEXT4:CJNEA,#4,NEXT5LJMPE1NEXT5:CJNEA,#5,NEXT6LJMPE1NEXT6:CJNEA,#6,NEXT7LJMPE1NEXT7:CJNEA,#7,NEXT8LJMPE1NEXT8:CJNEA,#8,NEXT9LJMPE1NEXT9:CJNEA,#9,NEXT10LJMPE1NEXT10:CJNEA,#0AH,NEXT11;判断是否功能键LJMPE2;转功能键处理NEXT11:CJNEA,#0BH,NEXT12LJMPE2NEXT12:CJNEA,#0CH,NEXT13LJMPE2NEXT13:CJNEA,#0DH,NEXT14LJMPE2NEXT14:CJNEA,#0EH,NEXT16LJMPE2NEXT15:LJMPE3;判断是否清除键E1:CJNER3,#1,N1;判断第几次按键LJMPE11;为第一个数字N1:CJNER3,#2,N2LJMPE12;为第二个数字N2:CJNER3,#3,N3LJMPE13;为第三个数字N3:CJNER3,#4,N4LJMPE13;为第四个数字N4:LCALLERROR;调用错误警示喇叭程序LJMPE3;第五个数字转溢出E11:MOVR4,A;输入值暂存R4MOV34H,A;输入值送显示缓存MOV33H,#00HMOV32H,#00HLJMPMLOOP;等待再次输入E12:MOVR7,A;个位数暂存R7MOVB,#10MOVA,R4MULAB;十位数ADDA,R7MOVR4,A;输入值存R4MOV32H,#00H;输入值送显示缓存MOV33H,34HMOV34H,R7LJMPMLOOPE13:MOVR7,AMOVB,#10MOVA,R4MULABJBOV,E3;输入溢出ADDA,R7JBCY,E3;输入溢出MOVR4,AMOV32H,33H;输入值送显示缓存MOV33H,34HMOV34H,R7LJMPMLOOPE3:MOVR3,#0;按键次数清零MOVR4,#0;输入值清零MOVJG,#0;计算结果清零MOVGONG,#0;功能键设为零MOV32H,#00H;显示清空MOV33H,#00HMOV34H,#00HLJMPMLOOPE2:MOV34H,#00HMOV33H,#00HMOV32H,#00HMOVR0,GONG;与上次功能键交换MOVGONG,AMOVA,R0CJNEA,#10,N21;判断功能键LJMPJIA;+N21:CJNEA,#11,N22LJMPJIAN;-N22:CJNEA,#12,N23LJMPCHENG;*N23:CJNEA,#13,N24LJMPCHU;/N24:CJNEA,#0,N25LJMPFIRST;首次按功能键N25:LJMPDEN;=N4:LJMPE3FIRST:MOVJG,R4;输入值送结果MOVR3,#0;按键次数清零LJMPDISP1;结果处理JIA:MOVA,JG;上次结果送累加器ADDA,R4;上次结果加输入值JBCY,N4;溢出MOVJG,A;存本次结果MOVR3,#0;按键次数清零LJMPDISP1JIAN:MOVA,JGSUBBA