电子计算器.docx
《电子计算器.docx》由会员分享,可在线阅读,更多相关《电子计算器.docx(20页珍藏版)》请在冰豆网上搜索。
电子计算器
单片机课程设计报告
课题:
学院:
报告人:
1课题概述
1.1课题描述及实现功能
1.2按键说明
系统的工作流程图
系统程序设计
20
课程设计心得
本课题是基于ADUC848单片机的电子计算器设计。
由于本实验所需的单片机开发板已经确定,相应的硬件部分已经做好,所以我们只需要根据硬件原理图进行软件设计。
软件设计
部分采用C语言进行编写。
根据要求设计的电子计算器的功能如下:
利用小键盘作为数据和命令的输入装置;利用LCD显示过程和结果;实现的运算包括:
正实数的加、减、乘、除、开方、乘方、三角函数运算(
tan);
4)未工作时显示北京时间;
5)当数据超出范围,可声音提示或报警。
本系统采用4X4矩阵键盘作为输入部分,实现数据输入功能。
本系统规定的键盘上的各按键功能如下所示:
1(+)
2(-)
3(*)
ON
4(/)
5(sqrt)
6(power)
OFF
7(sin)
8(cos)
9(tan)
Clear
Fuction
0
.
=
各按键功能如下:
Fuction:
功能键。
按下此键,显示数字1至9括号里的运算符;未按此键,显示数字。
ON显示北京时间时,按下此键之后进入计算器状态。
OFF在计算器状态下,按下此键之后显示北京时间。
Clear:
清除键。
2系统的工作流程图
C
off
功能键(F)
清除
数字键
3系统程序设计
3.1主程序模块设计
#include
#include#include#include#include
#include#include
#defineucharunsignedchardoublexdataFirst,End1,End2;
voiddelay(intn)
{inti,j;
for(i=0;i{for(j=0;j<25;j++);}}doubleadd(doublex,doubley){doublez;z=x+y;////延时程序加法程序 return(z);}doublesub(doublex,doubley){doublez;if(x>=y)z=x-y;elsez=y-x;return(z);}doublemul(doublex,doubley){doublez;z=x*y;return(z);}doublediv(doublex,doubley){doublez;z=x/y;return(z);}doublepower(doublex,inty){doublez;inti;z=1;for(i=1;i<=y;i++)z=z*x;return(z);}doubletan(doublex){doublez;z=sin(x)/cos(x);return(z);}////////tan(x)乘法程序除法程序乘方程序程序 voidmain(void){intn,k,h,g,t=0;unsignedchartime[7]={00,00,12,4,9,6,11};unsignedcharf,m,key=0x80;unsignedcharfp[16];l2CCON=0xE8;m功能键,g小数转换,k按键次数,n判n=0;f=0;m=0;k=-1;h=0;/*h有小数,断前后数,f算法,t时间计算切换*/First=0;g=1;//LCD初始化LCDInitialize(); SetTime(time);SwitchRTC(1);while(1){key=GetKey();if(t==0)key=100;switch(key){case1:if(m==0){if(h==0){First=First*10+key;k++;}else{First=First+(double)key/(g*10);g=g*10;k++;}LCDPrintString(k,1,"1");}/////*不断查询是否有按键动作获取返回键值时间状态*/ else{f=1;First=0;m=0;n=1;k++;LCDPrintString(k,1,"+");}break;case2:if(m==0){if(h==0){First=First*10+key;k++;}else{First=First+(double)key/(g*10);g=g*10;k++;}LCDPrintString(k,1,"2");}else{f=2;First=0;m=0;n=1;k++;LCDPrintString(k,1,"-");}break;case3:if(m==0){if(h==0){First=First*10+key;k++;}else{First=First+(double)key/(g*10);g=g*10;k++;}LCDPrintString(k,1,"3");}else{f=3;First=0;m=0;n=1;k++;LCDPrintString(k,1,"x");}break;case4:if(m==0){if(h==0){First=First*10+key;k++;}else{First=First+(double)key/(g*10);g=g*10;k++;}LCDPrintString(k,1,"4");}else{f=4;First=0;m=0;n=1;k++;LCDPrintString(k,1,"/");}break;case5:if(m==0){if(h==0){First=First*10+key;k++;}else{First=First+(double)key/(g*10);g=g*10;k++;}LCDPrintString(k,1,"5");}else{f=5;First=0;m=0;n=1;k++;LCDPrintString(k,1,"sqrt");k=k+3;}break;case6:if(m==0){if(h==0){First=First*10+key;k++;}else{First=First+(double)key/(g*10);g=g*10;k++;}LCDPrintString(k,1,"6");}else{f=6;First=0;m=0;n=1;k++;LCDPrintString(k,1,"^");}break;case7:if(m==0){if(h==0){First=First*10+key;k++;}else{First=First+(double)key/(g*10);g=g*10;k++;}LCDPrintString(k,1,"7");}else{f=7;First=0;m=0;n=1;k++;LCDPrintString(k,1,"sin");k=k+2;}break;case8:if(m==0){if(h==0){First=First*10+key;k++;}else{First=First+(double)key/(g*10);g=g*10;k++;}LCDPrintString(k,1,"8");}else{f=8;First=0;m=0;n=1;k++;LCDPrintString(k,1,"cos");k=k+2;}break;case9:态*/case0:if(h==0){First=First*10+key;k++;}else{First=First+(double)key/(g*10);g=g*10;k++;}LCDPrintString(k,1,"0");break;case15:switch(f){case1:First=add(End1,End2);if(First>30000){buzzer();key=14;}else{ecvt(First,fp);LCDPrintString(0,2,fp);}break;case2:First=sub(End1,End2);if(First>30000){buzzer();key=14;}else{ecvt(First,fp);LCDPrintString(0,2,fp);}break;case3:First=mul(End1,End2);if(First>30000){buzzer();key=14;}else{ecvt(First,fp);LCDPrintString(0,2,fp);}break;case4:First=div(End1,End2);if(First>30000){buzzer();key=14;}else{ecvt(First,fp);LCDPrintString(0,2,fp);}break;case5:First=sqrt(End2);if(First>30000){buzzer();key=14;}else{ecvt(First,fp);LCDPrintString(0,2,fp);}break;case6:First=power(End1,End2);if(First>30000){buzzer();key=14;}else{ecvt(First,fp);LCDPrintString(0,2,fp);}break;case7:First=sin(End2);if(First>30000){buzzer();key=14;}else{ecvt(First,fp);LCDPrintString(0,2,fp);}break;case8:First=cos(End2);if(First>30000){buzzer();key=14;}else{ecvt(First,fp);LCDPrintString(0,2,fp);}break;case9:First=tan(End2);if(First>30000){buzzer();key=14;}else{ecvt(First,fp);LCDPrintString(0,2,fp);}break;}First=0;n=0;k=-1;g=1;f=0;b
{for(j=0;j<25;j++)
;}
}
doubleadd(doublex,doubley){doublez;
z=x+y;
//
延时程序
加法程序
return(z);
doublesub(doublex,doubley){doublez;
if(x>=y)
z=x-y;
else
z=y-x;
doublemul(doublex,doubley){doublez;
z=x*y;
doublediv(doublex,doubley)
{doublez;
z=x/y;
doublepower(doublex,inty)
inti;
z=1;
for(i=1;i<=y;i++)
z=z*x;
doubletan(doublex)
z=sin(x)/cos(x);
//tan(x)
乘法程序
除法程序
乘方程序
程序
voidmain(void)
{intn,k,h,g,t=0;
unsignedchartime[7]={00,00,12,4,9,6,11};
unsignedcharf,m,key=0x80;
unsignedcharfp[16];l2CCON=0xE8;
m功能键,g小数转换,k按键次数,n判
n=0;f=0;m=0;k=-1;h=0;/*h有小数,
断前后数,f算法,t时间计算切换*/
First=0;g=1;
//LCD初始化
LCDInitialize();
SetTime(time);
SwitchRTC
(1);
while
(1)
{key=GetKey();
if(t==0)
key=100;
switch(key)
{case1:
if(m==0)
{if(h==0)
{First=First*10+key;k++;}
else{First=First+(double)key/(g*10);g=g*10;k++;}
LCDPrintString(k,1,"1");}
/*
不断查询是否有按键动作获取返回键值
时间状态*/
{f=1;First=0;m=0;n=1;k++;
LCDPrintString(k,1,"+");}
break;
case2:
LCDPrintString(k,1,"2");}
{f=2;First=0;m=0;n=1;k++;
LCDPrintString(k,1,"-");}
case3:
LCDPrintString(k,1,"3");}
{f=3;First=0;m=0;n=1;k++;
LCDPrintString(k,1,"x");}
case4:
LCDPrintString(k,1,"4");}
{f=4;First=0;m=0;n=1;k++;
LCDPrintString(k,1,"/");}
case5:
LCDPrintString(k,1,"5");}
{f=5;First=0;m=0;n=1;k++;
LCDPrintString(k,1,"sqrt");k=k+3;}
case6:
LCDPrintString(k,1,"6");}
{f=6;First=0;m=0;n=1;k++;
LCDPrintString(k,1,"^");}
case7:
LCDPrintString(k,1,"7");}
{f=7;First=0;m=0;n=1;k++;
LCDPrintString(k,1,"sin");k=k+2;}
case8:
LCDPrintString(k,1,"8");}
{f=8;First=0;m=0;n=1;k++;
LCDPrintString(k,1,"cos");k=k+2;}break;
case9:
态*/
case0:
if(h==0)
else{First=First+(double)key/(g*10);g=g*10;k++;}LCDPrintString(k,1,"0");
case15:
switch(f)
First=add(End1,End2);
if(First>30000){buzzer();key=14;}else{ecvt(First,fp);LCDPrintString(0,2,fp);}break;case2:
First=sub(End1,End2);
if(First>30000)
{buzzer();key=14;}
else{ecvt(First,fp);LCDPrintString(0,2,fp);}break;
First=mul(End1,End2);
First=div(End1,End2);
First=sqrt(End2);
First=power(End1,End2);
else{ecvt(First,fp);LCDPrintString(0,2,fp);}break;case7:
First=sin(End2);
else{ecvt(First,fp);LCDPrintString(0,2,fp);}break;case8:
First=cos(End2);
else{ecvt(First,fp);LCDPrintString(0,2,fp);}break;case9:
First=tan(End2);
else{ecvt(First,fp);LCDPrintString(0,2,fp);}break;}
First=0;n=0;k=-1;g=1;
f=0;b
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1