多功能计算器毕业论文doc.docx
- 文档编号:29913917
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:24
- 大小:244.61KB
多功能计算器毕业论文doc.docx
《多功能计算器毕业论文doc.docx》由会员分享,可在线阅读,更多相关《多功能计算器毕业论文doc.docx(24页珍藏版)》请在冰豆网上搜索。
多功能计算器毕业论文doc
一、设计总体思路,基本原理和框图
1.1设计总体思路
本电路设计采用AT89S52单片机为核心,利用晶振产生频率为1HZ的时钟脉冲信号,利用液晶屏LCD1602显示计算信息,通过对AT89S52单片机的编程控制液晶屏LCD1602的显示。
显示计算和简易计算的信息同在LCD1602,通过按键切换选。
1.2基本原理
图1-1
1.3设计框图
1.3.1硬件原理图
图1-2
1.3.2软件流程图
图1-3
二、单元函数设计
2.1单片机模块
本次设计采用AT89C51单片机,以下为其标准功能:
4k字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位
2.2键盘控制模块
本次设计使用的是PROTUES中的KEYPAD键盘。
使用此键盘的难度在于它的数据是分散的,并且不是由小到大排列的,这就要求我们在编写程序的时候对键值进行处理。
首先给键盘低4位的其中一位低电平,例如11111110,这样键盘的第一行全为低电平。
如果第一行有键按下,例如7键按下则为低电平,同时第一列为低电平,此时键盘的8为就变为11101110。
我们只要将这些数据转化为7这个数,就可以将它送到液晶显示。
如此循环,键盘的每一行每一列只要有键按下都可以接收到。
2.3LCD显示模块
图2-1
如图2-1,我们使用的液晶是LCD1602,RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器;RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器;E端为使能端,D0~D7分别为8位双向数据线。
图2-2
图2-2是液晶的工作时序,它有两个工作状态,如下:
当我们要写指令字,设置LCD1602的工作方式时:
需要把RS置为低电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。
当我们要写入数据字,在1602上实现显示时:
需要把RS置为高电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。
除此之外,我们还可以对液晶进行显示初始化,对它是否使用光标、是否闪烁等进行控制。
三、程序调试与结果
3.1加法调试
图3-1
3.2幂运算调试
图3-2
3.3报错调试
图3-3
附录
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineZERO0.00001
sbitrow1=P3^0;
sbitrow2=P3^1;
sbitrow3=P3^2;
sbitrow4=P3^3;
sbitRS=P1^0;//1602的数据/指令选择控制线
sbitRW=P1^1;//1602的读写控制线
sbitEN=P1^2;//1602的使能控制线
sbitFB=P1^7;
uinttemp=0,key=0;//地址中间变量,按键
uintfunc=0,flag=0;//功能键标志,符号键标志
doublenumb1=0,numb2=0;//第一操作数,第二操作数
uinterrorMark=0,fuhao=0;、//错误标志位,符号标志
uintequalMark=0;、//等号标志
doubleresult;//结果
unsignedlongintPar,deciPar;//整数部分,小数部分
ucharaddrCount=0;//地址计数器,跟踪光标
ucharflag2=0
ucharcodeshowTable[]="0123456789+-*/=^";//+(10)-(11)*(12)/(13)=(14)^(16)
ucharcodeshowRt[]="ROOT";
ucharcodeerrorTable[]="Error";
//////////////////////延时函数
voidDelay(uintn)
{
uintx,y;
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
//////////////////////////////1602写命令函数
voidWriteCmd(ucharcmd)
{
RS=0;
RW=0;
P2=cmd;
Delay(3);
EN=1;
EN=0;
}
//////////////////////////////1602写数据函数
voidWriteData(uchardat)
{
RS=1;
RW=0;
P2=dat;
Delay(3);
EN=1;
EN=0;
}
//////////////////////////////1602初始化
voidLcdInitial()
{
WriteCmd(0x38);
WriteCmd(0x0c);
WriteCmd(0x06);
WriteCmd(0x01);
}
//////////////////////////////错误显示
voidShowError()
{
inti;
errorMark=1;
addrCount=0;
WriteCmd(0x01);
WriteCmd(0x80);
for(i=0;i<5;i++)
{
WriteData(errorTable[i]);
}}
///////////////////////////////清屏
voidClear()
{
if(errorMark==1)
{
WriteCmd(0x01);
errorMark=0;
numb1=0;
numb2=0;
}
if(equalMark==1)
{
WriteCmd(0x01);
equalMark=0;
numb1=0;
numb2=0;
}}
//////////////////////////////显示结果
voidShowResult()
{
WriteCmd(0x80+0x4f);
WriteCmd(0x04);
intPar=(unsignedlong)fabs(result);
deciPar=(unsignedlong)((fabs(result)-intPar)*1000);
if(fabs(result)<=ZERO)
{
WriteData(0x30);
}
else
{
if(deciPar!
=0)
{
while(deciPar!
=0)
{
WriteData(0x30+deciPar%10);
deciPar=deciPar/10;
}
WriteData(0x2e);
}
if(intPar==0)
{
WriteData(0x30);
}
else
{
while(intPar!
=0)
{
WriteData(0x30+intPar%10);
intPar=intPar/10;
}}}
if(result<0)
{
WriteData(showTable[11]);
}
}
//////////////////////////////加
voidAdd()
{
result=numb1+numb2;
ShowResult();
}
//////////////////////////////减
voidSub()
{
result=numb1-numb2;
ShowResult();
}
//////////////////////////////乘
voidMul()
{
result=numb1*numb2;
ShowResult();
}
//////////////////////////////除?
voidDec()
{
if(numb2!
=0)
{
result=numb1/numb2;
ShowResult();
}
else
{
ShowError();
}
}
///////////////////////////////求幂
voidPower()
{
result=pow(numb1,numb2);
ShowResult();
}
//////////////////////////////求方根
voidRoot()
{
result=pow(numb2,1/numb1);
ShowResult();
}
//////////////////////////////等号处理
voidEqualPro()
{
addrCount=0;
equalMark=1;
flag=0;
WriteData(showTable[key]);
//(fuhao=1表示除号,fuhao=2表示乘号,fuhao=3表示减号,fuhao=4表示加号,fuhao=5表示求幂,fuhao=6表示求方根)
if(flag2==1)
{
switch(fuhao)
{
case1:
Dec();
break;
case2:
Mul();
break;
case3:
Sub();
break;
case4:
Add();
break;
case5:
Power();
break;
case6:
Root();
break;
}}
else
{
ShowError();
}}
///////////////////////////显示符号
voidShowFlag()
{
flag++;
if(flag>1)
{
ShowError();
flag=0;
}
else
{
if(key==16)
{
intj=0;
for(j=0;j<4;j++)
{
WriteData(showRt[j]);
}
}
else
{
WriteData(showTable[key]);
}}}
/////////////////////////数据处理
voidDataPro()
{
WriteData(showTable[key]);
if(flag==0)
{
numb1=numb1*10+key;
flag2=0;
}
else
{
numb2=numb2*10+key;
flag2=1;
}
}
//////////////////////////row1
voidKeyScan();
voidRow1Judge()
{
//row1(789/)
P3=0xff;
row1=0;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
Delay
(2);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
switch(temp)
{
case0xe0:
key=7;
func=0;
addrCount++;
break;
case0xd0:
key=8;
func=0;
addrCount++;
break;
case0xb0:
key=9;
func=0;
addrCount++;
break;
case0x70:
key=13;
func=0;
addrCount++;
break;
}
Clear();
if(key<10)
{
DataPro();
}
else
{
ShowFlag();
fuhao=1;//////////////表示除号
}}}}
//row2
voidRow2Judge()
{
//row2(456*)
P3=0xff;
row2=0;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
Delay
(2);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
switch(temp)
{
case0xe0:
key=4;
func=0;
addrCount++;
break;
case0xd0:
key=5;
func=0;
addrCount++;
break;
case0xb0:
key=6;
func=0;
addrCount++;
break;
case0x70:
key=12;
func=0;
addrCount++;
break;
}
Clear();
if(key<10)
{
DataPro();
}
else
{
ShowFlag();
fuhao=2;
}}}}
//row3
voidRow3Judge()
{
//row3(123-)
P3=0xff;
row3=0;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
Delay
(2);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
switch(temp)
{
case0xe0:
key=1;
func=0;
addrCount++;
break;
case0xd0:
key=2;
func=0;
addrCount++;
break;
case0xb0:
key=3;
func=0;
addrCount++;
break;
case0x70:
key=11;
func=0;
addrCount++;
break;
}
Clear();
if(key<10)
{
DataPro();
}
else
{
ShowFlag();
fuhao=3;
}}}}
//row4
voidRow4Judge()
{
//row1(0=+^root)
P3=0xff;
row4=0;
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
Delay
(2);
temp=P3;
temp=temp&0xf0;
if(temp!
=0xf0)
{
switch(temp)
{
case0xe0:
func=!
func;
key=-1;
break;
case0xd0:
key=0;
func=0;
addrCount++;
break;
case0xb0:
if(func==1)
{
key=16;
func=0;
addrCount+=4;
}
else
{
key=14;
}
break;
case0x70:
if(func==1)
{
key=15;
func=0;
}
else
{
key=10;
}
addrCount++;
break;
}
Clear();
if(key>0&&key<10)
{
DataPro();
}
else
{
switch(key)
{
case10:
ShowFlag();
fuhao=4;
break;
case14:
EqualPro();
break;
case15:
ShowFlag();
fuhao=5;
break;
case16:
ShowFlag();
fuhao=6;
break;
}}}}}
//键盘扫描函数
voidKeyScan()
{
WriteCmd(0x80+addrCount);
Row1Judge();
Row2Judge();
Row3Judge();
Row4Judge();
if(func==1)
{
WriteCmd(0x80+0x40);
WriteData('F');
WriteData('n');
WriteCmd(0x80+addrCount);
}
else
{
WriteCmd(0x80+0x40);
WriteData('');
WriteData('');
WriteCmd(0x80+addrCount);
}}
voidmain()//主函数
{
LcdInitial();//液晶初始化
WriteCmd(0x80);//显示地址设为80H(即00H,)上排第一位
while
(1)
{
KeyScan();
Delay(200);
}}
参考文献
1、谭浩强编C语言程序设计清华大学出版社
2、王银旭编单片机与原理与应用机械工业出版社
3、液晶LCD1602使用手册XX文库
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多功能 计算器 毕业论文 doc