可实现加减乘除各类运算,带有清零复位功能

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

0.png (24.71 KB, 下载次数: 9)

2019-1-10 04:05 上传

程序代码如下:

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define ulong unsigned long

sbit wela=P2^7;          //定义端口

sbit dula=P2^6;

long in1,in2,out,x;

int cnt,i,flag;

uchar code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};          //LED显示字模,共阴

void delay(uint xms)  //延时函数

{

uint j;

for(i=xms;i>0;i--)

for(j=114;j>0;j--);

}

void display()         //显示函数声明

{

uchar w1,w2,w3,w4,w5,w6,f=0;

long y;

if(x>=0)   //显示六位计时数

{

if(x>=1e6)

{

P0=0xff;

wela=1;

P0=0xf7;

wela=0;

dula=1;

P0=num[12];

dula=0;

delay(2);

P0=0xff;

wela=1;

P0=0xef;

wela=0;

dula=1;

P0=0x3e;

dula=0;

delay(2);

P0=0xff;

wela=1;

P0=0xdf;

wela=0;

dula=1;

P0=num[0];

dula=0;

delay(2);

return;

}

w1=x%10;w2=x/10%10;w3=x/100%10;w4=x/1000%10;w5=x/10000%10;w6=x/100000%10;

if(f==1||w6)

{

f=1;

P0=0xff;

wela=1;

P0=0xfe;

wela=0;

dula=1;

P0=num[w6];

dula=0;

delay(2);

}

if(f==1||w5)

{

f=1;

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

dula=1;

P0=num[w5];

dula=0;

delay(2);

}

if(f==1||w4)

{

f=1;

P0=0xff;

wela=1;

P0=0xfb;

wela=0;

dula=1;

P0=num[w4];

dula=0;

delay(2);

}

if(f==1||w3)

{

f=1;

P0=0xff;

wela=1;

P0=0xf7;

wela=0;

dula=1;

P0=num[w3];

dula=0;

delay(2);

}

if(f==1||w2)

{

f=1;

P0=0xff;

wela=1;

P0=0xef;

wela=0;

dula=1;

P0=num[w2];

dula=0;

delay(2);

}

P0=0xff;

wela=1;

P0=0xdf;

wela=0;

dula=1;

P0=num[w1];

dula=0;

delay(2);

}

else

{

y=labs(x);

if(y>=1e5)

{

P0=0xff;

wela=1;

P0=0xf7;

wela=0;

dula=1;

P0=num[12];

dula=0;

delay(2);

P0=0xff;

wela=1;

P0=0xef;

wela=0;

dula=1;

P0=0x3e;

dula=0;

delay(2);

P0=0xff;

wela=1;

P0=0xdf;

wela=0;

dula=1;

P0=num[0];

dula=0;

delay(2);

return;

}

w1=y%10;w2=y/10%10;w3=y/100%10;w4=y/1000%10;w5=y/10000%10;

if(f==1||w5)

{

if(f==0)

{

P0=0xff;

wela=1;

P0=0xfe;

wela=0;

dula=1;

P0=0x40;

dula=0;

delay(2);

}

f=1;

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

dula=1;

P0=num[w5];

dula=0;

delay(2);

}

if(f==1||w4)

{

if(f==0)

{

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

dula=1;

P0=0x40;

dula=0;

delay(2);

}

f=1;

P0=0xff;

wela=1;

P0=0xfb;

wela=0;

dula=1;

P0=num[w4];

dula=0;

delay(2);

}

if(f==1||w3)

{

if(f==0)

{

P0=0xff;

wela=1;

P0=0xfb;

wela=0;

dula=1;

P0=0x40;

dula=0;

delay(2);

}

f=1;

P0=0xff;

wela=1;

P0=0xf7;

wela=0;

dula=1;

P0=num[w3];

dula=0;

delay(2);

}

if(f==1||w2)

{

if(f==0)

{

P0=0xff;

wela=1;

P0=0xf7;

wela=0;

dula=1;

P0=0x40;

dula=0;

delay(2);

}

f=1;

P0=0xff;

wela=1;

P0=0xef;

wela=0;

dula=1;

P0=num[w2];

dula=0;

delay(2);

}

if(f==0)

{

P0=0xff;

wela=1;

P0=0xef;

wela=0;

dula=1;

P0=0x40;

dula=0;

delay(2);

}

P0=0xff;

wela=1;

P0=0xdf;

wela=0;

dula=1;

P0=num[w1];

dula=0;

delay(2);

}

}

void keyscan()         //键盘扫描函数

{

uchar temp;

P1=0xfe;

temp=P1;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(8);

temp=P1;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xee:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+7;

x=in1;

}

else

{

in2=in2*10+7;

x=in2;

}

}

break;

case 0xde:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+8;

x=in1;

}

else

{

in2=in2*10+8;

x=in2;

}

}

break;

case 0xbe:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+9;

x=in1;

}

else

{

in2=in2*10+9;

x=in2;

}

}

break;

case 0x7e:

if(cnt!=0&&flag==0)

{

cnt=0;

flag=4;

}

break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

}

}

P1=0xfd;

temp=P1;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(8);

temp=P1;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xed:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+4;

x=in1;

}

else

{

in2=in2*10+4;

x=in2;

}

}

break;

case 0xdd:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+5;

x=in1;

}

else

{

in2=in2*10+5;

x=in2;

}

}

break;

case 0xbd:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+6;

x=in1;

}

else

{

in2=in2*10+6;

x=in2;

}

}

break;

case 0x7d:

if(cnt!=0&&flag==0)

{

cnt=0;

flag=3;

}

break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

}

}

P1=0xfb;

temp=P1;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(8);        //消除抖动

temp=P1;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P1;

switch(temp)

{

case 0xeb:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+1;

x=in1;

}

else

{

in2=in2*10+1;

x=in2;

}

}

break;

case 0xdb:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+2;

x=in1;

}

else

{

in2=in2*10+2;

x=in2;

}

}

break;

case 0xbb:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+3;

x=in1;

}

else

{

in2=in2*10+3;

x=in2;

}

}

break;

case 0x7b:

if(cnt!=0&&flag==0)

{

cnt=0;

flag=2;

}

break;

}

while(temp!=0xf0)

{

temp=P1;

temp=temp&0xf0;

}

}

}

P1=0xf7;

temp=P1;

temp=temp&0xf0;

if(temp!=0xf0)

{

delay(8);

temp=P1;

temp=temp&0xf0;

if(temp!=0xf0)    //证明有键按下,if语句是为了让键盘松开

{

temp=P1;

switch(temp)

{

case 0xe7:

cnt=0;

in1=0;

in2=0;

out=0;

flag=0;

x=0;

break;

case 0xd7:

if(cnt<6)

{

cnt++;

if(flag==0)

{

in1=in1*10+0;

x=in1;

}

else

{

in2=in2*10+0;

x=in2;

}

}

break;

case 0xb7:           //如果得到符号位

switch(flag)

{

case 1:

out=in1+in2;        //加

break;

case 2:

out=in1-in2;        //减

break;

case 3:

out=in1*in2;        //乘

break;

case 4:

if(in2)

out=in1/in2;        //除

break;

}

x=out;

in1=0;

in2=0;

cnt=0;

flag=0;

break;

case 0x77:

if(cnt!=0&&flag==0)

{

cnt=0;

flag=1;

}

break;

}

while(temp!=0xf0)   //等待按键松开

{

temp=P1;

temp=temp&0xf0;

}

}

}

}

void main()          //主函数

{

while(1)

{

keyscan();

display();

}

}

全部资料51hei下载地址:

jisuanqi.zip

(100.27 KB, 下载次数: 26)

2019-1-10 03:32 上传

点击文件名下载附件

下载积分: 黑币 -5

51单片机c语言编写计算器仿真,基于51单片机的计算器设计c程序代码加proteus仿真...相关推荐

  1. 51单片机c语言dac0832产生波形,基于51单片机的DAC0832波形发生器设计

    波形发生器是一种常用的信号源,广泛的应用于电子电路.自动控制系统和教学实验等领域,是现代测试领域内应用最为广泛的通用仪器之一.在研制.生产.测试和维修各种电子元件.部件以及整机设备时,都需要有信号源. ...

  2. 用c语言编写热敏电阻温度计,基于51单片机的热敏电阻温度计的设计.doc

    摘 要 随着科学技术的不断进步与发展,热敏电阻温度计已开始逐渐替代传统的玻璃水银体温计.温度控制系统在国内各行各业的应用虽然已经十分广泛,传统的温度控制方式,主要缺点是温度波动范围大,不能满足高精度, ...

  3. 单片机c语言计数器测速,基于51单片机的光电编码器测速.doc

    课程设计报告 课程名称: 微机原理课程设计 题 目: 基于51单片机的光电编码器测速 摘要 光电编码器是高精度位置控制系统常用的一种位移检测传感器.在位置控制系统中,由于电机既可能正转,也可能反转,所 ...

  4. 单片机c语言reti的用法,基于51单片机中断跳出指令“RETI”浅议

    原标题:基于51单片机中断跳出指令"RETI"浅议 =RET指令+通知CPU中断服务已结束. 最近在基于编程的过程中出现了个很奇怪的问题"程序执行中在寄存器EA=1,ET ...

  5. 单片机c语言篮球比分_基于51单片机的篮球记分牌设计

    1 摘 要 单片机,亦称单片微电脑或单片微型计算机.它是把中央处理器( CPU ).随机存 取存储器( RAM ).只读存储器( ROM ).输入 / 输出端口( I/0 )等主要计算机功能部件 都集 ...

  6. 如何用c语言编写智能照明系统,基于STC89C52单片机的智能照明控制系统方案设计...

    目前我国高校的教学楼和学生宿舍的照明系统大多采用定时方式控制,存在电能的大量浪费和照明模式不灵活等问题.本文基于51单片机,通过设置时间.感应光照与声音,针对教学楼和宿舍的不同需求设定照明状态,实现对 ...

  7. 单片机c语言交通灯源程序,基于80C51单片机的交通灯C语言源程序

    <基于80C51单片机的交通灯C语言源程序>由会员分享,可在线阅读,更多相关<基于80C51单片机的交通灯C语言源程序(5页珍藏版)>请在人人文库网上搜索. 1.include ...

  8. 单片机c语言慧尾灯编码,基于AT89S52单片机的汽车LED尾灯控制器设计毕业论文+电路仿真+PCB+程序源码...

    摘要 本次论文主要利用AT89S52单片机模拟汽车尾灯进行智能控制的控制器,用8个LED灯模拟汽车尾灯,6个独立按键分别对应了右转.左转.危险警示.夜间模式切换.检查信号.刹车不同的状态,在实际设计模 ...

  9. 软件工程-c语言--基于at89c51单片机c语言编写的计算器,基于AT89C1单片机C语言编写的计算器.doc...

    基于AT89C1单片机C语言编写的计算器 #include #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; ...

最新文章

  1. IMI装系统装到一半出错?
  2. 二叉树结点入度等于出度
  3. QNX6.5编译libcurl
  4. m3u8转mp4缓存合并工厂_多线程m3u8下载工具,支持windowsamp;amp;linux;两个羊毛线报...
  5. (常用API)正则表达式语法规则
  6. 重置线程中断状态_记住要重置线程上下文类加载器
  7. java 股票 代码_Java中利用散列表实现股票行情的查询_java
  8. 博士生的deadline血泪史,这是一份来自Nature的避坑指南
  9. Python 链表内取随机数(list取随机数)
  10. Codeforces.802C.Heidi and Library (hard) (费用流zkw)
  11. 三方应用集成_华为携手利尔达完成业界首个5G工业智能网关预商用集成验证
  12. Visual Studio 2010修改授权
  13. SVM支持向量机:分类、回归和核函数
  14. 趣闻|论文不必参考任何文献?看到作者,网友大呼失敬了
  15. DevOps使用教程 华为云(15)git如何将本地项目初始化为远程仓库
  16. PS修补工具使用方法
  17. 摄像头设计工程师面试技巧_系统设计面试准备的5个技巧
  18. JS原生编写飞机大战小蜜蜂游戏
  19. 分布式事务(6)-分布式事务处理技术之RocketMQ
  20. docker 创建容器时指定容器ip

热门文章

  1. sublime下载与安装
  2. 从AX2012系统批量生成CSV格式数据
  3. 16.Oracle杂记——数据字典dba_tab_ privs
  4. FD小工具代码-hex2bin
  5. 【IT之路】微信小程序之初探
  6. 专利申请模板各个内容的例子
  7. 崔华的printsql的脚本内容以及执行效果
  8. DBCP连接池配置参数详解
  9. 史上最小sql2005下载只有57.2M(含图形管理工具)
  10. IDEA EasyCode Oracle映射关系