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

下载本文档

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

文档简介

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晶振( CRYSTA)L,两者均可,但要涉及到串口 需选用 12MKEYPAD-SMALLCA就L是C 那个 4X4键盘电容 2030PF(CAP), 接最小电路电容 10PF主要接复位电路RESPACK-8排阻,为 2

3、0K的,一个引脚接正极,另 8 个引脚接I/O 口接 RES电阻 10K,接复位电路实物照片 .jpg789÷456×123-ON/C0=+和原理说明:1,上电后,屏幕初始化;2,计算。按下数字键,屏幕显示要运行的第一个数字,再按下符号 键,然后再按下数字键, 屏幕显示要运算的第二个数字,最后按 下“ =” 号键,屏幕上显示出计算结果。3,如果要再次计算,可以按下“ ON/C”键清零,或者继续按下数字 键,即可重新计算。键盘使用说明如下: 按键功能说明: “+”实现两个数的相加 “ - ”实现两个数的相减 “×”实现两个数的乘积 “÷”实现两个数商的运算

4、 “ON/C”计算器显示的清零 接通电源软件设计: 在程序设计方法上,模块化程序设计是单片机应用中最常用的 程序设计方法。设计的中心思想是把一个复杂应用程序按整体功能 划分成若干个相对独立的程序模块,各模块可以单独设计、编写、 调试、然后组合起来, 这种方法便于设计和调式, 容易实现多个程 序共存,但是各个模块之间的连接有一定得难度。根据需要我们可以采用自上而下的程序设计方法,此方法先从 主程序开始设计, 然后再编制各从属程序和子程序, 层层细化逐步 求精,最终完成一个复杂程序的设计, 这种方法比较符合人们的日 常思维,缺点是一级的程序错误会对整个程序产生影响。程序调试中出现的问题及解决的办法

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

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

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

8、己的能力提高了不少,我会 认真总结设计中的经验教训,为以后更多的设计做好铺垫。参考文献:1 ht=14&lastweight=14&count=5 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;bi

9、t bover=0;/是o?否¤?计?算?玩 a?bit bop=0;/只?能¨1输o?一°?次?操¨作á? 符¤?bit berror=0;/出?现?了?错?¨a误¨?bit bnum2=0;/记?录?第ì¨2二t个?数oy字á?记 ?录?没?有?D.bit bnum1=0;/记?录?按?下?第ì¨2一°?个?数oy字á?没?有 ?D void main()char key =0;char flag=0;int i=0;LCD_initial(

10、);while (1)key = _GetKey();delay(100);if (key!=-1)if (key<=9&&key>=0) / 数oy字á?键¨1if(berror=0)if(bover=1)/计?算?完a¨o后¨? 第ì¨2二t次?输o?入¨?数oy字á?bover=0;bnum1=0;bnum2=0;LCD_cls();flag=0;nIndex=0;xpos=0;bop=0;for(i=0;i<6;i+)str1i=0;str2i=0;resulti=0;if

11、(flag=0)/第 ì¨2一 °?个?数oy字á?记?录 ?if(nIndex>=5)/输o?入¨?的ì?数oy字á?过y长?èberror=1; /记?录?有?D 错?¨a误¨?LCD_printc(xpos+,1,key+48);LCD_prints(10,2, "Error!" );else if (nIndex < 5)if(!(nIndex=0&&key=0) /第 ì¨2一°?个?数oy字á?不

12、?会¨是o?0str1nIndex+=key+48;bnum1=1;LCD_printc(xpos+,1,key+48);elseif(flag=1)/第ì¨2二t个?数oy字á?记 ?录?if(nIndex>=5)/输o?入¨?的ì?数oy字á?过y长?èberror=1; /记?录?有?D 错?¨a误¨?LCD_printc(xpos+,1,key+48);LCD_prints(10,2, "Error!" );else if (nIndex < 5)if(!

13、(nIndex=0&&key=0) /第 ì¨2一°?个?数oy字á?不?会¨是o?0str2nIndex+=key+48;bnum2=1;/记?录?第ì¨2二t个?数oy字á?已°?按?下?.LCD_printc(xpos+,1,key+48);else if (key<=13&&key>=10) /操¨作á? 符¤?if(berror=0&&bnum1) /没?有?D 错?¨a误¨? 出?现?

14、,按?下?了?第ì¨2一°?个?数oy if(bop=0)op=key;flag=1;nIndex=0;if (key=10) / '/' LCD_printc(xpos+,1, '/'); elseif(key=11)/ '*' LCD_printc(xpos+,1, '*'); elseif(key=12)/ '-' LCD_printc(xpos+,1, '-'); elseif(key=13)/ '+' LCD_printc(xpos+,1, &

15、#39;+');bop = 1;else if (key=14)/ "="oyif(berror=0&&bnum2=1) /没?有?D 错?¨a误¨? 出?现?,按?下?了?第ì¨2二t个?数 bover=1;/已°?计?算?完a¨o bnum2=0;/恢?愎1已°?前?的ì?LCD_printc(xpos,0, '=');if(13=op)/ 加¨? 法¤?§num1 = _atoi(str1);num2 = _atoi(s

16、tr2); nresult=num1+num2;if (nresult<num1|nresult<num2)berror=1; LCD_prints(10,2, "Error!" );elseif (nresult<=32767&&nresult>0) _itoa(nresult,result);LCD_prints(0,2,result);elseberror=1;LCD_prints(10,2, "Error!" );elseif (12=op)/减?法¤?§num1 = _atoi(str

17、1);num2 = _atoi(str2); nresult=num1-num2; _itoa(nresult,result); LCD_prints(0,2,result);elseif (11=op)/乘?法¤?§num1 = _atoi(str1);num2 = _atoi(str2); nresult=num1*num2;if (nresult<num1|nresult<num2)berror=1;LCD_prints(10,2, "Error!" );elseif (nresult>0&&nresult<

18、=32767)_itoa(nresult,result);LCD_prints(0,2,result);elseberror=1;LCD_prints(10,2, "Error!" );elseif (10=op)/ 除y法 ¤?§num1 = _atoi(str1);num2 = _atoi(str2); nresult=num1/num2; _itoa(nresult,result); LCD_prints(0,2,result);elseif(key=15)/ON/C键¨1for(i=0;i<6;i+)str1i=0;str2i=0

19、; 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显?示o?头a?¤文?件t 三¨y维?电ì?子á¨? 工?è作á? 室o¨° 芯?片?:êoAT89S52 晶?ì振?:êo11.0593M描 ¨述 o?: êo作

20、25;? 者?:êo陈?磊¤¨2 日¨?期¨2: êo2010/06/05 */#include "lcd1602.h" #include"reg51.h"/*LCD数oy据Y、?é控?制?口¨2定?§义°?*/#define LCD_DATA P0/LCD的ì?数oy据Y口¨2sbit LCD_BUSY=LCD_DATA7;/LCD 忙|信?号?位?sbit LCD_RW=P21;/LCD 读¨写?控?制?sbit LCD_

21、RS=P20;/LCD 寄?存?器?选?择?sbit LCD_EN=P22;/LCD 使o1能¨1信?号?/*检¨?测aLCD状á?态?,ê?看?它¨1是o?不?是o?还1在¨2忙|呢? */ 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

22、=0;LCD_RW=0;LCD_DATA=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;/*/输o?出?一°?个?字á?节¨2数oy据Y到ì?LCD void LCD_write_data( unsigned char LCD_data) LCD_c

23、heck_busy();LCD_RS=1;LCD_RW=0;LCD_DATA=LCD_data;LCD_EN=1;LCD_EN=0;/*/LCD 光a标à¨o定?§位?到ì?x处?|*/void LCD_set_position( unsigned char x) LCD_write_instruction(0x80+x);/LCD 光a标à¨o归¨|位?/*void LCD_go_home(void)LCD_write_instruction(LCD_GO_HOME);*/*/输o?出?一°?个?字á?

24、符¤?到ì?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);/*/输o?出?一°?个?字á?符¤?串?到ì?LCD */void LCD_prints( unsigned char x,unsigned y,unsigned char *lcd_string) unsigned cha

25、r i=0;if(x<16)if(y=2)x+=64;LCD_set_position(x); while(lcd_stringi!= '0') LCD_write_data(lcd_stringi);i+;/*/初?始o?化?¥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*#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=500;while(i-);if(P3 & 0xfe)=0xee) key = 7;延时函数key = 8;if(P3 & 0xfe)=0xbe)key

温馨提示

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

评论

0/150

提交评论