




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
十进制加减乘除法计算器院 系:电子与电气工程学院专 业:电子信息工程班 级:099411姓 名:曹斌学 号:094109006指导老师:薛晓一、设计要求以52系列单片机为核心实现一个简易计算器,设计十进制加减乘除法计算器。要求能(不同时)显示3位输入和4位输出。二、设计目的要求计算器能实现加减乘除四种运算,具体如下:1、加法:整数加法2、减法:整数减法3、乘法:多位整数乘法4、除法:整数除法5、有清除功能6、在原有要求上扩展多位输入和输出,超出值显示乱码三、设计方案论证按照系统设计的功能的要求,初步确定设计系统由主控模块、监测模块、显示模块、键扫描接口电路共四个模块组成,主控芯片使用51系列STC89C52单片机,采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flash程序存储器。它是一种高性能、低功耗的8位COMS微处理芯片,市场应用最多。监测模块采用三极管和蜂鸣器组成电路。键盘电路采用4*4矩阵键盘电路。显示模块采用4枚共阴极数码管和74ls138、74LS47芯片构成等器件构成。整个单片机的接口电路:P0(30)用于数码管段选显示输出;P2用于键扫描输入;P0(6.4)用于数码管位选控制;P0(7)用于监测模块;单片机最小系统单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。主控芯片选取STC89C52RC芯片,因其具有良好的性能及稳定性,价格便宜应用方便。晶振选取11.0592MHz,晶振旁电容选取20pF。采用按键复位电路,电阻分别选取100和10K,电容选取10F。以下为单片机最小系统硬件电路图。2012-11-17 12:37 上传下载附件(38.67 KB)单片机最小系统硬件电路键盘接口电路采用P2口对键盘进行控制,行列式键盘这里主要用反转扫描法进行检测。原理图如下:2012-11-17 12:38 上传下载附件(92.56 KB)数码管显示电路采用8位数码管对计算数据和结果的显示(实验时只用到了4位),这里选取共阴数码管,利用74LS138和74LS47对数码管进行驱动。P0.6P0.4用来作为位选端,控制哪几位数码管进行显示。 P0.3P0.0控制数码管数字进行显示。以下为数码显示电路的硬件电路图2012-11-17 12:38 上传下载附件(97.03 KB)监视电路监视电路就是在按键时,发出声音提醒,以确保输入数字有效。这里就采用5V蜂鸣器作为示音设备。用p0.7口输出信号。以下为报警电路硬件电路图2012-11-17 12:38 上传下载附件(25.23 KB)(1)键盘扫描函数键盘电路采用4*4矩阵键盘电路。采用扫描法对键盘进行扫描,对P2口的扫描结果和各按键的地址,我们就可以得到是哪个键按下,从而完成键盘扫描的功能。unsigned char key_scan(void)unsigned char row,col=0,k=0xff;KEYIO=0xf0;if(KEYIO&0xf0)=0xf0)return k;delay(10);if(KEYIO&0xf0)=0xf0)return k;for(row=0;row4;row+)KEYIO=(1row);k=KEYIO&0xf0;if(k!=0xf0)while(k&(1(col+4)col+;k=row*4+col;KEYIO=0xf0;P0&=0x7f;while(KEYIO&0xf0)!=0xf0);break;return k;键盘调用程序:调用键盘扫描程序,读取按键的值。实现各个键的加减乘除的功能,采用switch功能进行读取。unsigned char key_vect(unsigned char keyValue)unsigned char nKey;switch(keyValue)case 0:nKey=7; break;case 1: nKey=8; break;case 2: nKey=9; break;case 3: nKey=ADD;break; case 4: nKey=4; break;case 5: nKey=5; break;case 6: nKey=6; break;case 7: nKey=SUB; break; case 8: nKey=1; break;case 9: nKey=2; break;case 10: nKey=3; break;case 11: nKey=MUL; break; case 12: nKey=0; break;case 13: nKey=CLR;break; case 14: nKey=EQU; break;case 15: nKey=DIV;break; default : nKey=ERROR;return nKey;(2)数码管显示函数采用4位数码管对计算数据和结果的显示,这里选取共阴数码管,利用74LS47和74LS138芯片对数码管进行驱动。P0.6P3.4用来作为位选端,控制哪几位数码管进行显示。比如当P0.6P0.4为0时,其他位全给1。此时就将扫描的数据送给指定数码管显示。void Led_display(unsigned char wei,unsigned char duan)duan&=0x0f;wei&=0x07;P0=(7-wei)0;FormatLoop-)unsigned long tmp=1;signed char tmp1=FormatLoop;for(;(tmp1-1)0;tmp1-)tmp*=10; /高位乘10fstValue+=keyValueFormatLoop-1*tmp; /高位乘10后相加4、如果除法有余数时怎么处理-任小丽回答:这是硬件的一个缺点,因为数码管不能够显示小数点位,所以在处理计算小数点的过程时,舍弃掉了小数点位,只保留整数。case EQU:NumberFormat(1);switch(MathWay)case 1:resValue=fstValue+secValue;break;case 2:resValue=fstValue-secValue;break;case 3:resValue=fstValue*secValue;break;case 4:resValue=fstValue/secValue; /除法break;如果要处理余数的话,可在后面求余除法resValue=fstValue%secValue;5、计算处理子程序的设计思路-朱阿松回答:void NumberFormat(unsigned char bSec)if(bSec)secValue=0;FormatLoop=nValideLed;for(;FormatLoop0;FormatLoop-)unsigned long tmp=1;signed char tmp1=FormatLoop;for(;(tmp1-1)0;tmp1-)tmp*=10; secValue+=keyValueFormatLoop-1*tmp; elsefstValue=0; FormatLoop=nValideLed; /获取按键获取的次数for(;FormatLoop0;FormatLoop-)unsigned long tmp=1;signed char tmp1=FormatLoop;for(;(tmp1-1)0;tmp1-) /按键次数进行循环*10的次数tmp*=10; fstValue+=keyValueFormatLoop-1*tmp; /将获取的值进行组合相加首先从按键获取第一个数值显示,然后当输入第二个数值时,将第一个数值存入一个数组缓存起来,存入keyValue里面,然后乘于10在加上获取的第二个数值,然后组合起来送入fstValue,最后得到最后的数值。最后再将获取的第一个输入的数值和第二个输入数值进行加、减、乘、除运算。 case EQU:NumberFormat(1);switch(MathWay)case 1:resValue=fstValue+secValue; /加法运算break;case 2:resValue=fstValue-secValue; /减法运算break;case 3:resValue=fstValue*secValue; /乘法运算break;case 4:resValue=fstValue/secValue; /除法运算break;resFormat();break; 然后主程序调用void main(void)sys_init();for(;) Calculate();DisplayLoop=nValideLed;if(DisplayLoop=0)Led_display(0,0);elsefor(;DisplayLoop0;DisplayLoop-)Led_display(DisplayLoop-1,keyValueDisplayLoop-1);/将缓存的数值赋给数码管的段选delay(5); 6、请问你们的设计计算器的优缺点是什么?-王坡回答:优点是可以实现任意位的计算输入和输出。缺点是不能算小数。7、如果我要计算的是100*100得到的结果怎么显示?-董艳波回答:按照原先题目要求和设计发现,结果超值,显示错误。这如果要设计计算器的话太不方便。经改过之后,可以显示其100*100的值,。为10000.8、如果输入的数字是负数怎么处理-周丹阳回答:按要求是没有负数的,但如果想要用到负数的话,可以用按键进行判断。可以在unsigned char key_vect(unsigned char keyValue)函数加个case语句,然后在void Calculate(void)函数里加个IF语句进行判断,如:IF(/所按的键)/加个符号;,但由于硬件限制,数码管不能显示符号,所以不能用到。9、程序能不能实现两个数相加之后数值直接显示,然后自动保存,再乘或除运算之后显示结果?-袁一方回答:我们设计的程序不可以实现,程序只可进行一步运算,但可以把结果作为第一个输入的值继续进行运算,也就是说多步运算只能一步一步来。10、是否可以实现两个整数相减而得到负数?-黄文淑回答:不可以实现,本程序会显示乱码。程序代码:unsigned char key_scan(void);unsigned char key_vect(unsigned char keyValue);voidsys_init();#include common.h#include sys_init.hvoidsys_init()P0|=0x80;#include reg52.h#define ADD21#define SUB 22#define MUL 23#define DIV 24#define CLR 25#define EQU 26#define ERROR 27void delay(unsigned char z);#include common.hvoid delay(unsigned char z)unsigned char x,y;for(x=50;x0;x-)for(y=z;y0;y-);voidLed_display(unsigned char wei,unsigned char duan);#include common.h#include display.hvoidLed_display(unsigned char wei,unsigned char duan)duan&=0x0f;wei&=0x07;P0=(7-wei)4)|duan|0x80;void Calculate(void);voidNumberFormat(unsigned char bSec);voidresFormat(void);#include common.h#include key.h#define KEYIO P2unsigned char key_scan(void)unsigned char row,col=0,k=0xff;KEYIO=0xf0;if(KEYIO&0xf0)=0xf0)return k;delay(10);if(KEYIO&0xf0)=0xf0)return k;for(row=0;row4;row+)KEYIO=(1row);k=KEYIO&0xf0;if(k!=0xf0)while(k&(10;FormatLoop-)unsigned long tmp=1;signed char tmp1=FormatLoop;for(;(tmp1-1)0;tmp1-)tmp*=10;secValue+=keyValueFormatLoop-1*tmp;elsefstValue=0;FormatLoop=nValideLed;for(;FormatLoop0;FormatLoop-)unsigned long tmp=1;signed char tmp1=FormatLoop;for(;(tmp1-1)0;tmp1-)tmp*=10;fstValue+=keyValueFormatLoop-1*tmp;voidresFormat(void)signed char reschar=7;for(;reschar-1;reschar-)unsigned long tmp=1;signed char tmp1=reschar;for(;tmp10;tmp1-)tmp*=10;keyValuereschar=(unsigned char)(resValue/tmp);resValue-=keyValuereschar*tmp;for(nValideLed=8;nValideLed0;nValideLed-)if(keyValuenValideLed-1!=0)break;void Calculate(void) nkey=key_vect(key_scan();if(nkey!=ERROR)if(nkey0;nLoop-)keyValuenLoop=keyValuenLoop-1;nValideLed+;keyValue0=nkey;elseswitch(nkey)case ADD:NumberFormat(0);nValideLed=0;keyValue0=0;MathWay=1;break;case SUB:NumberFormat(0);nValideLed=0;keyValue0=0;MathWay=2;break;case MUL:NumberFormat(0);nValideLed=0;keyValue0=0;MathWay=3;break;case DIV:NumberFormat(0);nValideLed=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国休闲电动三轮车行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年铝材行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年灯盏花素行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年大豆保健食品行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年中国马弗炉行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年中国跑车行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年中国立体停车库行业市场前景趋势及竞争格局与投资研究报告
- 2025-2030年中国监视器支架行业市场现状供需分析及投资评估规划分析研究报告
- 四川机电职业技术学院《环境与可持续发展导论》2023-2024学年第二学期期末试卷
- 广西蓝天航空职业学院《化工原理实验下》2023-2024学年第二学期期末试卷
- 2025年湖北省新华书店(集团)有限公司招聘笔试参考题库含答案解析
- 燃气公司新员工入职三级安全教育培训
- 黑龙江商业职业学院《生活中的科学》2023-2024学年第二学期期末试卷
- 2025年中国铁路沈阳局集团有限公司招聘笔试参考题库含答案解析
- 水泥搅拌桩培训
- 电网工程设备材料信息参考价(2024年第四季度)
- 2025年专利使用合同范本
- 数据中心运维服务投标方案(技术标)
- 2025届高考英语复习读后续写练习:雪山遇险:绝境中盼来的生机+课件
- 2025-2030全球等离子体仿真软件行业调研及趋势分析报告
- 2025年全年日历-含农历、国家法定假日-带周数竖版
评论
0/150
提交评论