当前位置:文档之家› 科学计算器—单片机课程设计报告

科学计算器—单片机课程设计报告

湘潭大学单片机课程设计报告——计算器设计班级:2008级通信工程二班学号:**********姓名:陶庆权日期:2011.3.25目录一、设计任务和性能指标 (1)1.1设计任务 (1)1.2性能指标 (1)二.设计方案 (2)三.系统硬件设计 (2)3.1单片机最小系统 (2)3.2键盘接口电路 (3)3.3数码管显示电路 (3)3.4按键提示电路 (3)四、系统软件设计 (4)4.1键盘扫描子程序设计 (4)4.2运算程序设计 (5)4.3显示子程序设计 (5)4.4主程序设计 (5)五、调试及性能分析 (6)5.1调试步骤 (6)5.2性能分析 (7)六、心得体会 (7)参考文献 (7)附录1 系统硬件电路图 (8)附录2程序清单................................................8-18一、设计任务和性能指标设计任务基本功能:利用89c51作为主控器组成一个四则运算的计算器。

发挥部分:增加一种以上的科学计算功能。

可选器件:51系列单片机、6264、7段LED数码管、74LS244或74LS240、与非门等二.设计方案按照系统设计的功能的要求,确定设计系统由主控模块、显示模块、按键提示模块、键扫描接口电路、扩张功能模块共五个模块组成,电路系统构成框图如图1.1所示。

主控芯片使用51系列STC89C54单片机。

键盘电路采用4*4矩阵键盘电路。

显示模块采用4位共阴极数码管。

按键提示电路采用5V扬声器。

三.系统硬件设计3.1单片机最小系统单片机最小系统就是支持主芯片正常工作的最小电路部分,包括主控芯片、复位电路和晶振电路。

主控芯片选取STC89C54RC芯片,因其具有良好的性能及稳定性,价格便宜应用方便,可直接用USB线下载代码。

晶振选取11.0592MHz,晶振旁电容选取20pF。

采用按键复位电路,电阻分别选取100Ω和10K,电容选取0.1μF。

以下为单片机最小系统硬件电路图。

单片机最小系统硬件电路3.2键盘接口电路:计算器所需按键有:数字键:0、1、2、3、4、5、6、7、8、9.功能键:。

+、-、*、/ 、 = 、C( 清零)。

共计16个按键,采用4*4矩阵键盘,键盘的行和列之间都有公共端相连,四行和四列的8个公共端分别接P1.0~P1.7,这样扫描P1口就可以完成对矩阵键盘的扫描,我们就可以得到是哪个键按下,从而完成键盘的功能。

以下为键盘接口电路的硬件电路图:键盘接口电路3.3数码管显示电路本课程设计采用八位数码管显示,为了节约I/O口资源,从而采用动态扫描的方式,P0口段选,P2位选,由于是P0口段选所以要接上拉电阻,显示电路部分如下:数码显示电路硬件电路图3.4按键提示电路按键提示电路就是在有按键的时候提示有键按下,发出声音提示,提示使用者按键有效。

这里就采用5V扬声器作为提示设备,由P3.7对其进行控制。

系统整体硬件电路图见附录一四、系统软件设计4.1键盘扫描子程序设计采用先令高四位为低电平,高四位为高电平,然后看扫描键盘,看哪一列按下,再使高四位为高,低四位为低。

再扫描行,进而确定是哪个键按下。

键盘部分的子程序如下:uchar Keyscan(void){uchar i,j,temp,Buffer[4] ={0xef, 0xdf, 0xbf, 0x7f};for(j=0; j<4;j++){P1 = Buffer[j];/*以下三个_nop_();作用为让 P1口的状态稳定*/delay();temp = 0x01;for(i=0; i<4;i++){if(!(P1 &temp)){return (i+j*4);}temp <<= 1;}}}结合主程序部分的代码,实现键盘扫描。

4.2运算部分程序设计本部分采用全局变量a、b、c、d,将运算的结果都存入这几个变量里,通过将这些变量的值分部分存入数组里的各个元素,从而改变显示的值。

程序见附录二。

4.3显示子程序设计显示部分采用定时中断方式,每隔一段时间扫描一次数组xx[],从而使得各个时段数组中的数值显示在数码管上。

代码如下:void diaplay(void) interrupt 1{uchar len;TH0=(65536-2000)/256;TL0=(65536-2000)%256;P2=Disbuf[dcounter];len=dcounter;P0=xx[len];dcounter+=1;if(dcounter==8){dcounter=0;}}4.4主程序设计主程序既把以上各子程序串连成一个整体,使整个程序循环运行,同时启动定时。

中断部分的显示部分与主程序部分独立,一直执行;主程序一直调用扫描电路,若有键按下,则会进入以下的主程序部分执行相应的运算操作并作出相应的处理。

通过计算后,数组内的值发生改变,显示的值也会同时发生改变。

之后再进行键盘扫描,如此反复运行,就构成了程序的整体。

整体程序清单见附录二。

五、调试及性能分析5.1调试步骤焊接前考虑好布局,采用较为合理的一种,为了使得板子简洁不易出错,采用公共电源和地。

焊接插槽时先不要把所有的引脚都焊接上,以免在后面发现错误时无法再改变布局。

应先焊好两个引脚以固定好插槽就够了。

在焊接好器件后,先不要将芯片插在芯片座上,要先验证先板上电源是否好用,有无短路等。

接上USB电源,用万用表测量个芯片座对应电源和地之间的电压值,观察电压值是否正常。

再插上单片机测试最小系统是否可用,一切正常后方可将其它芯片插入芯片座,以继续测试其他功能。

将芯片插上后,对各个模块进行调试,按键是否工作正常,数码管是否显示正常等。

编写相关部分的测试程序对其进行测试。

各部分硬件检测无误后,下载程序进行整体调试,一切正常后,结束调试过程。

成功下载程序后,查看结果,发现数码管显示数值不正常,首先测试是否是数码管有损坏,自己编一个点亮所有数码管所有段的程序进行测试,结果发现所有数码管e端不亮,说明数码管正常,而是前面部分的电路或芯片有问题。

通过用电压表测试发现是芯片74ls244损坏,输入端对应的输出端输出数值出现反向现象,从而导致前面的结果。

更换好的芯片后,从新下载计算器程序显示出现新的乱码问题。

归零后显示的数值不是零,而是乱码,自习观察发现刚好是显示零的显示数值按相反的顺序排列显示出来的情况,从而可以断定是P0口的各个位与74ls244接口的顺序接反了,调整后归零正常显示0。

通过以上的修正后仍不能进行正常的计算,同样出现乱码,最后考虑到我程序中采用了P3口引脚控制扩张功能,而P3口是有部分引脚接在下载电路部分max232芯片上,肯定会有一定影响,用电压表测试其对应引脚电压发现电平有变化,故可以确定会影响程序的执行,撤去MAX232后可正常运行。

5.2性能分析对于计算器的性能,主要的衡量指标就在于计算的精度,本次制作的计算器性能情况如下:加法运算:8位加法运算,和值不超过一亿,若超过上限,则显示错误提示ERROR,扬声器报警提示。

减法运算:8位减法运算,若结果为负,提示ERROR。

乘法运算:积不超过一亿的乘法运算,若超出上限,显示错误提示ERROR,扬声器报警提示。

除法运算:支持小数运算,结果最大保留四位小数,若除数为0,则输出ERROR扬声器报警提示。

小数运算:可支持小数输入运算,结果最大精确到0.0001,优先显示整数部分,剩余部分显示小数,不显示无效的零。

扩展功能:支持求自然对数,常用对数,开方,求e的幂次运算。

所有功能的计算都通过了与电脑计算器计算结果的对比验证,完全符合运算要求。

通过对实际性能的分析,可以得到本次设计满足设计的要求。

六、心得体会本次单片机课程设计是学了单片机后的第一次实际应用,获益匪浅。

通过本次课程设计我真正的自己完成了对给定要求系统的硬件选择及设计、电路设计、软件设计以及对成品的调试过程。

通过本次试验发现自己可以通过自己的知识真正做出可以实际应用的电子产品,增强自己的自信心,在设计过程中发现问题,解决问题,虽然过程有点累,但通过学习又扩张了自己的知识面,学到了新的单片机内容。

刚开始写程序时问题一大堆,就算是写个小程序验证下自己的某个想法都很吃力,但经过痛苦的四天钻研后,才有了实质的进展,第五天基本写出了程序,第六天完善了扩展功能同时消除了执行过程的按键稳定性问题,使得可以在长期按下键的时候同样不会影响数字的输入,在调试过程中同样经历了诸多问题,这些在“调试步骤”部分做了详细说明,由于只有我做了八位显示的计算器,且做了部分扩张功能和支持小数运算,与其他人都的不同,故出现问题都得完全靠自己解决,虽然有难度,但更有挑战性和成就感,相信在以后的学习工作中会大有裨益的。

在收获的同时也发现了自己诸多方面的不足,基础知识不够扎实,实际操作还不够熟练,很多东西都只停留在理论上,对于实际的硬件器件及芯片不够了解,在应用时比较吃力,说明没有将理论很好的与实际联系,同时自己电子方面知识面还不够广,应该加强在电子方面的相关知识,提高自己的电子专业技能。

参考文献[1][2][3][4]刘琨孙春亮.单片机C语言入门.人民邮电出版社,2008杨辉先黄辉先.单片机原理及应用.人民邮电出版社,2009谭浩强 .C语言程序设计.清华大学出版社,2008 姜志海赵艳雷.单片机的C语言程序设计与应用,2008附录1系统硬件电路图附录2程序清单#include<reg52.h>#include<intrins.h>#include<math.h>typedef unsigned char uchar;typedef unsigned int uint;void delay();uchar Keyscan(void);void result_a(void);void diaplay(void);void Delay_1ms(uint i);uchar vie_a[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar exchg_a[16]={7,8,9,13,4,5,6,12,1,2,3,11,14,0,15,10};uchar xx[8];uchar xxu[8];void Speak_a(void);sbit spp=P3^7;//响铃sbit cl3=P3^6;//小数点sbit cl=P3^1;//求lnsbit cl0=P3^2;//开方sbit cl1=P3^3;//求logsbit cl2=P3^4;//求e的x次幂uchar flo[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; uchar zz[8]={0x77,0x3f,0x77,0x77,0x79};uchar Disbuf[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};uchar yy[8]={0x3f,0,0};float a=0,b=0,c;uchar L=1;uuuuuuuu_a=0,dcounter=0;vvvvvvvv(void){uchar singlp_a=1,n=1;uchar key=18;uchar all_m=0,ent_a=0,att=1;signed long s,r;TMOD=0x01;TH0=(65536-2000)/256;TL0=(65536-2000)%256;EA=1;ET0=1;TR0=1;spp=0;while(1){if(singlp_a==1){singlp_a=0;P3=0x7f;if(P3!=0x7f){Delay_1ms(2);if(cl==0){Speak_a();cal_a=14;//求以㏑xkey=15;}if(cl0==0){Speak_a();cal_a=15;//开方key=15;}if(cl1==0){Speak_a();cal_a=16;//求以十为底对数key=15;}if(cl2==0){Speak_a();cal_a=17;//求e的x次幂key=15;}if(cl3==0){att=0;xx[0]=xx[0]+0x80;}}P1=0x0f;if(P1!=0x0f){Delay_1ms(2);if(P1!=0x0f){key=exchg_a[Keyscan()];Speak_a();}}}P1=0x0f;P3=0x7f;if(P1==0x0f&&P3==0x7f){singlp_a=1;}if(key<=9&&key>=0){if(all_m==0){if(ent_a==0){uchar i;eee_a=1;fff(i=0;i<=7;i++){xx[i]=0;}}else{}if(att==1){uchar i;a=a*10+key;for(i=7;i>0;i--){xx[i]=xx[i-1];}xx[0]=vie_a[key];key=18;}else{uchar i;double m;for(i=7;i>0;i--){xx[i]=xx[i-1];}xx[0]=vie_a[key];m=key;for(i=1;i<=n;i++){m=m/10;}a=m+a;n++;key=28;}}else{if(att==1){uchar i;b=b*10+key;for(i=7;i>0;i--){xx[i]=xx[i-1];}xx[0]=vie_a[key];key=18;}else{uchar i;double m;for(i=7;i>0;i--){xx[i]=xx[i-1];}xx[0]=vie_a[key];m=key;for(i=1;i<=n;i++){m=m/10;}b=m+b;n++;key=28;}}}if(key>=10&&key<=13) {uchar i;cal_a=key;for(i=0;i<=7;i++){xx[i]=xxu[i];}all_m=1;key=18;att=1;n=1;}if(key==14){uchar i;key=18;eee_a=0;fff(i=0;i<=7;i++){xx[i]=yy[i];}a=0;b=0;c=0;all_m=0;L=1;att=1;n=1;cal_a=0;}if(key==15){uchar i;all_m=0;key=28;for(i=0;i<=7;i++){xx[i]=0;}result_a();//调用求计算结果if(L==1){if(c==0){xx[0]=0x3f;}if(c>=0.0001){r=c;s=10000*(c-r);n=0;xx[n]=vie_a[s%10];if(s%10!=0){n++;}if(c>=0.001){r=c;s=1000*(c-r);xx[n]=vie_a[s%10];if(n==0&&s%10==0){}else{n++;}if(c>=0.01){r=c;s=100*(c-r);xx[n]=vie_a[s%10];if(n==0&&s%10==0){}else{n++;}if(c>=0.1){r=c;s=10*(c-r);xx[n]=vie_a[s%10];if(n==0&&s%10==0){}else{n++;}if(c>=1){s=c;xx[n]=flo[s%10];n++;if(c>=10){s=c/10;xx[n]=vie_a[s%10];n++;if(c>=100){s=c/100;if(n>=8){uchar i;for(i=0;i<=7;i++){xx[i]=xx[i+1];}xx[n-1]=vie_a[s%10];}else{xx[n]=vie_a[s%10];n++;}if(c>=1000){s=c/1000;if(n>=8){uchar i;for(i=0;i<=7;i++){xx[i]=xx[i+1];}xx[n-1]=vie_a[s%10];}else{xx[n]=vie_a[s%10];n++;}if(c>=10000){s=c/10000;if(n>=8){uchar i;for(i=0;i<=7;i++){xx[i]=xx[i+1];}xx[n-1]=vie_a[s%10];}else{xx[n]=vie_a[s%10];n++;}if(c>=100000){s=c/100000;if(n>=8){uchar i;for(i=0;i<=7;i++){xx[i]=xx[i+1];}xx[n-1]=vie_a[s%10];}else{xx[n]=vie_a[s%10];n++;}if(c>=1000000){s=c/1000000;if(n>=8){uchar i;for(i=0;i<=7;i++){xx[i]=xx[i+1];}xx[n-1]=vie_a[s%10];}else{xx[n]=vie_a[s%10];n++;}if(c>=10000000){s=c/10000000;if(n>=8){uchar i;for(i=0;i<=7;i++){xx[i]=xx[i+1];}xx[n-1]=vie_a[s%10];}else{xx[n]=vie_a[s%10];n++;}if(c>=100000000){for(i=0;i<=7;i++){xx[i]=zz[i];}}}}}}}}}}else{xx[n]=0xbf;}}else{xx[n+1]=0xbf;xx[n]=0x3f;}}else{xx[n+2]=0xbf;xx[n+1]=0x3f;xx[n]=0x3f;}}else{xx[n+3]=0xbf;xx[n+2]=0x3f;xx[n+1]=0x3f;xx[n]=0x3f;}}}}}}void result_a(void){switch(cal_a){case 0:c=a;break;case 10:c=a+b;break;case 11:if(a<b){uchar i;for(i=0;i<=7;i++){xx[i]=zz[i];}L=0;}else{c=a-b;}break;case 12:c=a*b;break;case 13:c=a/b;break;case 14:c=log(a);a=c;break;case 15:c=sqrt(a);a=c;break;case 16:c=log10(a);a=c;break;case 17:c=exp(a);a=c;break;default:c=0;}}void Delay_1ms(uint i)//1ms延时{uchar x,j;for(j=0;j<i;j++)for(x=0;x<=148;x++);}void delay(){int i,j;for(i=0; i<=10;i++)for(j=0; j<=2;j++);}20uchar Keyscan(void){uchar i,j,temp,Buffer[4] ={0xef, 0xdf, 0xbf, 0x7f};for(j=0; j<4;j++){P1 = Buffer[j];/*以下三个_nop_();作用为让 P1口的状态稳定*/delay();temp = 0x01;for(i=0; i<4;i++){if(!(P1 &temp)){return (i+j*4);}temp <<= 1;}}}void diaplay(void) interrupt 1{uchar len;TH0=(65536-2000)/256;TL0=(65536-2000)%256;P2=Disbuf[dcounter];len=dcounter;P0=xx[len];dcounter+=1;if(dcounter==8){dcounter=0;}}void Speak_a(void){uchar i;for(i=0;i<=20;i++){spp=1;delay();delay();21spp=0;delay();delay();}}22。

相关主题