




免费预览已结束,剩余16页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
哈尔滨工业大学(威海)课程设计用纸 第 1 页 (威海) 课 程 设 计基本信息学生姓名: 学号: 0 院系名称: 信息与电气工程学院 课程设计名称: 简易4位计算器设计 课程设计地点: N楼 课程设计时间: 2011 年12 月 15日至25日 同组人姓名: 杜玮 课程设计内容目录 页码1、 课程设计题目与任务书.22、 课程设计用仪器设备名称. 3、 课程设计过程. 4、 课程设计心得、建议等. 教师评语及课程设计成绩 评语: 成绩: 教师签字:年 月 日课程设计任务书专 业测控技术与仪器班 级 学 生 指导教师 题 目单片机课程设计子 题简易4位(09999)计算器(+、-、*、/、四种运算)设计设计时间年 月 日 至 年 月 日 共 周设计要求设计任务:设计一个能实现0-9整数加法运算的计算器,和用10位LED数码显示。键盘包括0-9及“+、-、*、/”和“=”及“清除”16个按键。(除法应保留足够的的小数,满足共10位的显示)要有错误显示Err。指导教师签字: 系(教研室)主任签字:年 月 日1. 总体设计及功能要求:1.1总体设计:方案设计:设计要求利用数码管移位动态扫描显示的编程方法,利用矩阵扫描的编程方法,利用数据在内部运算的编程方法。设计任务实现最大4位正整数加、减、乘、除,具备清零、等于功能,16个按键功能依次为: 数字0、数字1、数字2、数字3、数字4、数字5、数字6、数字7、数字8、数字9、清零、等于、加、减、乘、除。本次单片微型计算机与接口技术课程设计做的是利用C51单片机为主体的计算器,实现了简单的加、减、乘、除功能。采取的是键盘输入和LED数码管输出结果显示。主要硬件构成部分由四个,一个AT89C51单片机芯片,两个LED数码显示屏,一个4*4键盘,可以实现10位的数值操作计算。1.2基本功能:首先,计算器可实现10位数字,开机运行时,只有数码管最低位显示为“0”,其他位全部不显示;其次,可以对计算结果在10位以内的;两个数进行加、减、乘、除运算,并显示计算结果,如果输入操作数和输出结果超过10位,则会显示“Err”,以提示使用者输入错误,应清零后重新输入。 最后,运算时,如果按错了可以使用清零键直接清零,重新输入数据。 2. 硬件部分设计方案:2.1 单片机部分单片机以AT89C51来作为核心元器件。2.2 按键部分采用4*4行列式键盘,分别设定数字键和功能键,采用查询方式,每次有键按下时,先判断是数字键还是功能键。2.3 显示部分 在单片机应用系统中,使用的显示器主要有LED(发光二极管显示器)、LCD液晶显示器以及CRT接口。本次设计采用的是使用10位LED数码管来显示,LED显示器是由发光二极管显示字段组成的显示器件,在单片机应用系统中通常使用的是七段LED,这种显示器有共阴极和共阳极两种,它具有成本低廉、配置灵活和单片机接口方便等特点。本次设计采用的是共阴极数码管。(注:硬件设计:0At89C51单片机简介At89C51是一种带4K字节FLASH存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。外形及引脚排列如右图所示:P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流,这是由于上拉的缘故。 1数码管显示数码管的段位如左图所示,本设计使用的是共阴极型数码管,所以需要将相应段码置高电平,公共端位码置低电平,才能点亮相应的段。A、B、C、D、E、F、G、DP对应P0.0到P0.7,本设计中所对应的16进制段码如下表所示:显示内容0123456789ERO16进制数3f065b4f666d7d077f6f79313f由于题目要求10位LED数码显示,因此需要10个数码管,则必须采用动态扫描显示,由P0的8个口控制段,P2.7P2.0和P3.1、P3.0的10个口来控制位,其中P0口需外接上拉电阻。2键盘扫描以程序扫描的方式来判断哪一按键按下,依次扫描一行的四个按键,送出扫描信号1110以扫描第一行的四个按键,读取按键数据,判断该行是否有键按下,若有键按下,则连接至被按下的按键,返回线的状态为0。依次循环送出其他行的低电平信号,按照同样的方法检测按键状态。因为按键是机械结构,按下按键时接触的瞬间会有电平抖动,为了能够准确识别按键状态,在检测到按键按下后,延时5ms后再次判断按键状态,以延时之后得到的按键值为准。使用P1口完成键盘扫描和接收,其中低四位发出扫描信号,高四位接收按键信号。3晶振电路、复位电路本设计使用12M晶振,晶振两端分别接入单片机XTAL1、XTAL2引脚,同时晶振两端各接一个30pF的电容到地。At89C51型单片机是高电平复位,单片机复位引脚RST接一个1k的电阻到地,同时接一个10uF的电容到正5V,同时在电容两端并接一个复位按键。复位键不被按下的时候,复位引脚是低电平,能正常工作。复位键按下后,单片机复位。4系统仿真电路图由于本设计使用Proteus进行仿真,并未进行实物的焊接,因此很多设计省去了,如果要制作实物,有以下几点需要注意:电源的输入电压要稳定,通常使用7805进行稳压,7805的输入电压通常要大于9V;如果使用较大的数码管,图示驱动电路可能无法驱动,需要加三极管或者其他专用驱动电路。4. 系统硬件的设计4.1 系统的总体硬件设计单片机芯片选择AT89C51,显示区域使用LED数码显示,键盘是4*4普通矩阵键盘,芯片P0口和P1口的前两2脚接入数字显示屏的位选端,P3口则接入数字显示屏的段选端,键盘横行接入单片机芯片AT89C51P2口的前四个接口,键盘的竖行则分别接入单片机芯片AT89C51的P2口的后四个接口。另外12M Hz晶振接入单片机芯片AT89C51的XTAL1和XTAL2接口。系统总线图如下:4.2 键盘连接电路本设计之中使用的是4*4的普通键盘,我们可以使用其行列号来识别被按下的按键以此来获知被按键的信息,因此将行输出信号和列输出信号分别接入单片机芯片C51的P2口,通过循环扫描,读取行列的数据来判断是否有按键被按下,如果有则调用按键识别程序来识别具体按键。 键盘如图:图3 数字输入键盘4.3 LED数码显示连接电路 图4 LED显示器4.4 AT89S51单片机单片机如图: 图5 AT89S51单片机图4.5 外接电路 为了进一步强化该设计的功能,所以在单片机芯片C51外围添加了时钟脉冲芯片和复位电路,这样就可以对其电路频率进行调节。这个电路当中,是选取的是12M的晶振,对其两头电容接地,并一端接入芯片XALT1端口输入,调节芯片内部频率。另外一端,高电平通过按钮接入单片机芯片RST端口,并接一个电容和一个电阻,降低电流冲击对芯片的影响。 时钟脉冲电路和复位电路如下图: 图6 时钟脉冲电路和复位电路由此,就是由以上的键盘连接电路、显示屏连接电路、外部电路和芯片共同构成了整个设计的硬件结构部分。4. 软件部分设计方案:软件部分的设计思路时将整个程序划分为键盘扫描部分、显示部分、运算程序部分、清屏显示部分。对于其中的键盘扫描部分在编写时为动态扫描;运算程序部分包括:加、减、乘、除四个子程序。软件流程大致如下:开始,然后是系统的初始化,进行键盘扫描,对扫描的键值进行判断(分为数字键和功能键),如果是数字键,执行数字处理子程序,即显示数字并将数值存储;如果是命令键,即先判断是否为清屏,如为清屏键,则执行清屏子程序,若为加减乘除运算键则显示相应的符号并存储结果,若都不是则为=键,即要先判断个符号位,然后调用对应的运算子程序运算,就可以得到需要的结果。10位LED显示部分51系列单片机4*4键盘时钟电路和复位控制电路 图1 系统原理框图5.系统软件的设计虽然我们上课学的是汇编语言,但是汇编语言较为繁琐,所以我们采用灵活度相对较高的C语言编写程序。 总体流程图如下:开始Y扫描键盘是否有键下数字键 Y YY结束N是否为清零键NN显示错误Y运算符 图7 键盘识别程序流程图N开始扫描第一行是否有键按下N扫描第二行是否有键按下N扫描第三行是否有键按下扫描第四行是否有键按下结束YYYY 图8 键盘扫描程序流程图2软件中标志位设置软件中设置有较标志位,标志位的设置非常重要,标志位具体介绍如下:ne:减法出现负数时,其值为1,否则为0。s:当第一次输入数字键时为0,第二次置1。6. 元件清单及程序清单6.1 元件清单序号 名称 型号 数量 151系列单片机AT89S51 1 2按钮BOTTON 1 3电容CAP30pF 2 4电容CAP-ELEC 10uF 1 5晶振CRYSTAL 12MHz 1 64*4键盘KEYPAD-SMALLCALC 1 72位LED数码管7SEG-MPX2-CC-BLUE 1 88位LED数码管7SEG-MPX8-CC-BLUE 1 9电阻RES 1K 16.2 程序清单#includeUnsigned char code table11=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40; unsigned char code chucuotable3=0x31,0x31,0X79;long value1 ,value2, result; int key1,tempkey,keyt; bit ne,s;void delay(int z) /延时程序 int x,y; for(x=z;x0;x-) for(y=110;y0;y-);int getkey(void) /键盘扫描程序 int key=0; P2=0xfd; if(P2!=0xfd) delay(5); while(P2!=0xfd) switch(P2) case 0xed:key=4;break;case 0xdd:key=5;break; case 0xbd:key=6;break; case 0x7d:key=13;break; if(key) return(key); P2=0xfb; if(P2!=0xfb) delay(5); while(P2!=0xfb) switch(P2) case 0xeb:key=1;break;case 0xdb:key=2;break; case 0xbb:key=3;break; case 0x7b:key=12;break; if(key) return(key); P2=0xf7; if(P2!=0xf7) delay(5); while(P2!=0xf7) switch(P2) case 0xe7:key=16;break;case 0xd7:key=10;break; case 0xb7:key=15;break; case 0x77:key=11;break; if(key) return(key); P2=0xfe; if(P2!=0xfe) delay(5); while(P2!=0xfe) switch(P2) case 0xee:key=7;break;case 0xde:key=8;break; case 0xbe:key=9;break; case 0x7e:key=14;break; return(key); /*显示程序 */void display1(long result) int ne; int a9=0; if(result=100000000) /错误显示 P0=0xfb;P1=0xff;P3=chucuotable2;delay(1); P0=0xfd;P1=0xff;P3=chucuotable1;delay(1); P0=0xfe;P1=0xff;P3=chucuotable0;delay(1); tempkey=getkey(); if(tempkey=16) key1=tempkey; break; else if(result=10000000) P0=0x7f,P1=0xff,P3=tablea7;delay(1); if(result=1000000) P0=0xbf,P1=0xff,P3=tablea6;delay(1); if(result=100000) P0=0xdf,P1=0xff,P3=tablea5;delay(1); if(result=10000) P0=0xef,P1=0xff,P3=tablea4;delay(1); if(result=1000) P0=0xf7,P1=0xff,P3=tablea3;delay(1); if(result=100) P0=0xfb,P1=0xff,P3=tablea2;delay(1); if(result=10) P0=0xfd,P1=0xff,P3=tablea1;delay(1); P0=0xfe,P1=0xff,P3=tablea0;delay(1); if(ne=1) P0=0xef,P1=0xff,P3=table10;delay(1); tempkey=getkey(); if(tempkey!=0) key1=tempkey; break; negative=0; /*除法程序* */void chudisplay(long a,b) int k10=0; int tempkey;unsigned long t, f;unsigned char n=0,i;t=a/b;if(t=1000) n=4; else if(t=100) n=3; else if(t=10) n=2; else if(t=0) n=1; for(i=n;i0;i-) f=t%10; t=t/10; k10-i=tablef; f=a%b; for(i=n;i10;i+) f=f*10; t=f/b; f=f%b; k9-i=tablet; k10-n=(k10-n|0x80); while(1) if(b=0) P0=0xfb;P1=0xff;P3=chucuotable2;delay(1); P0=0xfd;P1=0xff;P3=chucuotable1;delay(1); P0=0xfe;P1=0xff;P3=chucuotable0;delay(1); tempkey=getkey(); if(tempkey=16) key1=tempkey; break; else P0=0xff;P1=0xfd;P3=k9;delay(1);P0=0xff;P1=0xfe;P3=k8;delay(1);P0=0x7f;P1=0xff;P3=k7;delay(1);P0=0xbf;P1=0xff;P3=k6;delay(1); P0=0xdf;P1=0xff;P3=k5;delay(1); P0=0xef;P1=0xff;P3=k4;delay(1); P0=0xf7;P1=0xff;P3=k3;delay(1); P0=0xfb;P1=0xff;P3=k2;delay(1); P0=0xfd;P1=0xff;P3=k1;delay(1); P0=0xfe;P1=0xff;P3=k0;delay(1); tempkey=getkey(); if(tempkey!=0) key1=tempkey; break; /* *主函数 */void main() key1=0; read: if(key10) if(key1=10) key1=0;value1=value1*10+key1;if(value1=10000) display1(10000000000); if(key1=16) s=0; value2=value1=result=0;display1(value1); if(key1=16) s=0; value2=value1=result=0;goto read;if(key110)if(s=0) value2=value1; value1=0;keyt=key1;s=1; display1(value2); if(key1=16) s=0; value2=value1=result=0; goto read; if(key1=16) s=0; value2=value1=result=0;if(keyt=11) result=value2+value1;if(keyt=12) result=value2-va
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论