主频 处理器 控制器 集成电路 逻辑门 寄存器
主页 正文

51单片机汇编计算器

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                                                                                       roderand1[9],operand2[9];

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 进行仿真调试。

热门资讯
孩子逻辑思维弱?家长这样引导最有效
基金炒股36绝招:实战技巧与风险规避指南
中标麒麟7.0系统内核解析
逆变器主频与混频性能对比选择哪个更优?
半导体其与芯片的密切关系
12V逆变器混频与主频使用技巧解析
如何轻松更换澎湃系统时钟样式——实用教程
电脑CPU、显卡档次识别指南