历史上的今天
返回首页

历史上的今天

今天是:2025年05月07日(星期三)

正在发生

2018年05月07日 | 51单片机基于 Proteus 制作 10 以内加减的计算器

2018-05-07 来源:eefocus

51 单片机,本质上是微控制器,以逻辑运算见长。

用它来设计计算器 ?

不知道谁想出来的这样的题目,思路明显就是跑偏了,呵呵


特别是后一个的题目,不仅要求能加减乘除,竟然还要求选用数码管来显示。

如果是选用 LCD1602 液晶屏来显示,勉强还算对路。

数码管,只能显示出来减号,让它显示加号、乘号、除号,都是不可能的。


一些网友为这个题目提供了答案,可是没有一个像样的,呵呵

提问者也明显不满意,又反复提问了好几次。


前一个设计计算器的题目,提问者提供了部分程序和电路,要求如下:


老师要求只要3个数码管,完成10以内加减。

第一个数码管表示第1个数字,

第二个数码管表示符号(+或-,用A-F任意表示),

第三个数码管表示第2个数字。

按下等号(等号也用A-F任意表示)三个数码管熄灯,第一个数码管显示答案。


因为提问者给出的资料较多,要求也非常简明,故此做而论道针对这个题目,给出了一个答案。

(另外一个题目,就不回答了。)


做而论道设计的计算器电路,和提问者给定的,稍有不同。


仿真运行后的画面如下:

51单片机基于 Proteus 制作 10 以内加减的计算器 - 非著名博主 - 电子信息角落

图片:http://xiangce.baidu.com/picture/detail/3e030be4be33ec2bebcd56569dee061f50d6848d

题目:http://zhidao.baidu.com/question/2075214728949956868.html


这是在输入了 1+8 时的截图,其中的+,数码管显示不出来,只好用【-1】冒充了一下。



做而论道的设计,有几个特点:


1.具有光标显示功能。


在等待用户按键时,光标会在指定的位置上闪动。

当输入一个数字后,光标自动向右移动一位,继续闪烁。


2.选用了计算器的标准键盘。


由于自定义的 4×4 键盘不好看,而且电路复杂,不如用 PROTEUS 带来的标准键盘。

只是这样弄,键盘的编码表就要重新编写了,这也是一般人难以胜任的工作。


3.具有无效键排除功能。


在不同的位置只能输入特定的按键,比如在输入数字时,只能输入0~9,按下其它的按键,

本系统不予理会。

同样,在需要输入等号=时,按下数字键,本系统也不予理会。


4.可以显示大于两位数的结果。


题目仅仅要求显示一位数字的结果。而本系统最大可以显示 18,即 9 + 9 的结果。


5.可以显示负数。


题目对此没有要求。本系统则可以显示负号和绝对值,比如,输入 4 - 9 =,

本系统就能显示出来:-5。


6.可以循环工作。


题目对此也没有要求。本系统则在显示结果之后,再按下 ON/C,即可清除显示屏,重新开始工作。


还有一些有特色的地方,就不多说了,请大家自己发掘。


全部程序如下:


//一位数的加减计算器


#include


//------------------------------------

char led_mod[] = {

    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

    0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71,0x46,0x40};

//------------------------------------

char key_buf[] = {

    0xd7,0xeb,0xdb,0xbb, 0xed,0xdd,0xbd,0xee, 

    0xde,0xbe,0xe7,0xb7, 0x77,0x7b,0x7d,0x7e};

//------------------------------------

void delay(char i)

{

    unsigned  char  j, k;

    for(j = i; j > 0; j--)  for(k = 125; k > 0; k--);

}

//------------------------------------

char getKey(void)

{

    char key_scan[] = {0xef, 0xdf, 0xbf, 0x7f};

    char i, j;

    for(i = 0; i < 4; i++){

      P2 = key_scan[i];

      if((P2 & 0x0f) != 0x0f) 

        for(j = 0; j < 16; j++)

          if(key_buf[j] == P2)

            return j;      

    }

    return -1;

}

//------------------------------------

//以上,基本上都是提问者给出的资料

//------------------------------------

char FlashKey(char p, char d)

{

    unsigned  char  i, k;

    while(1) {

      for(i = 100; i > 0; i--)  {

        delay(10);

        k = getKey();

        if (k < 16)  return k;  

      }

      if (p == 0)  P0 = d;

      if (p == 1)  P1 = d;

      if (p == 3)  P3 = d;

      for(i = 100; i > 0; i--)  {

        delay(10);

        k = getKey();

        if (k < 16)  return k;  

      }

      if (p == 0)  P0 = 255;

      if (p == 1)  P1 = 255;

      if (p == 3)  P3 = 255;

    }

}

//------------------------------------

void main(void)

{

    char  key, aa, ff, bb, cc;

    while(1) {

//-------------------------------

      key = FlashKey(0, 0xf7);

      while (key > 9)  key = FlashKey(0, 0xf7);

      P0 = ~led_mod[key]; aa = key; //0~9

      while (getKey() != -1);    //等待释放

//-------------------------------

      key = FlashKey(1, 0xf7);

      while ((key != 12) && (key != 13))  key = FlashKey(1, 0xf7);

      P1 = ~led_mod[key + 4]; ff = key; //加减运算

      while (getKey() != -1);    //等待释放

//-------------------------------

      key = FlashKey(3, 0xf7);

      while (key > 9)  key = FlashKey(3, 0xf7);

      P3 = ~led_mod[key]; bb = key; //0~9

      while (getKey() != -1);    //等待释放

//-------------------------------

      while (getKey() != 11);    //等号

      if(ff == 12)  cc = aa + bb;     //进行计算

      if(ff == 13)  cc = aa - bb;

      P0 = 255;  P1 = 255;  P3 = 255; //清屏

      if   (cc < 0) {P1 = 0xbf;  P3 = ~led_mod[-cc];}

      else if (cc > 9) {P1 = ~led_mod[cc / 10]; P3 = ~led_mod[cc % 10];}

      else  P3 = ~led_mod[cc];

      while (getKey() != -1);    //等待释放

//-------------------------------

      while (getKey() != 10);    //ON/C

      P0 = 255;  P1 = 255;  P3 = 255; //清屏

      while (getKey() != -1);    //等待释放

//-------------------------------

    }

}

//------------------------------------



推荐阅读

史海拾趣

BNS Solutions公司的发展小趣事

随着技术的不断进步,BNS Solutions公司意识到,要想在竞争激烈的电子行业中保持领先地位,必须不断拓展市场并寻求战略合作。于是,公司开始积极拓展国内外市场,与多家知名企业和机构建立了紧密的合作关系。通过合作,BNS Solutions公司不仅获得了更多的资源和支持,还成功将产品推广到了更广泛的市场领域。同时,公司还积极参与行业交流活动,不断提升自身在行业内的影响力和地位。

Datalinear公司的发展小趣事

作为一家有远见的企业,Datalinear公司始终关注社会责任和可持续发展。公司积极参与环保活动,推行绿色生产理念,努力降低生产过程中的能耗和排放。同时,公司还关注员工的福利和发展,为员工提供良好的工作环境和培训机会。此外,Datalinear公司还积极参与社会公益事业,为社会做出了积极贡献。

Force Technologies Ltd公司的发展小趣事

背景:随着全球对环境保护意识的增强,Force Technologies Ltd积极响应号召,将绿色环保理念融入企业发展中。

发展:公司投入巨资研发环保型电子产品和制造工艺,致力于减少生产过程中的废弃物排放和能源消耗。同时,公司还积极推动供应链的绿色化转型,与供应商共同制定环保标准和措施。这些努力不仅提升了公司的社会形象,还为其赢得了更多消费者的信赖和支持。

DPA Components International公司的发展小趣事

在成功立足国内市场后,DPA Components International公司开始积极拓展国际市场。公司深入了解不同国家和地区的市场需求,针对性地调整产品策略和服务模式。通过参加国际展会、建立海外销售网络以及与国外企业合作,DPA逐渐打开了国际市场的大门。在国际市场上,DPA凭借其卓越的产品质量和专业的技术服务,赢得了众多客户的信任和支持,进一步提升了公司的品牌影响力和市场份额。

Advanced Photonix公司的发展小趣事

随着产品的不断成熟和市场的日益扩大,Advanced Photonix开始寻求与全球分销商的合作。在经过一番谨慎的筛选和谈判后,公司与全球知名的半导体和电子元器件授权分销商贸泽电子签订了全球分销协议。这一合作使得Advanced Photonix的产品能够更快地进入全球市场,同时也提高了公司的知名度和影响力。通过贸泽电子的分销网络,Advanced Photonix的光电二极管、混合器件以及光电管等产品得到了广泛应用,进一步巩固了公司在电子行业的领先地位。

B&B Electronics Manufacturing Company公司的发展小趣事

在发展过程中,B&B公司注重与上下游企业的合作与共赢。公司与多家知名的芯片制造商、原材料供应商建立了长期稳定的合作关系,确保了产品的质量和供应链的稳定性。同时,公司也积极与集成商、解决方案提供商等合作伙伴开展深度合作,共同为客户提供更加完善的服务。

问答坊 | AI 解惑

数字机顶盒的工作原理

本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 数字机顶盒原理简介 机顶盒(STB)简介: 机顶盒是一种能提供模拟音频和视频接口,使现在的模拟电视机能正常接收节目;同时,还能提供数字电视、数字广播接口,提供交互式功能的接口装置。它 ...…

查看全部问答>

关于XILINX的V5系列SX95T-1的问题

XILINX的V5系列SX95T-1 ,现在采337.5M的数据,双沿采,类似DDR,但是总线是LVDS25的,数据率就是675M,用OFFSET IN约束采样数据,不管怎么调时钟相位,运行时序分析器总有变红的,不是SETUP变红,就是HOLD变红,不知采的数准不准。采的数是高速A/D ...…

查看全部问答>

嵌入式学习,嵌入式学习有哪些要素呢

学习,老师是非常关键的环节。对于嵌入式的学习当然也不例外。所以,在嵌入式的学习中,老师是很重要的要素之一。 嵌入式学习,挑选什么样的老师? 双师型老师。具体的来说,一方面,具备嵌入式的研发经验,有独立开发的项目和作品,在嵌入式行 ...…

查看全部问答>

tinyos移植到gains 3的问题

tinyos可以移植到gains 3里面么。。。主要是想应用tinyos里面所带的java工具的功能。。 如果可以要怎么去做啊,给各大概的思路,比如说要修改哪个里面的东西之类的,有没有相关的资料…

查看全部问答>

通过FirmwareLib在EK_STM32F上的学习体会

简单的说,就是把原来基于评估版()Firmware Lib上各个外设的应用示例移植到EK_STM32F上运行。工具IAR,使用方法:直接利用Firmware Lib的project,打开FWLibprojectEWARM打开Project.eww,并用相应文件覆盖project目录下的同名文 ...…

查看全部问答>

MINI STM32 开发板原理图

应广大坛友的要求,今天把MINI板子原理图上传上来     简单介绍下板子的硬件资源:     1、板载STM32F103VET6芯片 LQFP100封装;   2、板载1路CAN接口,接口芯片TJA1050;   3、板载1路RS485接口, ...…

查看全部问答>

我做的msp430fr5739的小程序

以前在坛子里团购的5739的板子,一直闲置来着    最近做项目就又拿出来用了  闲时写了个小程序,P1.1做adc采样,然后通过板载uart发到PC显示,用串口助手可看电压,默认内部Verf = 2.5V  需要的网友可以拿来看看,顺便也能测试 ...…

查看全部问答>

TI Miracast系统解决方案:实现Wi-Fi影音串流

本帖最后由 dontium 于 2015-1-23 12:42 编辑 TI Miracast解决方案与Miracast认证的测试平台兼容,可与Wi-Fi CERTIFIED Miracast装置互通。Miracast系统使用TI处理器的负载分担(offload)能力与内建加速器,以及专用的速率适配(rate adaptation)与 ...…

查看全部问答>

MSP432的硬件SPI驱动SD卡的问题

今天发现一个奇怪的现象,上午能用MSP432的硬件SPI驱动SD卡,下午就不能了,最后发现程序始终停留在SPI_enableInterrupt()这个函数里,这是什么鬼啊??? …

查看全部问答>