51单片机计算器(浮点数加减,数码管)
在这款51单片机计算器中,是专门用来实现浮点加减运算的。基于最小系统,用户可以使用键盘输入1到5位数字,包括小数,并使用UP键(加法)和DOWN键(减法)进行运算。
按 ENTER 键执行计算,按 BACK 键清除屏幕并重新开始。
显示结果通过两个74HC573驱动数码管显示。
设计中,单片机的P2.0~P2.7连接CON10的D0~D7,P3.2连接DUAN,P3.5连接WEI,按钮电路连接到CON10的P1口。
微控制器。
该程序使用了“reg51.h”库和一些定义,例如“sbit”和“uchar”,以及用于驱动数字管道的两个数组smgduan0和smgduan1。
计算过程包括数据检查(保证输入数据不超过5位、小数点不超过1位、运算符不超过1位)、数据整理以及按键扫描和延时。
在main函数中,通过定时器0中断实现每0.5秒计时,保证计算过程的稳定性。
当用户输入数字、运算符或者按下删除键时,就会按照相应的逻辑进行相应的操作,并将结果显示在数码管上,无论是正数还是负数。
总体而言,这款单片机计算器提供了一个基本的浮点数计算平台,通过简单的运算就可以实现加减运算,并使用数码管实时显示计算结果。
51单片机计算器(4位,数码管)
本文介绍基于51单片机的四位计算器的实现。使用数码管显示数字和函数结果。
程序就是数码管的引脚, 蜂鸣器 首先定义微控制器的引脚配置,如按钮等。
然后定义常量数组来显示数字和运算符。
程序主体主要包括主函数和按键扫描函数。
主函数循环检测按键输入、数字输入; 根据操作员的选择和输入执行计算结果显示。
主要功能通过按键扫描功能实时监控用户的输入。
如果输入的是数值; 程序将该值存储在相应的变量中。
如果输入是运算符; 程序更新运算符当前执行的值或结果。
当用户点击确认按钮时; 程序会根据两个当前值和运算符进行计算并显示计算结果。
如果输入的值不是范围。
程序将通过蜂鸣器发出信号。
程序保证按键扫描的准确性和输入的可靠性使用延迟功能。
按键扫描功能通过检测行和列的输入状态来检测击键。
密钥发出后, 程序为数值输入; 操作员选择; 根据输入的值进行相关操作,如结果的计算和显示等。
输入数值时, 程序将输入的数字与当前存储的值相结合,以确保输入的数字不超过四位数字。
操作员的选择由与钥匙相关的号码决定。
当用户点击确认键时, 程序根据输入的运算符和当前的两个值计算并显示结果。
如果输入的值不是范围。
程序将显示计算错误并通过蜂鸣器发出信号。
程序中的逻辑判断和过程控制以变量和函数的形式封装,使程序结构清晰,易于理解和维护。
通过这种实现方法, 添加基本的四位数计算器; 减法 乘法和除法的加法; 具有清洁等基本功能可以建造。
程序整体结构合理,功能齐全,适合初学者对51单片机进行编程。
基于51单片机的简易计算器设计,急
//函数0123456789+-×÷=清表3-1 3.2计算器软件设计
#include
#defineu intunsignedint //
#defineucharunsignedchar
sbitlcden=P2^3;//定义引脚
sbitrs=P2^4;
sbitrw=P2^0;
sbitbusy=P0^7;
chari,j,temp,num,num_1;
longa,b,c; //a,第一个数字b,第二个数字c,获取数字
floata_c,b_c;
ucharflag, fuhao;//flag表示是否有符号键按下 , fuhao 表示按下的是哪个符号
<ucharcodetable[]={7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0};
ucharcodetable1[] ={
7,8,9,0x2 f-0x30,
4,5,6,0x2a-0x30,
1,2,3,0x2d-0x30,
0x01-0x30,0 ,0x3d-0x30,0x2b-0x30};
voiddelay(ucharz)//延迟函数
{
uchary;
0;z-- )for(y=0;y<110;y++);
} voidcheck()//判断是否忙 空闲
{
执行{
P0=0xFF;
rs=0; //命令
rw=1; //读取
lcden=0; //禁止读写
delay(1);//等待液晶显示器处理数据
lcden=1; //允许读写
}while(bus sy==1);//判断是否空闲,1为忙,0为空闲
}
voidwrite_com(ucharcom)//写命令函数
{
P0=com; //com命令支付给P0端口
rs=0;
rw=0;
lcden=0;
check( );
lcden=1;
}
voidwrite_date(uchardate)//写入数据函数
{
P0=日期;
rs=1;
rw=0;
lcden =0;
check();
lcden=1;
}
voidinit()//初始化
{
<num=-1;
lcden=1;//使能信号为高电平
write_com(0x38);//8位,2线
write_com(0x0c);//显示打开,光标关闭 ,不闪烁*/
write_com(0x06);//递增模式不移位显示?
write_com(0x80);//检测忙 signal
write_com(0x01);//显示开启,光标关闭,不闪烁
num_1=0;
i=0;
<j=0;
a=0; //首先参与要操作的Number
b=0; //第二个参与运算的数字
c=0;
flag=0;//flag表示是否按下某个符号键,
fuhao=0;//fuhao表示按下哪个符号
}< /p>
voidkeyscan()//键盘 扫描仪
{
P3=0xfe;
if(P3!=0xfe)
{
延迟 (20);//延迟20ms
if(P3!=0x fe)
{
temp=P3&0xf0;
开关(临时)
{
case0xe0:num =0;
休息;
case0xd0:num=1;
break;
case0xb0:num=2;
break;
case0x70:num=3;
break;
}
}
while(P3!= 0xfe);
if(num==0 ||num==1||num==2)//如果按'7'、'8'或'9
{
if(j!=0)
{
write_com(0x01);
if(j!=0)
{
write_com(0x01);
j=0;
}
if(fla ag==0)//符号键未被按下
{
a=a*10+table[num];
}
else//如果符号键已被按下
{
b= b*10+table[num] ;
}
}
else//如果按'/'
{
flag=1 ;
fuhao=4;// 4表示除号被按下
}
i=table1[num];
write_date(0x30+i);
}
P3=0xfd;
i f(P3!=0xfd)
P3=0xfd;
if(P3!=0xfd)
>{
延迟(5);
if(P3!=0xfd)
{< /p>
temp=P3&0xf0;
开关(临时)
{
case0xe0:num=4;
break;
case0xd0:num=5;
break;
ca se0xb0:num=6;
<break;
case0x70:num=7;
break;
}
}
同时 (P3!=0x fd);
if(num==4||num==5||num==6&&num!=7)//如果按'4'、'5'或'6'
{
if(j!=0)
{
write_com(0x01);
j=0;
}
if(flag==0)//未按下符号键
{
a=a*10+table[num];
}
else//如果符号键已被按下
{< /p>
b=b*10+表[编号];
}
}
else//如果按'/'
{
flag=1 ;
fuhao=3;//3表示乘号已按下
}
i=table1[num];
write_date(0x30+i);
}
P3=0xfb;if(P3!=0xfb)
{
延迟(5);
如果 (P3!=0xfb)
{
temp=P3&0xf0;
开关(temp)
{
case0xe0:num=8;
break;
case0xd0:num=9;
打破;
case0xb0:num=10;
break;
case0x70:num=11;
break;
}
}
while(P3!=0xfb);
if(num==8||n um==9||num==10)//如果按'1'、'2'或'3'
{
if(j!=0)
{
write_com(0x01);
j=0 ;
}
if(flag==0)//符号键没有被按下
{
a=a*10+table[num];< /p>
}
else//如果符号键已被按下
{
b=b*10+table[num];
}
}
elseif(num==11)//如果按'-'
{
flag=1;
<fuhao=2;//2表示减号被按下
}
i=table1[num];
write_date(0x30+i);
}
P3=0xf7;
if(P3!=0xf7)
{
延迟(5);
<if(P3!=0xf7)
{
temp=P3&0xf0;
开关(临时)
{
case0xe0:num=12 ;
中断;
case0xd0:num=13;
打破;
case0xb0:num=14;
break;
case0x70:num=15;
break;
}
}
while(P3!=0xf7) ;
switch(num )
{
case12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是“清除”
break;
a=a*10;write_date(0x30);
P1=0;
}
elseif(flag==1)//如果符号 键已按下
{
b=b*1 0;
write_date(0x30);
}
}
break;
case14:{j =1;
if(fuhao= =1){write_com(0x80+0x4f); //按等号键,光标前进到第二行最后显示位置
write_com(0x04); //设置从最后一个到第一个写入数据,每次写入数据完毕,光标后退一格
c=a+b;
while(c! =0)
{
write_date (0x30+c%10);
c=c/10 ;
}
write_date(0x3d); //再写一次"="
a=0;b=0;flag=0;fuhao=0 ;
}
els eif(fuhao= =2){write_com(0x80+0x4f); //光标前进到第二行最后显示位置
write_com(0x04); //设置从最后到前面写入数据,每写入一条数据,光标就向后移动一个空格
//(这按逻辑说是顺序错了,而且 可以和上一段一样显示)
0)c=a-b;
else
c=b-a;
while(c!=0)
{
write_date(0x30+c%10);
c =c/10;
}
i f(a-b<0)
write_date(0x2d);
write_date(0x3d); //再写一次"=
a=0;b=0;flag=0;fu hao=0;
}
elseif(fuhao==3){write_com(0x80+0x4f);
write_com(0x04);
c=a*b;
while(c!=0)
{
write_date(0x30+c%10);
c=c/10;
}
write_date(0x3d);
a=0;b=0;flag= 0;fuhao=0;
}
elseif(fuhao==4){write_ com(0x80+0x4f);
write_com(0x04);
i=0;
c=(long)(((float)a/b )*1000);
while(c!=0)
{
write_date(0x30+c%10);
c=c/10;
i++;
if(i==3)
write_date(0x2e);
}
if(a/b<=0)
write_date(0x30);
write_date(0x3d);
a=0;b=0;flag=0;fuhao=0;
}
}
break;
case15:{write _date(0x30+table1[num]);flag=1;fuhao=1;}
break;
}
<}
}
main()
{
init();
while(1)< /p>
{
keyscan();
}
}
怎样用51单片机做计算器啊?
1. 第一步,找到元件并将其插入到原理图中,如下图所示。
2 下一步是根据网络标签连接表单。
3 然后就需要编写程序了,
程序源码
#include
include< intrins.h>
#include
ucharoperator
voiddelay(uint);
ucharkeyscan();
voiddisp(void);
voidbuf(uintvalue);
4. 最后一步验证编译器是否正确,加载到protues HEX中观察仿真结果是否正确,如下图所示。
扩展信息
计算机模拟:
单片机有一个开发系统,并且随着单片机的发展,开发系统也在不断地演变。
keil是一种先进的单片机集成开发系统。
它代表了汇编语言微控制器开发系统的最新发展。
它开创了多项实用技术,一次性集成了所有编程/模拟/调试/编写/加密开发过程,无需任何编译或。
之间安装。
功能特点:
1.可以模拟63K程序空间,接近64K 16位地址空间;
2. 可以模拟64Kx数据空间,全部6个4K 16位地址空间
3. 可以真正模拟全部32个IO引脚
4. UV2环境、全速等操作
5可以使用C51语言进行调试
6. 当鼠标放置在某个变量上时会建立即显示数值;
7 用户晶振可选,支持0-40MHZ晶振频率;
8 xdata 有 768 字节。
您可以选择在仿真过程中使用它们并执行x数据的仿真
可以仿真9个双DPTR指针
所有波特率通信的11 -38400 bps
12 尺寸非常小,插入用户卡非常方便。
避免模拟时间发生无法解释的故障。
13 模拟插针采用优质镀金插针,可以有效防止随着时间的推移生锈。
选择高品质圆脚IC插座,以保护模拟引脚,而不损坏目标上的触点。
桌子。
14、仿真时间监控控制和用户代码分离,不可能产生不可仿真的软错误,这绝不是普通三极管的简单电路可比的。
功能限制:
仿真器占用单片机串口和定时器2,与KeilC(PC)通信,因此不支持串口和定时器2.模拟功能。
全速运行时,微控制器的串行端口和定时器2可供用户使用。
使用说明:
1 将仿真器插入待仿真用户卡的CPU插槽中。
仿真器由用户板供电;
2 将串口线连接到PC,打开用户板电源
3 进行仿真调试。