用单片机语言设计16位加法计算器实验报告综述.docx
《用单片机语言设计16位加法计算器实验报告综述.docx》由会员分享,可在线阅读,更多相关《用单片机语言设计16位加法计算器实验报告综述.docx(25页珍藏版)》请在冰豆网上搜索。
用单片机语言设计16位加法计算器实验报告综述
单片机课程设计
实验报告
课程设计名称:
电子计算器
课程设计单位:
10计应
(1)班
课设小组成员:
徐凡(1060310039)
凡平(1060310058)
彭浩(1060310045)
桂银(1060310010)
潘光卉(1060300033)
完成时间:
2012年04月02日至2012年04月24日
单片机课程设计实验报告
课程设计题目:
简易计算器
作品功能描述:
当通过输入键盘数字时,能够在显示器上显示输出的数值,并且通过想实现的简单运算功能,实现计算器的加、减、乘、除和清零,并将结果显示出来。
小组成员工作分工:
徐凡:
程序主框架的构造和主要功能函数的设计。
凡平:
原理图的设计和硬件的焊接。
彭浩:
基本功能函数的设计(“+,-,*,/”)。
桂银:
程序流程图的设计和键盘扫描程序的实现。
潘光卉:
编写文档和功能测试。
硬件电路设计:
本设计中我们用的是AT89C52芯片,LCD1602(PROTEUS中为LM016L)就是那个液晶屏,因为可以显示2行16个字符,故叫做LCD1602.
11.0592M或12M晶振(CRYSTAL),两者均可,但要涉及到串口
需选用12MKEYPAD-SMALLCALC就是那个4X4键盘
电容20~30PF(CAP),接最小电路
电容10PF主要接复位电路
RESPACK-8排阻,为20K的,一个引脚接正极,另8个引脚接I/O口接RES电阻10K,接复位电路
实物照片:
实物照片.jpg
原理说明:
1,上电后,屏幕初始化;
2,计算。
按下数字键,屏幕显示要运行的第一个数字,再按下符号键,然后再按下数字键,屏幕显示要运算的第二个数字,最后按下“=”号键,屏幕上显示出计算结果。
3,如果要再次计算,可以按下“ON/C”键清零,或者继续按下数字键,即可重新计算。
7
8
9
÷
4
5
6
×
1
2
3
-
ON/C
0
=
+
键盘使用说明如下:
按键功能说明:
“+”实现两个数的相加
“-”实现两个数的相减
“×”实现两个数的乘积
“÷”实现两个数商的运算
“ON/C”计算器显示的清零和
接通电源
程序控制流程图:
软件设计:
在程序设计方法上,模块化程序设计是单片机应用中最常用的程序设计方法。
设计的中心思想是把一个复杂应用程序按整体功能划分成若干个相对独立的程序模块,各模块可以单独设计、编写、调试、然后组合起来,这种方法便于设计和调式,容易实现多个程序共存,但是各个模块之间的连接有一定得难度。
根据需要我们可以采用自上而下的程序设计方法,此方法先从主程序开始设计,然后再编制各从属程序和子程序,层层细化逐步求精,最终完成一个复杂程序的设计,这种方法比较符合人们的日常思维,缺点是一级的程序错误会对整个程序产生影响。
程序调试中出现的问题及解决的办法:
1.算器无法实现连加现象。
例如:
顺序输入1+2=之后会显示结果为3,计然后继续输入+1,结果并不为4。
错误原因我们认为是在获得结果3之后没有将数据3放入操作数缓存,所以我们在等号运算执行后的代码下面将计算机结果放入操作数缓存的代码,以此来实现计算器连加的功能。
2.编程前要加流程图,这样会使思路清晰。
3.程序的结构要设计的合理,避免上下乱调用的现象,这样会使程序更加清晰化。
4.编程过程中要注意加注释或分割线,否则,在程序过长时容易变得很乱,不便于查找或更改。
5.计算器没有实现小数操作,因为数字存储我们用int来存放,进行相除功能的时候,也是用int计算,计算结果是整除的.没有小数位.
6.
收获,体会与建议
在此次课程设计中,通过团队的合作和网上找的资料,主要掌握了数码管显示的编程,数据在内部运算的编程方法。
调试也是此次的重点,这其中最重要的就是软件的台式了,也是我们此次问题出现最多的地方,这要求我们队每个模块在整个程序中的作用了如子掌。
通过此次课程设计,我们发现我们对程序的掌握还不够,尤其是单片机汇编语言掌握的不牢固。
这次课程设计使我懂得实践的重要性,只有理论知识还远远不够,只有把所学的理论知识与实践相结合才算是掌握了所学的只是。
此次设计的单片机十分简易,只实现了基本的加减乘除,所以这次我们设计的计算器是并不实用的,但是通过本次课程设计,是我们了解到了如何使用单片机来进行计算器的设计,学会了如何对LCD灯进行控制,也学会了如何使用键盘来获得输入的数据,同时提高了我们的编程能力。
在设计计算器的过程中我们遇到了很多问题,解决了这些问题之后,提高了我们自己动手解决问题得能力。
这次单片机设计中使我们对单片机有了更深的了解。
单片机编程需要对电路的认真分析,然后画出流程图,善于查阅相关资料才能编出好的程序。
这次单片机应用系统的设计中遇到很大的困难,主要原因是平时的只是掌握的不够,通过查阅很多资料和类似的论文,才做成的。
由于时间仓促,经验少,只是局限,设计有一定得不足,但是通过此次设计自己的能力提高了不少,我会认真总结设计中的经验教训,为以后更多的设计做好铺垫。
参考文献:
[1][2]ZigBee技术
#include"reg51.h"
#include"lcd1602.h"
#include"button.h"
charstr1[6]={0};
charstr2[6]={0};
charop=0;
charresult[6]={0};
intnum1=0;
intnum2=0;
intnresult=0;
charnIndex=0;
charxpos=0;
bitbover=0;//是º?
否¤?
计?
算?
玩ª?
bitbop=0;//只?
能¨¹输º?
一°?
次ä?
操¨´作Á¡Â符¤?
bitberror=0;//出?
现?
了¢?
错䨪误¨®
bitbnum2=0;//记?
录?
第̨²二t个?
数ºy字Á?
记?
录?
没?
有®D..
bitbnum1=0;//记?
录?
按ã¡ä下?
第̨²一°?
个?
数ºy字Á?
没?
有®D
voidmain()
{
charkey=0;
charflag=0;
inti=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;
bnum2=0;
LCD_cls();
flag=0;
nIndex=0;
xpos=0;
bop=0;
for(i=0;i<6;i++)
{
str1[i]=0;
str2[i]=0;
result[i]=0;
}
}
if(flag==0)//第̨²一°?
个?
数ºy字Á?
记?
录?
{
if(nIndex>=5)//输º?
入¨?
的Ì?
数ºy字Á?
过y长¡è
{
berror=1;//记?
录?
有®D错䨪误¨®
LCD_printc(xpos++,1,key+48);
LCD_prints(10,2,"Error!
");
}
elseif(nIndex<5)
{
if(!
(nIndex==0&&key==0))//第̨²一°?
个?
数ºy字Á?
不?
会¨¢是º?
0
{
str1[nIndex++]=key+48;
bnum1=1;
LCD_printc(xpos++,1,key+48);
}
}
}
elseif(flag==1)//第̨²二t个?
数ºy字Á?
记?
录?
{
if(nIndex>=5)//输º?
入¨?
的Ì?
数ºy字Á?
过y长¡è
{
berror=1;//记?
录?
有®D错䨪误¨®
LCD_printc(xpos++,1,key+48);
LCD_prints(10,2,"Error!
");
}
elseif(nIndex<5)
{
if(!
(nIndex==0&&key==0))//第̨²一°?
个?
数ºy字Á?
不?
会¨¢是º?
0
{
str2[nIndex++]=key+48;
bnum2=1;//记?
录?
第̨²二t个?
数ºy字Á?
已°?
按ã¡ä下?
...
LCD_printc(xpos++,1,key+48);
}
}
}
}
}
elseif(key<=13&&key>=10)//操¨´作Á¡Â符¤?
{
if(berror==0&&bnum1)//没?
有®D错䨪误¨®出?
现?
按ã¡ä下?
了¢?
第̨²一°?
个?
数ºy
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,'+');
}
bop=1;
}
}
elseif(key==14)//"="
{
if(berror==0&&bnum2==1)//没?
有®D错䨪误¨®出?
现?
按ã¡ä下?
了¢?
第̨²二t个?
数ºy
{
bover=1;//已°?
计?
算?
完ª¨º
bnum2=0;//恢?
愎1已°?
前¡ã的Ì?
LCD_printc(xpos,0,'=');
if(13==op)//加¨®法¤¡§
{
num1=_atoi(str1);
num2=_atoi(str2);
nresult=num1+num2;
if(nresult{
berror=1;
LCD_prints(10,2,"Error!
");
}
elseif(nresult<=32767&&nresult>0)
{
_itoa(nresult,result);
LCD_prints(0,2,result);
}
else
{
berror=1;
LCD_prints(10,2,"Error!
");
}
}
elseif(12==op)//减?
法¤¡§
{
num1=_atoi(str1);
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{
berror=1;
LCD_prints(10,2,"Error!
");
}
elseif(nresult>0&&nresult<=32767)
{
_itoa(nresult,result);
LCD_prints(0,2,result);
}
else
{
berror=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键¨¹
{
for(i=0;i<6;i++)
{
str1[i]=0;
str2[i]=0;
result[i]=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维?
电Ì?
子Á¨®工¡è作Á¡Â室º¨°-----------
芯?
片?
:
êoAT89S52
晶¡ì振?
:
êo11.0593M
描¨¨述º?
:
êo
作Á¡Â者?
:
êo陈?
磊¤¨²
日¨?
期¨²:
êo2010/06/05
******************************************/
#include"lcd1602.h"
#include"reg51.h"
/********************************************
LCD数ºy据Y、¡é控?
制?
口¨²定¡§义°?
********************************************/
#defineLCD_DATAP0//LCD的Ì?
数ºy据Y口¨²
sbitLCD_BUSY=LCD_DATA^7;//LCD忙|信?
号?
位?
sbitLCD_RW=P2^1;//LCD读¨¢写¡ä控?
制?
sbitLCD_RS=P2^0;//LCD寄?
存ä?
器¡Â选?
择?
sbitLCD_EN=P2^2;//LCD使º1能¨¹信?
号?
/********************************************
检¨¬测aLCD状Á¡ä态¬?
,ê?
看¡ä它¨¹是º?
不?
是º?
还1在¨²忙|呢?
********************************************/
voidLCD_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清?
屏¨¢
********************************************/
voidLCD_cls(void)
{LCD_check_busy();
LCD_RS=0;
LCD_RW=0;
LCD_DATA=1;
LCD_EN=1;
LCD_EN=0;
}
/**************
//写¡ä指?
令¢?
到Ì?
LCD
***************/
voidLCD_write_instruction(unsignedcharLCD_instruction)
{LCD_check_busy();
LCD_RS=0;
LCD_RW=0;
LCD_DATA=LCD_instruction;
LCD_EN=1;
LCD_EN=0;
}
/***********************
//输º?
出?
一°?
个?
字Á?
节¨²数ºy据Y到Ì?
LCD
************************/
voidLCD_write_data(unsignedcharLCD_data)
{LCD_check_busy();
LCD_RS=1;
LCD_RW=0;
LCD_DATA=LCD_data;
LCD_EN=1;
LCD_EN=0;
}
/********************
//LCD光a标À¨º定¡§位?
到Ì?
x处ä|
*********************/
voidLCD_set_position(unsignedcharx)
{LCD_write_instruction(0x80+x);
}
/*
voidLCD_go_home(void)//LCD光a标À¨º归¨¦位?
{
LCD_write_instruction(LCD_GO_HOME);
}
*/
/*******************
//输º?
出?
一°?
个?
字Á?
符¤?
到Ì?
LCD
**********************/
voidLCD_printc(unsignedcharx,unsignedchary,unsignedcharlcd_data)
{
if(x<=16)
{
if(y==2)x+=64;
LCD_set_position(x);
LCD_write_data(lcd_data);
}
}
/***********************
//输º?
出?
一°?
个?
字Á?
符¤?
串ä?
到Ì?
LCD
************************/
voidLCD_prints(unsignedcharx,unsignedy,unsignedchar*lcd_string)
{unsignedchari=0;
if(x<16)
{
if(y==2)x+=64;
LCD_set_position(x);
while(lcd_string[i]!
='\0')
{LCD_write_data(lcd_string[i]);
i++;
}
}
}
/********************
//初?
始º?
化¡¥LCD
**********************/
voidLCD_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"
voiddelay(chari)//延时函数
{
intj=0;
for(;i>0;i--)
for(j=0;j<125;j++);
}
char_GetKey()
{
intkey=-1;
inti=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