51单片机基于 Proteus 制作 10 以内加减的计算器

发布者:LogicLeaper最新更新时间:2018-05-07 来源: eefocus关键字:51单片机  Proteus  计算器 手机看文章 扫描二维码
随时随地手机看文章

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);    //等待释放

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

    }

}

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



关键字:51单片机  Proteus  计算器 引用地址:51单片机基于 Proteus 制作 10 以内加减的计算器

上一篇:用 51 单片机和 DAC0832 做波形发生器
下一篇:51单片机--仿真出租车计价器

推荐阅读最新更新时间:2024-03-16 16:01

MCS-51单片机单步工作方式
MCS-51有一种单步工作方式,所谓单步执行就是由外来脉冲控制程序的执行,使之达到来一个脉冲就执行一行指令的目的。而外来脉冲是通过按键产生的,因此实际上单片机执行是按一次键执行一条指令。单步执行是借助单片机的外部中断功能来实现的。 假定利用外部中断0来实现程序的单步执行,为此应事先作好两项准备工作: 〈1〉建立单步执行的外部控制电路,以按键产生脉冲作为外部中断0的中断请求信号,经INT0端输入,并把电路设计成不按键为低电平,按一次键产生一个正脉冲。此外还需要初始化程序中定义INT0低电平有效。 〈2〉编写外部中断0的中断服务程序: JNB P3.2,$
[单片机]
MCS-<font color='red'>51单片机</font>单步工作方式
[51单片机学习笔记FOUR]---16*16LED点阵
一、LED点阵发光原理 8*8单色单片机结构图如下: 从电路图中很简单的就可以看出来,想要点亮点阵中的某一个LED灯。只要使得那个灯所在的行输出高电平,所在列输出低电平就好。 二、点阵扫描实验 1 /*********************************************** 2 实验名称: 点阵扫描 3 实验说明: 扫描每个LED灯,检查点阵是否完好 4 实验时间: 2014/12/24 5 ***********************************************/ 6 #include reg51.h 7 #include intrins.h
[单片机]
[<font color='red'>51单片机</font>学习笔记FOUR]---16*16LED点阵
51单片机-AD与DA合成文件
这一章节的内容比较简单,大家反复细读学习《手把手教你学51单片机》文档第17章就会了解透彻这部分的知识。 1.简要解析概念和代码 我们知道PCF8591有4个通道是可以用来读取输入的电压值的。 那么宋老师写的“unsigned char GetADCValue(unsigned char chn)”就是选择读取其中一个通道输入的测量电压是多少V,受基准源影响,测量范围是0V~2.5V,函数返回值代表读出的电压值为0.01V的n倍左右,也就是返回值为150时,测得的输入电压大概为1.5V。大于2.5V的输入电压,返回值最高为255,也就是测量范围只支持到最高为2.5V。这个概念叫做A/D。 D/A则是选择通道需要输出
[单片机]
<font color='red'>51单片机</font>-AD与DA合成文件
51单片机PWM细分控制步进电机的研究初稿
为什么要PWM细分呢?因为这样可以是步进电机运行平稳、减小噪音、增大转速(MAX的)、增加力矩 为什么要强调是51单片机呢?因为51单片机没有硬件PWM模块,所以只能软件模拟了 研究这玩意儿,我走了许多弯路,看了许多文献,最后发现,尽信书不如无书 就用28系列4相5线电机来说吧。 整步驱动(四相四拍)时序为: A相 B相 C相 D相 1拍 1 0 0 0 2拍 0 1 0 0 3拍 0 0 1 0 4拍 0 0 0 1 我想没人用这样的方式来驱动吧,这震动也太大了。 2细分驱动(四相八拍)时序为: A相 B相 C相 D相
[单片机]
<font color='red'>51单片机</font>PWM细分控制步进电机的研究初稿
基于AT89C51单片机的微型PLC详解
可编程控制器PC(Programmable Controller),为与个人计算机PC(Personal Computer)相区别,可简称为PLC。它是按照成熟而有效的继电控制概念和设计思想,用先进的单片机技术来实现I/O的实时检测和控制,可靠性高,编程简单、易学,因此,得到广泛应用。 将PLC技术引进电工学、电力拖动课程,是课程建设现代化的重要措施。在教学经费相对紧张的情况下,我们自己动手,以AT89C51单片机为核心,设计并研制了LD型微型PLC,应用于继电控制实验,取得了良好的效果。 用单片机构成的PLC,实际上就是一个单片机测控系统。用这样一个程序控制的计算机系统去执行继电控制的梯形图程序,由于继电控制梯形图中各被
[单片机]
基于AT89C<font color='red'>51单片机</font>的微型PLC详解
串口通信详解(51单片机
计算机串行通信基础 随着多微机系统的广泛应用和计算机网络技术的普及,计算机的通信功能愈来愈显得重要。计算机通信是指计算机与外部设备或计算机与计算机之间的信息交换。 通信有并行通信和串行通信两种方式。在多微机系统以及现代测控系统中信息的交换多采用串行通信方式。 串行通信的基本概念 异步通信 异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。 异步通信是以字符(构成的帧)为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符中的各位是以固定的时间传送的,即字符之间不一定有“位间隔”的整数倍的关系,但同一字符内的各位之间的距离均为“位间隔”
[单片机]
串口通信详解(<font color='red'>51单片机</font>)
51单片机:74LS138译码实验
一、实验内容 通过单片机P1.2P1.0控制74LS138译码器的使能及译码输入端口,控制其译码输出端口(Y7Y0)。 (74LS138译码单元C、B、A分别连接P1.2、P1.1、P1.0。) 把译码输出端口Y7Y0连接到L7L0八位LED电平指示输入端口,验证74LS138的逻辑译码功能。 二、仿真图 三、代码 C语言实现: 在这里插入代码片 ```#include reg52.h #include intrins.h void delay1s(void); void main() { char num; while(1) { for(num=0;num 8;num++
[单片机]
<font color='red'>51单片机</font>:74LS138译码实验
DS1090频率计算器
摘要:本应用笔记提供一个简单易用的频率计算器,用于确定适当的型号、偏置电阻以及DS1090低频、电阻可编程、扩频EconOscillator™的输入设置。DS1090可提供125kHz至8MHz的扩频、方波输出。这种扩频功能对于EMI敏感系统,如开关电源,非常有用。 计算器需求 DS1090数据资料说明了:1)如何选择适当型号, 2)如何计算外部偏置电阻得到所要求的输出频率, 3)如何设置外部引脚连接,达到所要求的输出调制。频率计算器为用户提供了一种直观、快速的实验方法,可以很容易地获得最佳方案。 计算器 能够从我们网站下载DS1090频率计算器,计算器基于Excel® 97设计,适用于任何提供Excel 97 (或更新版本)
[电源管理]
DS1090频率<font color='red'>计算器</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved