1、用单片机语言设计16位加法计算器实验报告综述单片机课程设计实验报告课程设计名称:电子计算器课程设计单位:10计应(1)班课设小组成员: 徐凡(1060310039) 凡平(1060310058)彭浩(1060310045)桂银(1060310010)潘光卉(1060300033)完成时间:2012年04月02日至2012年04月 24 日单片机课程设计实验报告课程设计题目:简易计算器作品功能描述:当通过输入键盘数字时,能够在显示器上显示输出的数值,并且通过想实现的简单运算功能,实现计算器的加、减、乘、除和清零,并将结果显示出来。 小组成员工作分工:徐凡:程序主框架的构造和主要功能函数的设计。凡
2、平:原理图的设计和硬件的焊接。彭浩:基本功能函数的设计(“+,-,*,/”)。桂银:程序流程图的设计和键盘扫描程序的实现。潘光卉:编写文档和功能测试。硬件电路设计:本设计中我们用的是AT89C52芯片,LCD1602 (PROTEUS中为LM016L) 就是那个液晶屏,因为可以显示2行16个字符,故叫做LCD1602.11.0592M或12M晶振(CRYSTAL),两者均可,但要涉及到串口需选用12MKEYPAD-SMALLCALC就是那个4X4键盘电容2030PF(CAP),接最小电路电容10PF主要接复位电路RESPACK-8排阻,为20K的,一个引脚接正极,另8个引脚接I/O口接RES电
3、阻10K,接复位电路 实物照片:实物照片.jpg原理说明:1,上电后,屏幕初始化;2,计算。按下数字键,屏幕显示要运行的第一个数字,再按下符号键,然后再按下数字键,屏幕显示要运算的第二个数字,最后按下“=” 号键,屏幕上显示出计算结果。3,如果要再次计算,可以按下“ON/C”键清零,或者继续按下数字键,即可重新计算。789456123-ON/C0=+键盘使用说明如下:按键功能说明:“+”实现两个数的相加“-”实现两个数的相减“”实现两个数的乘积“”实现两个数商的运算“ON/C”计算器显示的清零和接通电源程序控制流程图:软件设计: 在程序设计方法上,模块化程序设计是单片机应用中最常用的程序设计方
4、法。设计的中心思想是把一个复杂应用程序按整体功能划分成若干个相对独立的程序模块,各模块可以单独设计、编写、调试、然后组合起来,这种方法便于设计和调式,容易实现多个程序共存,但是各个模块之间的连接有一定得难度。根据需要我们可以采用自上而下的程序设计方法,此方法先从主程序开始设计,然后再编制各从属程序和子程序,层层细化逐步求精,最终完成一个复杂程序的设计,这种方法比较符合人们的日常思维,缺点是一级的程序错误会对整个程序产生影响。 程序调试中出现的问题及解决的办法:1 算器无法实现连加现象。例如:顺序输入1+2=之后会显示结果为3,计然后继续输入+1,结果并不为4。错误原因我们认为是在获得结果3之后
5、没有将数据3放入操作数缓存,所以我们在等号运算执行后的代码下面将计算机结果放入操作数缓存的代码,以此来实现计算器连加的功能。2 编程前要加流程图,这样会使思路清晰。3 程序的结构要设计的合理,避免上下乱调用的现象,这样会使程序更加清晰化。4 编程过程中要注意加注释或分割线,否则,在程序过长时容易变得很乱,不便于查找或更改。5 计算器没有实现小数操作,因为数字存储我们用int来存放,进行相除功能的时候,也是用int计算,计算结果是整除的.没有小数位.6 收获,体会与建议在此次课程设计中,通过团队的合作和网上找的资料,主要掌握了数码管显示的编程,数据在内部运算的编程方法。调试也是此次的重点,这其中
6、最重要的就是软件的台式了,也是我们此次问题出现最多的地方,这要求我们队每个模块在整个程序中的作用了如子掌。通过此次课程设计,我们发现我们对程序的掌握还不够,尤其是单片机汇编语言掌握的不牢固。这次课程设计使我懂得实践的重要性,只有理论知识还远远不够,只有把所学的理论知识与实践相结合才算是掌握了所学的只是。此次设计的单片机十分简易,只实现了基本的加减乘除,所以这次我们设计的计算器是并不实用的,但是通过本次课程设计,是我们了解到了如何使用单片机来进行计算器的设计,学会了如何对LCD灯进行控制,也学会了如何使用键盘来获得输入的数据,同时提高了我们的编程能力。在设计计算器的过程中我们遇到了很多问题,解决
7、了这些问题之后,提高了我们自己动手解决问题得能力。这次单片机设计中使我们对单片机有了更深的了解。单片机编程需要对电路的认真分析,然后画出流程图,善于查阅相关资料才能编出好的程序。这次单片机应用系统的设计中遇到很大的困难,主要原因是平时的只是掌握的不够,通过查阅很多资料和类似的论文,才做成的。由于时间仓促,经验少,只是局限,设计有一定得不足,但是通过此次设计自己的能力提高了不少,我会认真总结设计中的经验教训,为以后更多的设计做好铺垫。参考文献:1 2 ZigBee技术 #includereg51.h#includelcd1602.h#includebutton.hchar str16=0;cha
8、r str26=0;char op = 0;char result6=0;int num1=0;int num2=0;int nresult=0;char nIndex=0;char xpos=0;bit bover=0;/是?否?计?算?玩?bit bop=0;/只?能输?一?次?操作符?bit berror=0;/出?现?了?错误bit bnum2=0;/记?录?第二t个?数y字?记?录?没?有D.bit bnum1=0;/记?录?按下?第一?个?数y字?没?有Dvoid main() char key =0; char flag=0; int i=0; LCD_initial(); wh
9、ile(1) key = _GetKey(); delay(100); if(key!=-1) if(key=0)/数y字?键 if(berror=0) if(bover=1)/计?算?完后第二t次?输?入?数y字? bover=0; bnum1=0; bnum2=0; LCD_cls(); flag=0; nIndex=0; xpos=0; bop=0; for(i=0;i=5)/输?入?的?数y字?过y长 berror=1; /记?录?有D错误 LCD_printc(xpos+,1,key+48); LCD_prints(10,2,Error!); else if(nIndex =5)/输
10、?入?的?数y字?过y长 berror=1; /记?录?有D错误 LCD_printc(xpos+,1,key+48); LCD_prints(10,2,Error!); else if(nIndex 5) if(!(nIndex=0&key=0)/第一?个?数y字?不?会是?0 str2nIndex+=key+48; bnum2=1;/记?录?第二t个?数y字?已?按下?. LCD_printc(xpos+,1,key+48); else if(key=10)/操作符? if(berror=0&bnum1) /没?有D错误出?现?,按下?了?第一?个?数y if(bop=0) op=key;
11、 flag=1; nIndex=0; if(key=10)/ / LCD_printc(xpos+,1,/); else if(key=11)/ * LCD_printc(xpos+,1,*); else if(key=12)/ - LCD_printc(xpos+,1,-); else if(key=13)/ + LCD_printc(xpos+,1,+); bop = 1; else if(key=14)/ = if(berror=0&bnum2=1)/没?有D错误出?现?,按下?了?第二t个?数y bover=1;/已?计?算?完 bnum2=0;/恢?愎1已?前的? LCD_print
12、c(xpos,0,=); if(13=op) /加法 num1 = _atoi(str1); num2 = _atoi(str2); nresult=num1+num2; if(nresultnum1|nresultnum2) berror=1; LCD_prints(10,2,Error!); else if(nresult0) _itoa(nresult,result); LCD_prints(0,2,result); else berror=1; LCD_prints(10,2,Error!); else if(12=op) /减?法 num1 = _atoi(str1); num2 =
13、 _atoi(str2); nresult=num1-num2; _itoa(nresult,result); LCD_prints(0,2,result); else if(11=op) /乘?法 num1 = _atoi(str1); num2 = _atoi(str2); nresult=num1*num2; if(nresultnum1|nresult0&nresult=32767) _itoa(nresult,result); LCD_prints(0,2,result); else berror=1; LCD_prints(10,2,Error!); else if(10=op)
14、/除y法 num1 = _atoi(str1); num2 = _atoi(str2); nresult=num1/num2; _itoa(nresult,result); LCD_prints(0,2,result); else if(key=15)/ON/C键 for(i=0;i6;i+) str1i=0; str2i=0; resulti=0; bnum1=0; bnum2=0; num1=0; num2=0; op=0; xpos=0; nIndex=0; flag=0; bop=0; berror=0;/ LCD_cls(); LCD_printc(0,1,0); delay(10)
15、; /* 1602LCD显?示?头文?件t- 三y维?电?子工作室 -芯?片?:oAT89S52晶振?:o11.0593M描述?:o作者?:o陈?磊 日?期:o2010/06/05 */#include lcd1602.h#includereg51.h/* LCD数y据Y、控?制?口定义?*/#define LCD_DATA P0 /LCD的?数y据Y口sbit LCD_BUSY=LCD_DATA7; /LCD忙|信?号?位?sbit LCD_RW=P21; /LCD读写控?制?sbit LCD_RS=P20; /LCD寄?存?器选?择?sbit LCD_EN=P22; /LCD使1能信?号?
16、/* 检测aLCD状态?,?看它是?不?是?还1在忙|呢?*/void LCD_check_busy(void) while(1) LCD_EN=0; LCD_RS=0; LCD_RW=1; LCD_DATA=0xff; LCD_EN=1; if(!LCD_BUSY)break; LCD_EN=0;/* LCD清?屏*/void LCD_cls(void) LCD_check_busy(); LCD_RS=0; LCD_RW=0; LCD_DATA=1; LCD_EN=1; LCD_EN=0;/*/写指?令?到?LCD*/void LCD_write_instruction(unsigned
17、char LCD_instruction) LCD_check_busy(); LCD_RS=0; LCD_RW=0; LCD_DATA=LCD_instruction; LCD_EN=1; LCD_EN=0;/*/输?出?一?个?字?节数y据Y到?LCD*/void LCD_write_data(unsigned char LCD_data) LCD_check_busy(); LCD_RS=1; LCD_RW=0; LCD_DATA=LCD_data; LCD_EN=1; LCD_EN=0;/*/LCD光a标定位?到?x处|*/void LCD_set_position(unsigned
18、char x) LCD_write_instruction(0x80+x);/*void LCD_go_home(void) /LCD光a标归位? LCD_write_instruction(LCD_GO_HOME);*/*/输?出?一?个?字?符?到?LCD*/void LCD_printc(unsigned char x,unsigned char y,unsigned char lcd_data) if(x=16) if(y=2)x+=64; LCD_set_position(x); LCD_write_data(lcd_data); /*/输?出?一?个?字?符?串?到?LCD*/vo
19、id LCD_prints(unsigned char x,unsigned y,unsigned char *lcd_string) unsigned char i=0; if(x0;i-) for(j=0;j125;j+);char _GetKey() int key=-1; int i=500; P3=0xf0; if(P3 & 0xf0)!=0xf0) P3=0xfe; i=500; while(i-); if(P3 & 0xfe)=0xee) key = 7; if(P3 & 0xfe)=0xde) key = 8; if(P3 & 0xfe)=0xbe) key = 9; if(P3 & 0xfe)=0x7e) key = 10; P3=0xfd; i=500; while(i-); if(P3 & 0xfd)=0xed) key = 4; if(P3 & 0xfd)=0xdd) key = 5; if(P3 & 0xfd)=0xbd) key = 6; if(P3 & 0xfd)=0x7d) key = 11; P3=0xfb; i=500; while(i-); if(P3 & 0xfb)=0xeb) key = 1; if(P3 & 0xfb)=0xdb) key = 2; if(P3 & 0xfb)=0xb
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1