用单片机语言设计16位加法计算器实验报告_第1页
用单片机语言设计16位加法计算器实验报告_第2页
用单片机语言设计16位加法计算器实验报告_第3页
用单片机语言设计16位加法计算器实验报告_第4页
用单片机语言设计16位加法计算器实验报告_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机课程设计实验报告 单片机课程设计实验报告课程设计名称:电子计算器课程设计单位: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电阻10K,接复位电路

3、 硬件原理图实物照片:实物照片.jpg原理说明:1,上电后,屏幕初始化;2,计算。按下数字键,屏幕显示要运行的第一个数字,再按下符号键,然后再按下数字键,屏幕显示要运算的第二个数字,最后按下“=” 号键,屏幕上显示出计算结果。3,如果要再次计算,可以按下“ON/C”键清零,或者继续按下数字键,即可重新计算。789÷456×123-ON/C0=+键盘使用说明如下:按键功能说明:“+”实现两个数的相加“-”实现两个数的相减“×”实现两个数的乘积“÷”实现两个数商的运算“ON/C”计算器显示的清零和接通电源程序控制流程图:LED显示初始值输入值LCD显示按下功

4、能键启动计算器()()按下ON/C键是否继续按下功能键输入数字LED显示按下功能键· 计算结果LED显示是否结束结束否否是是软件设计: 在程序设计方法上,模块化程序设计是单片机应用中最常用的程序设计方法。设计的中心思想是把一个复杂应用程序按整体功能划分成若干个相对独立的程序模块,各模块可以单独设计、编写、调试、然后组合起来,这种方法便于设计和调式,容易实现多个程序共存,但是各个模块之间的连接有一定得难度。根据需要我们可以采用自上而下的程序设计方法,此方法先从主程序开始设计,然后再编制各从属程序和子程序,层层细化逐步求精,最终完成一个复杂程序的设计,这种方法比较符合人们的日常思维,缺点

5、是一级的程序错误会对整个程序产生影响。 程序调试中出现的问题及解决的办法:1 算器无法实现连加现象。例如:顺序输入1+2=之后会显示结果为3,计然后继续输入+1,结果并不为4。错误原因我们认为是在获得结果3之后没有将数据3放入操作数缓存,所以我们在等号运算执行后的代码下面将计算机结果放入操作数缓存的代码,以此来实现计算器连加的功能。2 编程前要加流程图,这样会使思路清晰。3 程序的结构要设计的合理,避免上下乱调用的现象,这样会使程序更加清晰化。4 编程过程中要注意加注释或分割线,否则,在程序过长时容易变得很乱,不便于查找或更改。5 计算器没有实现小数操作,因为数字存储我们用int来存放,进行相

6、除功能的时候,也是用int计算,计算结果是整除的.没有小数位.6收获,体会与建议在此次课程设计中,通过团队的合作和网上找的资料,主要掌握了数码管显示的编程,数据在内部运算的编程方法。调试也是此次的重点,这其中最重要的就是软件的台式了,也是我们此次问题出现最多的地方,这要求我们队每个模块在整个程序中的作用了如子掌。通过此次课程设计,我们发现我们对程序的掌握还不够,尤其是单片机汇编语言掌握的不牢固。这次课程设计使我懂得实践的重要性,只有理论知识还远远不够,只有把所学的理论知识与实践相结合才算是掌握了所学的只是。此次设计的单片机十分简易,只实现了基本的加减乘除,所以这次我们设计的计算器是并不实用的,

7、但是通过本次课程设计,是我们了解到了如何使用单片机来进行计算器的设计,学会了如何对LCD灯进行控制,也学会了如何使用键盘来获得输入的数据,同时提高了我们的编程能力。在设计计算器的过程中我们遇到了很多问题,解决了这些问题之后,提高了我们自己动手解决问题得能力。这次单片机设计中使我们对单片机有了更深的了解。单片机编程需要对电路的认真分析,然后画出流程图,善于查阅相关资料才能编出好的程序。这次单片机应用系统的设计中遇到很大的困难,主要原因是平时的只是掌握的不够,通过查阅很多资料和类似的论文,才做成的。由于时间仓促,经验少,只是局限,设计有一定得不足,但是通过此次设计自己的能力提高了不少,我会认真总结

8、设计中的经验教训,为以后更多的设计做好铺垫。参考文献:1 2 ZigBee技术 #include"reg51.h"#include"lcd1602.h"#include"button.h"char str16=0;char 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;/只?能¨

9、¹输º?一°?次ä?操¨´作Á¡Â符¤?bit berror=0;/出?现?了¢?错䨪误¨®bit bnum2=0;/记?录?第̨²二t个?数ºy字Á?记?录?没?有®D.bit bnum1=0;/记?录?按ã¡ä下?第̨²一°?个?数ºy字Á?没?有®Dvoid mai

10、n()char key =0;char flag=0;int i=0;LCD_initial();while(1) key = _GetKey(); delay(100); if(key!=-1) if(key<=9&&key>=0)/数ºy字Á?键¨¹if(berror=0)if(bover=1)/计?算?完ª¨º后¨®第̨²二t次ä?输º?入¨?数ºy字Á?bover=0;bnum1=0;bn

11、um2=0;LCD_cls();flag=0;nIndex=0;xpos=0;bop=0;for(i=0;i<6;i+)str1i=0;str2i=0;resulti=0; if(flag=0) /第̨²一°?个?数ºy字Á?记?录?if(nIndex>=5)/输º?入¨?的Ì?数ºy字Á?过y长¡èberror=1; /记?录?有®D错䨪误¨®LCD_printc(xpos+,1,key

12、+48);LCD_prints(10,2,"Error!");else if(nIndex < 5)if(!(nIndex=0&&key=0)/第̨²一°?个?数ºy字Á?不?会¨¢是º?0str1nIndex+=key+48;bnum1=1;LCD_printc(xpos+,1,key+48);else if(flag=1)/第̨²二t个?数ºy字Á?记?录?if(nIndex>=5)/输º?

13、入¨?的Ì?数º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字Á?不?会¨¢是º?0str2nIndex+=ke

14、y+48;bnum2=1;/记?录?第̨²二t个?数ºy字Á?已°?按ã¡ä下?.LCD_printc(xpos+,1,key+48);else if(key<=13&&key>=10)/操¨´作Á¡Â符¤?if(berror=0&&bnum1) /没?有®D错䨪误¨®出?现?,按ã¡ä下?了¢?第

15、̨²一°?个?数ºyif(bop=0)op=key;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,'+')

16、;bop = 1;else if(key=14)/ "="if(berror=0&&bnum2=1)/没?有®D错䨪误¨®出?现?,按ã¡ä下?了¢?第̨²二t个?数ºybover=1;/已°?计?算?完ª¨ºbnum2=0;/恢?愎1已°?前¡ã的Ì?LCD_printc(xpos,0,'=');if(13=op) /

17、加¨®法¤¡§num1 = _atoi(str1);num2 = _atoi(str2);nresult=num1+num2;if(nresult<num1|nresult<num2)berror=1;LCD_prints(10,2,"Error!");else if(nresult<=32767&&nresult>0)_itoa(nresult,result);LCD_prints(0,2,result);elseberror=1;LCD_prints(10,2,"Erro

18、r!");else if(12=op) /减?法¤¡§num1 = _atoi(str1);num2 = _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(nresult<num1|nresult<num2)berror=1;LCD_prints(10,2

19、,"Error!");else if(nresult>0&&nresult<=32767)_itoa(nresult,result);LCD_prints(0,2,result);elseberror=1;LCD_prints(10,2,"Error!");else if(10=op) /除y法¤¡§num1 = _atoi(str1);num2 = _atoi(str2);nresult=num1/num2;_itoa(nresult,result);LCD_prints(0,2,result)

20、;else if(key=15)/ON/C键¨¹for(i=0;i<6;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);/* 1602LCD显?示º?头ª¡¤文?件t- 三¨y维?电Ì?子Á¨®工¡è作

21、93;¡Â室º¨° -芯?片?:êoAT89S52晶¡ì振?:êo11.0593M描¨¨述º?:êo作Á¡Â者?:êo陈?磊¤¨² 日¨?期¨²:êo2010/06/05 */#include "lcd1602.h"#include"reg51.h"/* LCD数ºy据Y、¡é控?制?口&

22、#168;²定¡§义°?*/#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能¨¹信?号?/* 检¨¬测aLCD状Á&

23、#161;ä态¬?,ê?看¡ä它¨¹是º?不?是º?还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=

24、1; LCD_EN=1; LCD_EN=0;/*/写¡ä指?令¢?到Ì?LCD*/void LCD_write_instruction(unsigned 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 ch

25、ar 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 char x) LCD_write_instruction(0x80+x);/*void LCD_go_home(void) /LCD光a标À¨º归¨¦位? LCD_write_instr

26、uction(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*/void LCD_prints(unsigned

27、 char x,unsigned y,unsigned char *lcd_string) unsigned char i=0;if(x<16)if(y=2)x+=64;LCD_set_position(x); while(lcd_stringi!='0') LCD_write_data(lcd_stringi); i+; /*/初?始º?化¡¥LCD*/void LCD_initial(void) LCD_write_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE); LCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF); LCD_write_instruction(LCD_DISPLAY_DOUBLE_LINE); LCD_cls();/*END*15#include "button.h"void delay(char i) /延时函数int j=0;for(;i>0;i-)for(j=0;j<125;j+);char _GetKey()int key=-1;int i=500;P3=0xf0;if(P3 & 0xf0)!=0xf0)P3=0xfe;i=5

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论