怎样用51单片机做计算器啊?
1. 第一步是找到元件并将它们放入原理图中,如下图所示。
2. 下一步是根据网络标签连接图。
3 然后需要编写程序,
程序源码
#include
#include
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;
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按钮无法通过中断实现。
任何人都可以分享更好的实现。
如果您有任何改进,请在评论区分享。
感谢您的关注和支持。