您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 作品1基于单片机的简易科学计算器的设计
基于单片机的简易科学计算器的设计作者:李浩邹艳辉学院:电子科学与工程学院第一章引言从某种程度上来讲,人类的科学史就是科学计算的历史。从祖冲之把圆周率精确到小数点后七位到最近英国推出的运算速度达到每秒100万亿次的超级计算机,计算速度被不断地刷新。由于科学计算器早已普及,并具有体积小,价格便宜,性能优良的特点。因此我们设计的计算器只是基于单片机运算功能所进行的一次实验性的制作,从中学习一个一般性的人机交互系统的设计、制作和调试的流程。并从中认识和了解计算器的运算程序设计的一般方法。设计目标:实现8位以内整数的四则混合运算。并可以显示8位整数和小数。运算速度达到一般的计算器的速度。第二章方案选择计算器的三大组成部分为按键部分,运算控制部分和显示部分。按键部分包括数字键(0—9),符号键(“+、-、*、/”)和控制键(“=、CLR”)。运算控制部分是单片机。显示部分显示运算数和运算结果。方案一:键盘部分用一对一键盘,需16个按键,显示用液晶屏。方案二:键盘部分用4*4按键,显示用8位数码管,动态显示。方案确定和论证:方案一:键盘制作容易,扫描简单,但浪费单片机IO口资源;液晶显示效果好,但成本太高。方案二:键盘制作稍难,按键编码扫描程序复杂,但只需一个P1口;8位数码管成本低,动态显示节约IO口,但亮度不够,需加驱动。整体上看方案二更节约成本,对制作和程序设计要求更高,因此选择方案二。第三章总体设计计算器硬件整体框图:4*4键盘单片机图3_1计算核心部件是单片机。利用单片机的运算部件进行四则混合运算。本系统外部接口部件较少。因此硬件制作比较容易。要实现四则混合运算并显示8位以内整数和小数,由于单片机片内RAM有限,对浮点型数据和长整型的存储和显示不利,则说明程序设计十分重要,也相对困难。总体来说。本系统构成简单,设计思想明确,关键在于软件编程。程序流程图如下:图3_2第四章单元电路和软件模块的设计第一节硬件电路设计一系统核心——STC89C58STC89C58是一个低功耗,高性能CMOS8位单片机,片内含32kBytesISP(In-systemprogrammable)的可反复擦写100000次的Flash只读程序存储器。器件采用STC公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的STC89C58可为许多嵌入式控制应用系统提供高性价比的解决方案。STC89C58具有如下特点:40个引脚,32kBytesFlash片内程序存储器,256bytes的随机存取数据存储器(RAM),2K扩展RAM,32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,3个16位可编程定时计数器,1个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。见图3-18位数码管显示驱动电路此外,STC89C58设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。主要功能特性:·兼容MCS-51指令系统·32k可反复擦写(100000次)ISPFlashROM·32个双向I/O口·4.5-5.5V工作电压·3个16位可编程定时/计数器·时钟频率0-40MHz·全双工UART串行中断口线·256x8bit内部RAM·2个外部中断源·低功耗空闲和省电模式·中断唤醒省电模式·3级加密位·看门狗(WDT)电路·软件设置空闲和省电功能·灵活的ISP字节和分页编程·双数据寄存器指针二显示电路模块采用八个八位共阳极数码管进行动态显示,即显示时用P0口发送段码(低电平有效),P2口发送位码(高电平有效),经过74ls373驱动后,数码管可以正常显示八位整数,由于加入了驱动,所以不加译码器,直接在程序里进行了编码,可以直接输出显示。如下图所示。三键盘扫描电路模块采用4*4键盘,16个键盘成4*4矩阵排列,排成4行和4列,用4个I/O口接行,4个I/O口接列,扫描是逐次将行变为低电平,同时读列的值,若有键按下则必定有一列为低电平,通过行和列的组合就可以确定是哪个按键被按下。此方法电路连接和编程都比较麻烦,需要进行键盘编码,但是可以节省单片机的I/O口资源。图3-1第二节软件模块设计一键盘扫描程序键盘扫描程序包括三个子程序,读键值子程序,按键抬起子程序和键盘编码。一次读键值流程图:为空不为空未抬起抬起图4_3读键值时由于每次按键的时间大概在上百ms左右,而在按键时会产生按键的抖动问题,若不解决可能造成一次按键多次读入。解决的办法就是发现有键按下后等待一段时间在进行读键值,这样就不会出现多次读入的问题。二运算主程序开始读键值按键抬起返回编码值主程序中主要完成加减运算,乘除运算和四则混合运算。以下给出各运算的流程图。1加减运算流程图+/-=+/-图4_42乘除运算流程图*//*//图4_53加减乘除混合运算流程图*//+/-数值a数值ba=a+/-ba=a+/-b数值a数值ba=a*//ca=a*//b数值a+/-*//*//=*//+/-图4_6三显示子程序显示函数流程图:显示函数中首先判断整数位数,根据整数位数来判断小数位数,得到小数位数以后,将浮点型数转换为长整型数进行显示。图4_7第五章整体测试数值c数值ba=a+/-/*//c数值cb=b*//ca=a+/-(b*//c)a=a+/-(b*//c)数值a判断整数位数判断小数位数发送显示结束第六章总结至此,本系统已经全部制作调试成功了。基本上完成了八位整数的运算,能够进行四则混合运算,结果可以显示八位整数,小数和负数,系统稳定可靠,精度较高。但是由于运算部分定义的变量是浮点型数据,由于浮点型数据有效位数是6位,当进行多位数字运算的时候会出现一定误差,影响运算精度,同时对小数位数的判断产生影响,当位数超过6位时,可能会出现判断错误。附件:程序源代码#includereg51.h#defineucharunsignedchar#defineuintunsignedint计算表达式计算结果实际值误差48+867+4239=515451540953-486-27=4404400862-674+294=482482035*76=2660266001/8=0.1250.1250926/68=13.61764813.6176470.000001563/27/7=2.97883622.97883590.0000002729*3/47=46.53191646.5319150.0000018+4*3=2020094-27/4=87.2587.25056*89/32+256*9=2459.7524.59750425769-24863*2+2746/9=376348.11376348.120.01#defineKEY_NULL0xffcodeucharled_code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};floats1=0,s2=0,s3=0,d=0;ucharm=0,n=0,f1=0,f2=0,f3=0,f4=0;bitf5=0,f6=0,l_1=0,l_2=0;/*按键的二次编码函数*/ucharkeycode(ucharnum){uchartemp;switch(num){case0x77:temp=1;break;case0x7b:temp=2;break;case0x7d:temp=3;break;case0x7e:temp=10;break;case0xb7:temp=4;break;case0xbb:temp=5;break;case0xbd:temp=6;break;case0xbe:temp=11;break;case0xd7:temp=7;break;case0xdb:temp=8;break;case0xdd:temp=9;break;case0xde:temp=12;break;case0xe7:temp=0;break;case0xeb:temp=14;break;case0xed:temp=15;break;case0xee:temp=13;break;default:temp=KEY_NULL;break;}return(temp);}//延时函数,这里用来按键的去抖动处理voiddelay(uintx){while(x--);}/*读键值子程序*/ucharreadkey(void){uchari=0;ucharkey1,key2;ucharm=0x01;P1=0xf0;if((P1&0xf0)==0xf0)returnKEY_NULL;for(i=0;i4;i++){P1=~m;key1=P1;if((key1&0xf0)!=0xf0){delay(4000);key2=P1;if(key1==key2){return(keycode(key1));}else{return(KEY_NULL);}}m=1;}return(KEY_NULL);}/*按键抬起功能*/ucharkeypop(void){ucharkey1,key2;key1=readkey();if(key1==KEY_NULL)returnKEY_NULL;do{key2=readkey();}while(key2!=KEY_NULL);returnkey1;}/*用于加减运算*/voidjisuan(){if(f1+f2==1){if(l_1==1){s1=s1+s2;s2=0;f1--;l_1=f1;}else{s1=s1-s2;s2=0;f2--;l_1=f1;}}if(f1==2){s1=s1+s2;s2=0;f1--;l_1=f1;}if(f2==2){s1=s1-s2;s2=0;f2--;l_1=f1;}if(f1==1&&f2==1){if(l_1==1){s1=s1+s2;s2=0;f1--;l_1=f1;}else{s1=s1-s2;s2=0;f2--;l_1=f1;}d=s1;}}/*乘除运算和四则混合运算*/voidjisuan2(){if(f5==1&&f1+f2==0)//*={if(l_2==1){s1=s1*s3;if(s199999999)f6=1;}elses1=s1/s3;f1=f2=f3=f4=f5=0;s2=0;s3=0;d=s1;l_1=l_2=0;}if(f5==1&&f1+f2==1)///+*={if(l_2==1){s2=s2*s3;if(s299999999)f6=1;}elses2=s2/s3;if(l_1==1)s1=s1+s2;elses1=s1-s2;f1=f2=f3=f4=f5=0;s2=0;s3=0;d=s1;l_1=l_2=0;}if(f3+f4==1&&f1==0&&f2==0)///**{if(l_2==1){s1=s1*s3;if(s199999999)f6=1;}elses1=s1/s3;s3=0;d=s1;l_2=f3;}if((f1+f2)==1&&f3==0&&f4==0)///*+{if(l_2==1){s1=s1*s3;if(s199999999)f6=1;}elses1=s1/s3;s3=0;d=s1;l_2=0;}if(f1+f2==2)///+*+{if(l_2==1){s2=s2*s3;if(s299999999)f6=1;}elses2=s2/s3;s3=0;d=s2;l_2=0;}if(f1+f2==1&&f3+f4==1)///+**{if(l_2==1){s2=s2*s3;if(s299999999)f6=1;}elses2=s2/s3;s3=0;d=s2
本文标题:作品1基于单片机的简易科学计算器的设计
链接地址:https://www.777doc.com/doc-2709315 .html