CPU 运算器 处理器 微架构 寄存器 内存
主页 正文

51单片机制作简易计算器教程

怎样用51单片机做计算器啊?

1. 第一步是找到元件并将它们放入原理图中,如下图所示。

2. 下一步是根据网络标签连接图。

3 然后需要编写程序,

程序源码

#include# include include < intrins.h>

#include 3                     roderand1[9],operand2[9];

u字符运算符;

voiddelay(uint);

ucharkeyscan();

voiddisp(void);

voidbuf(uintvalue);

4 最后一步是验证编译器是否正确并加载。
在HEX protues中观察仿真结果是否正确,如下图所示。

扩展信息

计算机模拟:

单片机有开发系统,并且随着单片机的发展,开发系统也在不断发展。
keil是一种先进的单片机集成开发系统。

它代表了汇编语言微控制器开发系统的最新发展。
它首创了多项巧妙的技术,将编程/模拟/调试/记录/编码开发过程全部集成在一起,无需编译或编译。
组装在中间。

功能特点:

1. 可以模拟63K程序空间,接近64K 16位地址空间;

2. 可以模拟64Kx数据空间,全部6个4K 16位地址空间;

3. 实际上可以模拟全部32个IO引脚;

4. 完全兼容keilC51UV2调试环境,可以通过UV2环境进行单步、断点、全速等操作;

5. 可以使用C51语言或ASM汇编语言进行调试

6. 当鼠标放置时会设置在某个变量上,即显示其值;

7. 用户晶振可选,支持晶振频率0-40MHZ;

8. 芯片上有768字节的xdata,你可以在仿真时选择使用它们,进行x数据仿真;

9. 可以模拟双DPTR指针;

10. ALE信号输出可以被模拟和消除。

11. -38400bps所有通讯波特率;

12. 尺寸非常小,非常方便安装在用户板上,靠近用户板,无需连接电缆,可以有效减少操作和使用过程中的干扰。
避免模​​拟时间。
出现莫名其妙的问题;

13. 模拟销钉采用优质镀金销钉,可有效防止随着时间的推移而生锈。
选择高质量的圆脚IC插座,可以保护模拟引脚,而不损坏目标上的插座。
木板。

14、仿真时间监控控制代码和用户代码分离,不能产生无法仿真的软错误

15。
RS-232接口不考虑成本而采用MAX202集成电路。
,无法与普通三极管灯泡的简单电路相比。

限制关于功能:

模拟器占用单片机的串口和定时器2,与KeilC(PC)通信,所以不支持串口和定时器2。
模拟器功能烧录。
全速运行时,微控制器串口和定时器2可供用户使用。

使用说明:

1. 将仿真器插入要仿真的用户板的CPU插座上。
;

2. 将仿真器的串口线连接到PC并给用户板上电

3. 通过KeilC的UV2 IDE开发模拟环境下载用户程序; 用于模拟和调试。

基于51单片机的简易计算器设计,急

//函数0123456789+-×÷=清表3-1 3.2计算器软件设计

#include //能量文件头

#define 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,

voiddelay(ucharz)//延迟函数

{

uchary;

0;z-- )

for(y=0;y<110;y++);

} voidcheck()//判断是忙还是闲

{

执行

P0=0xFF;< /p>

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;//激活信号为电平 top

write_com(0x38);//8位,2行

write_com(0x0c);//显示开启,光标关闭,不闪烁*/

write_com(0x06);//增量模式不移位显示?

write_com(0x80);//检测信号 busy

write_com(0x01);//显示开启,光标关闭,不闪烁

num_1=0;

i=0;

j=0;

a=0 //第一个参与Number进行操作

b=0; //第二个参与运算的数字

c=0;

flag=0;//flag表示是否按下某个符号键,

fuhao=0;//fuhao表示按下哪个符号

}

voidkeyscan()//键盘扫描

{

P3=0xfe;

if(P3!=0xfe)

{

延迟 (20);//延迟20毫秒

if(P3!=0x fe)

{

temp=P3&0xf0;

switch(temp)

{

case0xe0:num =0;

暂停;

case0xd0:num=1;

暂停;

case0xb0:num=2;

暂停

case0x70:num=3;

暂停;

}

}

while(P3!=0xfe);

如果(数字==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)

{

延迟(5);

if(P3!=0xfd)

{

temp=P3&0xf0;

开关(临时)

{

case0xe0:num=4;

break;

case0xd0:num=5;

break;

ca se0xb0:num=6;

break;

case0x70:num=7;

break;

同时que(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//如果按键符号被按下

{

b=b*10 +array [num];

}

}

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; /p>

暂停;

case0xd0:num=9;

暂停

case0xb0:num=10;

暂停;

case0x70:num=11;

中断;

}

}

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] ;

{

a=a*10+table[num] ;

{

a=a*10+table[num] ;

}

否则//如果按下了符号键

{

b=b*10+table[num ];

{

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;

暂停;

case0x70:num=15;

break;

}

}

while(P3!=0xf7);

开关(数字 )

{

case12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是“清除”

暂停;

a=a*10;

write_date(0x30);

P1=0;

}

elseif(flag==1)//如果key符号被按下

{

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)

{

c=c/10;

}

write_date(0x3d);

a=0;b=0;flag=0;fuhao=0 ;

}

否则 (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;

}

}

暂停;

case15:{write _date(0x30+table1[num]);flag=1;fuhao=1;}

暂停;

}

}

<

main()

{

init();

while(1)

{

keycan();

}

}

51单片机制作简易计算器

51 单片机使用LCD1602模块和4*4按钮模块创建一个简单的计算器,输入数字和运算符并计算结果。
通过按键操作,按下按键后可以获得输入数据、运算符号和计算结果。
使用的目标微控制器是51系列。
电路结构及外观如下。
代码是这样写的: 有一个小问题:清零键功能无法正常使用,之后无法重新输入数据。
清理原因不明。
实施过程中仍有改进的空间。
由于缺少二极管,4*4按钮无法通过中断实现。
任何人都可以分享更好的实现。
如果您有任何改进,请在评论区分享。
感谢您的关注和支持。
热门资讯
常见中断类型解析与应对策略
逻辑门运算公式
Redis基础命令解析:Key-Value与String类型操作指南
逆变器主频与混频性能对比选择哪个更优?
逻辑运算符详解:非、与、或符号全解析
逻辑门计算公式推导
芯片与半导体的区别在哪
51单片机计算器报告