单片机C语言简易计算器.docx
- 文档编号:15300606
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:23
- 大小:49.33KB
单片机C语言简易计算器.docx
《单片机C语言简易计算器.docx》由会员分享,可在线阅读,更多相关《单片机C语言简易计算器.docx(23页珍藏版)》请在冰点文库上搜索。
单片机C语言简易计算器
课程设计报告
单片机原理及应用课程名称
简易计算器设计设计题目
专业班级
名姓
号学
1.项目概述
中国古代最早采用的一种计算工具叫算筹。
这种算筹多用竹子制成,也有用木头,兽骨充当材料的。
约二百七十枚一束,放在布袋里可以随身携带。
17世纪初,西方国家的计算工具有了较大的发展,英国数学家纳皮尔发明的“纳皮尔算筹”,英国牧师奥却德发明了圆柱形对数计算尺,这种计算尺不仅能做加减乘除,乘方,开方运算,甚至可以计算三角函数,指数函数和对数函数,这些计算工具不仅带动了计算器的发展,也为现代计算器发展奠定了良好的基础,成为现代社会应用广泛的计算工具。
2.项目要求
基于AT89C51单片机的简易计算器,设计要求如下:
(1)计算器至少能正常显示8位数。
(2)开机时,显示“0”
(3)计算器能对整数进行简单的加减乘除四则运算,在做除法时能自动舍去小数部分
(4)运算结果超过可显示的位数时能进行出错提示。
3.小组人员组成及分工
项目组成员
完成课程设计的内容
主函数设计
利用中断持续间时显示
按键扫描录入函数
计算器加减乘除四则运算
4.系统设计1.框图设计八位七段数码管
显示
AT89C51
按键录入模块(0-9
录入+-*/=c)
5.硬件设计
(1)电路原理图:
(2)元件清单:
元件名称开始
录入数值
判断符号关中断送显示数据定时器赋初值
型号
数量
用途
单片机
AT89C51
1
控制核心
电阻
Ω10k中断开始
4
按键电路
数码管
8位共阳极
1
显示电路
按键
16
按键电路
6.软件设计
(1)算法流程图:
主函数
录入数值
调用运算程序
结束
显示函数
中断结束
按键函数
行扫描
列扫描
赋值给变量
运算查值
(2)程序清单:
#include
/***按键程序***/
charkeyscan();
/***显示程序***/
voiddisplay();
chardsp[9]={0,0,12,12,12,12,12,12,12};//初始化显示数组
/***计算程序***/
voidcalculate(chark,charc1[8],charc2[8]);
/***片选***/
unsignedcharcodeSelect[]=
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/***码选***/
unsignedcharcodeLED_CODES[]=
{0xC0,0xF9,0xA4,0xB0,0x99,//0-4
0x92,0x82,0xF8,0x80,0x90,//5-9
0x86,0xAF,0xFF,0x7F,0xBF,};//E,r,空格,.,-
/***main函数***/
voidmain(void)
{
chari,j,k,c;
chara[8],b[8];
/***定时1ms***/
TMOD=0;
//TL0=-(1000/256);
//TH0=-(1000%6);
总中断开关EA=1;//
ET0=1;//开中断
TR0=1;//启用计数器0
LR:
do
{
for(i=1;i<9;i++)//数字录入循环
{
dsp[0]=keyscan();
if(c==2&&dsp[0]<10)//此段代码验证是否有旧的计算结果在显示,且不再参与
新计算
{
dsp[1]=dsp[0];
for(j=2;j<9;j++)
dsp[j]=12;
c=0;
}
elseif(c==2&&dsp[0]>9)//旧的计算结果将参与新的计算,作为第一个数
{
c=0;
}
if(dsp[0]==0&&dsp[1]==0&&dsp[2]==12)//个位为0且十位为空时按下0,按键无效,跳回LR等待正确输入
{
/***goto跳转标志***/
gotoLR;
}
elseif(dsp[0]>9)break;//有操作符按下,跳出数字录入循环
else
{
for(j=i;j>0;j--)
dsp[j]=dsp[j-1];//移位,以正确显示数字
}
}
if(i==9)//判断是否输入8个有效数字,是则等待操作符,否则直接判断操作符
{
do//使用dowhile无论是否第一个数都取一次操作符
{
dsp[0]=keyscan();//获取操作符号
if(dsp[0]==14||dsp[0]<10)//按下C或者第9位数字清零
{
dsp[1]=0;
for(i=2;i<9;i++)
dsp[i]=12;
c=0;
}
}
while((dsp[0]==15)&&(c==0));//等号被按下,等待新的操作符(仅对第一个数字有效)}
elseif(dsp[0]==14)//按下C清零
{
dsp[1]=0;
for(i=2;i<9;i++)
dsp[i]=12;
c=0;
}
while(dsp[0]==15&&c==0)//未输满8位且是第一个数字即按下等号,等待非等号操作符
{
dsp[0]=keyscan();//获取操作符号
if(dsp[0]==14||dsp[0]<10)//按下C或者数字都进行清零,重新输入a
{
dsp[0]=14;//将dsp[0]置为14,防止因数字清零未能拦截
dsp[1]=0;
for(i=2;i<9;i++)
dsp[i]=12;
c=0;
}
}
}
while(dsp[0]==14);//数字输入未完成即按下C,重新等待输入
do
{
if(c==0)//没有数字输入
{
k=dsp[0];//存计算符(循环内已排除C、=、数字)
for(i=0;i<8;i++)//将第一个数存入a[8]
{
a[i]=dsp[i+1];
}
dsp[1]=0;//清零
for(i=2;i<9;i++)
dsp[i]=12;
c=1;//已输入a
/***goto跳转标志***/
gotoLR;
}
elseif(c==1)
{
for(i=0;i<8;i++)//将第二个数存入b[8]
{
b[i]=dsp[i+1];
}
c=2;//已输入b
if(dsp[0]!
=15)//b输完后操作符不是等号
{
calculate(k,a,b);
for(i=0;i<8;i++)//将计算结果存入a[8],a值更新
{
a[i]=dsp[i+1];
}
k=dsp[0];//更新计算符
c=1;
/***goto跳转标志***/
gotoLR;
}
}
}
while((dsp[0]==15)&&(c<2));//直到ab输入完成且按下等号
calculate(k,a,b);//进行最后计算
/***goto跳转标志***/
gotoLR;//跳回LR,等待新一轮计算
while
(1);//防止程序跑飞
}
charkeyscan()
{
charKeyL;
charKeyR;
charj;
do
{
do
{
P3=0xF0;
P3=P3|0xF0;//行扫描11110000
if(P3!
=0xF0)
{
KeyL=P3;
P3=0x0F;
P3=P3|0x0F;//列扫描00001111
KeyR=P3;
}
}
while(KeyL==0xF0||KeyR==0x0F);
for(j=0;j<12;j++)//延时0.001s=1ms
{;}
}
while(P3!
=0x0F);
switch(KeyL&KeyR)
{
case0x28:
{return0;break;}
case0x11:
{return1;break;}
case0x21:
{return2;break;}
case0x41:
{return3;break;}
case0x12:
{return4;break;}
case0x22:
{return5;break;}
case0x42:
{return6;break;}
case0x14:
{return7;break;}
case0x24:
{return8;break;}
case0x44:
{return9;break;}
case0x81:
{return10;break;}//加法(第一行,第四列)
case0x82:
{return11;break;}//减法(第二行,第四列)
case0x84:
{return12;break;}//乘法(第三行,第四列)
case0x88:
{return13;break;}//除法(第四行,第四列)
case0x18:
{return14;break;}//清零(第四行,第一列)
case0x48:
{return15;break;}//计算结果(第四行,第三列)
}
}
voiddisplay()interrupt1using1//利用定时器中断实现间时显示
{
chari,j,h;
ET0=0;
for(j=8;j>0;j--)//扫描8次
{
for(i=7;i>=0;i--)//从高位到低位扫描显示
{
P2=0;
P1=LED_CODES[dsp[8-i]];
P2=Select[i];
for(h=0;h<8;h++)
{;}
}
}
TL0=-(1000/256);
TH0=-(1000%6);
ET0=1;
}
voidcalculate(chark,chara[8],charb[8])
{
charr[8];
longi,x,y;
i=0;
x=0;
y=0;
for(i=7;i>0;i--)//数值转化,将代表空格的12转化为数字0,因为个位不显示空格,默认为0,所以不转化
{
while(a[i]==12)a[i]=0;
while(b[i]==12)b[i]=0;
}
x=a[4];
x=10000*x;
x=x+a[0]+a[1]*10+a[2]*100+a[3]*1000+a[5]*100000+a[6]*1000000+a[7]*10000000;
y=b[4];
y=10000*y;
y=y+b[0]+b[1]*10+b[2]*100+b[3]*1000+b[5]*100000+b[6]*1000000+b[7]*10000000;
if(k==10)//加法运算
{
x=x+y;
if(x>99999999)//大于8位,显示Err
{
r[0]=11;//r
r[1]=11;//r
r[2]=10;//E
r[3]=12;//空格
r[4]=12;
r[5]=12;
r[6]=12;
r[7]=12;
}
else
{
r[0]=x_x0010_;
r[1]=(x_x0010_0)/10;
r[2]=(x_x0010_00)/100;
r[3]=(x_x0010_000)/1000;
r[4]=(x_x0010_0000)/10000;
r[5]=(x_x0010_00000)/100000;
r[6]=(x_x0010_000000)/1000000;
r[7]=x/10000000;
}
}
if(k==11)//减法运算
{
if(x { x=y-x; if(x>9999999) { r[0]=11;//r r[1]=11;//r r[2]=10;//E r[3]=12;//空格 r[4]=12; r[5]=12; r[6]=12; r[7]=12; } else { r[0]=x_x0010_; r[1]=(x_x0010_0)/10; r[2]=(x_x0010_00)/100; r[3]=(x_x0010_000)/1000; r[4]=(x_x0010_0000)/10000; r[5]=(x_x0010_00000)/100000; r[6]=(x_x0010_000000)/1000000; r[7]=x/10000000; for(i=7;i>0;i--)//将有效数字的高一位转化为-号 { if(r[i]==0&&r[i-1]! =0) { r[i]=14; break; } } } } else { x=x-y; r[0]=x_x0010_; r[1]=(x_x0010_0)/10; r[2]=(x_x0010_00)/100; r[3]=(x_x0010_000)/1000; r[4]=(x_x0010_0000)/10000; r[5]=(x_x0010_00000)/100000; r[6]=(x_x0010_000000)/1000000; r[7]=x/10000000; } } if(k==12)//乘法运算 { i=x; x=x*y; if(y==0) { x=0; } elseif(x>99999999||x { r[0]=11;//r r[1]=11;//r r[2]=10;//E r[3]=12;//空格 r[4]=12; r[5]=12; r[6]=12; r[7]=12; } else { r[0]=x_x0010_; r[1]=(x_x0010_0)/10; r[2]=(x_x0010_00)/100; r[3]=(x_x0010_000)/1000; r[4]=(x_x0010_0000)/10000; r[5]=(x_x0010_00000)/100000; r[6]=(x_x0010_000000)/1000000; r[7]=x/10000000; } } if(k==13)//除法运算 { if(y==0)//被除数不能为0 { r[0]=11;//r r[1]=11;//r r[2]=10;//E r[3]=12;//空格 r[4]=12; r[5]=12; r[6]=12; r[7]=12; } else { x=x/y; r[0]=x_x0010_; r[1]=(x_x0010_0)/10; r[2]=(x_x0010_00)/100; r[3]=(x_x0010_000)/1000; r[4]=(x_x0010_0000)/10000; r[5]=(x_x0010_00000)/100000; r[6]=(x_x0010_000000)/1000000; r[7]=x/10000000; } } for(i=7;i>0;i--)//数值转化,将高位的无效数字0转化为空格符12 { if(r[i]==0) r[i]=12; else break; } for(i=0;i<8;i++)//将计算结果存入dsp[9],显示数更新 { dsp[i+1]=r[i]; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 语言 简易 计算器