单片机计算器设计

发布者:数据迷航者最新更新时间:2013-04-02 来源: 51hei关键字:单片机  计算器  AT89S51 手机看文章 扫描二维码
随时随地手机看文章

1.实验任务

(1.开机时,显示“0”

(2.第一次按下时,显示“D1”;第二次按下时,显示“D1D2”;第三按下时,显示“D1D2D3”,8个全显示完毕,再按下按键下时,给出“嘀”提示音。

2.电路原理图

点击浏览下一页

图4.23.1

3.系统板上硬件连线

(1.把“单片机系统”区域中的P1.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上;

(2.把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;

(3.把“单片机系统”区域中的P0.0-P0.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;

(4.把“单片机系统:区域中的P2.0-P2.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;

4.相关程序设计内容

(1.行列式键盘输入及按键功能设定;

(2.动态数码显示;

(3.数码显示方式处理;

5.汇编源程序

(略)

6. C语言源程序

#include

unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

unsigned char dispbuf[8]={0,16,16,16,16,16,16,16};

unsigned char dispbitcount;

unsigned char temp;

unsigned char i,j;

unsigned char key;

unsigned char keypos;

bit alarmflag;

void change(unsigned char *p,unsigned char count)

{

  while(count>0)

    {

      *(p+count)=*(p+count-1);

      count--;

    }

} [page]

void main(void)

{

  TMOD=0x01;

  TH0=(65536-4000) / 256;

  TL0=(65536-4000) % 256;

  TR0=1;

  ET0=1;

  EA=1;

  while(1)

    {

      P3=0xff;

      P3_4=0;

      temp=P3;

      temp=temp & 0x0f;

      if (temp!=0x0f)

        {

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

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

          temp=P3;

          temp=temp & 0x0f;

          if (temp!=0x0f)

            {

              temp=P3;

              temp=temp & 0x0f;             

              switch(temp)

                {

                  case 0x0e:

                    key=7;

                    break;

                  case 0x0d:

                    key=8;

                    break;

                  case 0x0b:

                    key=9;

                    break;

                  case 0x07:

                    key=10;

                    break;

                }

              if ((key>=0) && (key<10))

              {

                keypos++;

                if(keypos<8)

                  {

                    change(dispbuf,keypos);

                    dispbuf[0]=key;

                  }

                  else

                    {

                      keypos=8;

                      alarmflag=1;

                    }

              }

              temp=P3;

              P1_0=~P1_0;

              temp=temp & 0x0f;             

              while(temp!=0x0f)

                {

                  temp=P3;

                  temp=temp & 0x0f;             

                }

              alarmflag=0;

            }

        }

      P3=0xff;

      P3_5=0;

      temp=P3;

      temp=temp & 0x0f;

      if (temp!=0x0f)

        {

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

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

          temp=P3;

          temp=temp & 0x0f;

          if (temp!=0x0f)

            {

              temp=P3;

              temp=temp & 0x0f;             

              switch(temp)

                {

                  case 0x0e:

                    key=4;

                    break;

                  case 0x0d:

                    key=5;

                    break;

                  case 0x0b:

                    key=6;

                    break;

                  case 0x07:

                    key=11;

                    break;

                }

              if ((key>=0) && (key<10))

              {

                keypos++;

                if(keypos<8)

                  {

                    change(dispbuf,keypos);

                    dispbuf[0]=key;

                  }

                  else

                    {

                      keypos=8;

                      alarmflag=1;

                    }

              }

              temp=P3;

              P1_0=~P1_0;

              temp=temp & 0x0f;             

              while(temp!=0x0f)

                {

                  temp=P3;

                  temp=temp & 0x0f;             

                }

              alarmflag=0;

            }

        } [page]

      P3=0xff;

      P3_6=0;

      temp=P3;

      temp=temp & 0x0f;

      if (temp!=0x0f)

        {

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

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

          temp=P3;

          temp=temp & 0x0f;

          if (temp!=0x0f)

            {

              temp=P3;

              temp=temp & 0x0f;             

              switch(temp)

                {

                  case 0x0e:

                    key=1;

                    break;

                  case 0x0d:

                    key=2;

                    break;

                  case 0x0b:

                    key=3;

                    break;

                  case 0x07:

                    key=12;

                    break;

                }

              if ((key>=0) && (key<10))

              {

                keypos++;

                if(keypos<8)

                  {

                    change(dispbuf,keypos);

                    dispbuf[0]=key;

                  }

                  else

                    {

                      keypos=8;

                      alarmflag=1;

                    }

              }

              temp=P3;

              P1_0=~P1_0;

              temp=temp & 0x0f;             

              while(temp!=0x0f)

                {

                  temp=P3;

                  temp=temp & 0x0f;              

                }

              alarmflag=0;

            }

        }

      P3=0xff;

      P3_7=0;

      temp=P3;

      temp=temp & 0x0f;

      if (temp!=0x0f)

        {

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

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

          temp=P3;

          temp=temp & 0x0f;

          if (temp!=0x0f)

            {

              temp=P3;

              temp=temp & 0x0f;             

              switch(temp)

                {

                  case 0x0e:

                    key=0;

                    break;

                  case 0x0d:

                    key=13;

                    break;

                  case 0x0b:

                    key=14;

                    break;

                  case 0x07:

                    key=15;

                    break;

                }

              if ((key>=0) && (key<10))

              {

                keypos++;

                if(keypos<8)

                  {

                    change(dispbuf,keypos);

                    dispbuf[0]=key;

                  }

                  else

                    {

                      keypos=8;

                      alarmflag=1;

                    }

              }

              temp=P3;

              P1_0=~P1_0;

              temp=temp & 0x0f;             

              while(temp!=0x0f)

                {

                  temp=P3;

                  temp=temp & 0x0f;             

                }

              alarmflag=0;

            }

        }

    }

}

void t0(void) interrupt 1 using 0

{

  TH0=(65536-4000) / 256;

  TL0=(65536-4000) % 256;

  P0=dispcode[dispbuf[dispbitcount]];

  P2=dispbitcode[dispbitcount];

  dispbitcount++;

  if (dispbitcount==8)

    {

      dispbitcount=0;

    }

  if (alarmflag==1)

    {

      P1_1=~P1_1;

    }

}

关键字:单片机  计算器  AT89S51 引用地址:单片机计算器设计

上一篇:单片机数字钟设计
下一篇:DS18B20数字温度计单片机接口应用

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

基于双单片机的电烤箱温度控制系统设计
在生产生活过程中,控制对象各种各样,温度控制在生产过程中占有相当大的比例,其关键在于测温和控温两方面。由于单片机具有集成度高、功能强、体积小、价格低、抗干扰能力等优于一般CPU的优点,因此,在要求高控制精度和低成本的工业测控系统中,通常采用单片机作为数字控制器取代模拟控制器。文献中采用AD590作为温度传感器预设多组PID参数实现温度控制;文献采用单个87C51作为控制器,兼顾检测、控制等任务实现温度控制。此二者均采用AD590温度传感器进行温度测量,其外围电路复杂、成本高且精确度低;针对这些问题,该论文采用数字传感器克服其缺点。同时该论文采用双单片机来实现控制,采用无线方式进行信号传输,以满足在特定使用环境下,实现远距离的控制。
[单片机]
基于双<font color='red'>单片机</font>的电烤箱温度控制系统设计
单片机系统与标准PC键盘的接口模块设计
概述   在单片机系统中,当输入按键较多时,在硬件设计和软件编程之间总存在着矛盾。对于不同的单片机系统需要进行专用的键盘硬件设计和编程调试,通用性差,使项目开发复杂化。标准PC键盘在工艺与技术上都已相当成熟,而且工作稳定,价格低廉。本设计实现了一个接口模块,它将标准PC键盘发出的位置扫描码,变换为标准的ASCII码和OEM扫描码或Windows虚拟键代码,再以并行或串行方式传送给上位单片机。 接口模块的特点   该模块在PC键盘与上位单片机之间起转换作用,它屏蔽了与PC键盘进行数据和命令交互的复杂过程,大大简化了上位单片机系统的输入设计;它实现了类似DOS操作系统中键盘中断服务程序的功能,使设计人员只需关心接收按键的结果,并可使
[单片机]
NEC电子新款32位闪存微控制器产品,功耗降低50%
           ~低功耗的全闪存微控制器全新问世~ NEC电子日前完成了8款低功耗版32位闪存微控制器的开发,并将其作为全闪存微控制器的第一阶段产品,于即日起开始供应样品。此次推出的系列产品共包括4款V850ES/JG3-L产品和4款V850ES/JF3-L产品,它们均使用了低功耗技术,因此功耗仅为现有产品的一半左右。 新系列产品以32位全闪存微控制器“V850ES/JG3”为基础,大幅度降低了功耗。该系列产品的最大优势在于功耗由以往的1.7mW/MIPS降低至0.9 mW/MIPS,该功耗值不仅约为NEC电子以往同类产品的一半,而且低于普通16位微控制器的1MIPS的平均功耗值的一半。 通过使用新产品,用户不仅可以用更小
[单片机]
单片机中断c语言使用
根据仪陇单片机TINYC使用手册翻译 中断c语言,关于中断的现场保护,由于英文手册还没有看懂,所以空来没有写出。 低级中断,中断保护程序 中断执行前对一些寄存器进行保护 Void intcall tcc_1(void) @ 0x03:low_int 0 中断服务程序 Void intcall tcc(void) @ int 0 中断向量数,是指MCU有几个中断向量,用标号将每种中断向量分开。 编译器根据中断向量数将中断保护程序和中断服务程序结合起来 全局中断向量IntVecIdx 先申明全局中断下向量IntVecIdx Extern int IntVecIdx;// IntVecIdx将占用地址0x10,用户
[单片机]
MaximDeepCover®微控制器协助同亨科技(XAC)通过PCI-PTS 4.1认证
中国,北京 2016年8月25日 同亨科技股份有限公司(XAC Automation Corporation)(Taiwan OTC: 5490)推出的最新安全密码键盘和智能卡读卡器 E200NP和E200CP 采用Maxim Integrated Products, Inc (NASDAQ: MXIM)的MAX32550 DeepCover 安全微控制器,成功通过严格的PCI-PTS 4.1认证要求。 产品要想通过PCI-PTS 4.1认证,就必须通过越来越严格的差分功耗分析和简单功耗分析(DPA/SPA)攻击测试。供应商中只有Maxim提供带有成熟算法保护功能的加密库,允许同亨科技的产品通过极具挑战性的DPA/SPA认
[手机便携]
MaximDeepCover®<font color='red'>微控制器</font>协助同亨科技(XAC)通过PCI-PTS 4.1认证
基于双MCU架构的ABS/ASR/VDC故障诊断系统
集成了防抱死制动系统ABS(Anti-lock Braking System)、驱动防滑控制系统ASR(Acceleration Slip Regulation System)与车辆动力学控制系统VDC(Vehicle Dynamic Control System)的ABS/ASR/VDC集成系统是汽车主动安全性控制系统的核心装置之一。该系统可显著提高车辆的制动性、驱动性、转向可操纵性和横向稳定性,减少轮胎磨损和事故风险,增加行驶安全性和驾驶轻便性 。 为提高系统的可靠性,世界各大汽车整车厂或零部件厂商在推出的ABS/ASR/VDC产品中都配有故障诊断系统。该系统通过有关电气元件状态参数的在线测试,监控ABS/ASR/VDC系
[嵌入式]
基于RFID的预付费电能表的研制
引言   随着人均用电量的大幅度增加,推动了一户一表制的使用。传统的机械式电能表测量精度有限,会带来较大误差;当用电量很大时,误差将让人难以接受。本文介绍的电子式预付费电能表是通过电能测量集成电路对电压电流的取样信号进行处理,并输出与有功功率成正比的频率信号;微处理器通过对脉冲计数来计算所消耗的电量。用户将RFID卡片(预先在电力部门购买,卡片上充有定额的现金)靠近电能表,这时MCU通过射频芯片读取卡的金额,将其存储到 EEPROM,同时此卡清零。电能表将通过声音和LCD显示来提醒用户充值。 1 硬件电路总体设计   通过对AD7755的电能测量,与以低功耗著称的MSP430 MCU接口,再用DS1302作为时钟,将数据储
[测试测量]
XC166单片机的DSP程序优化方法
  XC166单片机的指令流水线存在着不可避免的阻塞现象,MAC单元指令也一样。尽管在硬件设计时已经采用了专用模块来减少阻塞,但有些阻塞是不可避免的,从程序优化的角度来说,可以充分利用指令流水线阻塞现象,通过重排指令流水线上的指令,消除阻塞,以使得程序的运行时间缩短,从而达到优化的目的。   通常DSP优化方法可以分为两类:一类是与芯片相关的,另一类是与芯片无关的。与芯片无关的优化方法独立于单片机硬件,适用于所有单片机及DSP处理器,下面根据使用XC166单片机的经验总结一些优化DSP程序的方法。   1 通用优化方法   1.1 数据组处理   数据组处理的基本思想是通过成组的处理数据,以节约每次调用处理子程序所需的附加
[单片机]
XC166<font color='red'>单片机</font>的DSP程序优化方法
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

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