精华内容
下载资源
问答
  • 基于51单片机计算器程序,编程语言用的是C语言。要做好计算器,4KB的程序存储空间已经不够用了,所以这里没有用51单片机,这里用的是AT89S52,拥有8KB程序存储空间。 实现功能:  1、一定数值范围内的加减乘除、...
  • 单片机为核心的计算器模拟系统设计,输入采用矩阵键盘,可以进行加减乘除等十几种数字运算,同时支持括号的嵌套使用级浮点数的运算,并在上显示操作过程。
  • 新手教程,基于51单片机的计算机例程,亲测有效,51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为...
  • 基于51单片机计算器分享.rar
  • 基于51单片机计算器设计。单片机最小系统外接lcd1602,4*4矩阵键盘,开发平台keil uv2及更高版本
  • 51单片机上实现的完整功能的计算器源代码 单片机 , 计算器 , 源代码
  • 本程序实现了完整版计算器,包括加减乘除、带小数点显示、带小数点输入、此外还有带时钟功能。当然也可以实现函数功能,只是东西太多了,放不开了。。就没有加上。以后在上传吧.带仿真文件的,一定要用Proteus7.8...
  • 基于51单片机的简易计算器设计文件,包含源码和原理图
  • 基于单片机的智能计算器!!!!!!!!!!!!!!!
  • 基于51单片机实现的计算器,有对应的keil5程序、Altium designer原理图、PCB图。并且含有对应的综合课程设计报告。
  • 包含全套资料原理图、仿真、源程序及论文等
  • 利用51单片机设计一个简单的计算器,能够实现简单的运算
  • 视频演示地址: https://www.bilibili.com/video/BV1WD4y197kW/ 本设计实现了简易加减乘除

    视频演示地址:
    https://www.bilibili.com/video/BV1WD4y197kW/
    本设计实现了简易加减乘除

    展开全文
  • 本设计是以51单片机为核心的计算器模拟系统设计,输入采用4×4矩阵键盘,可以进行加、减、乘、除4位带符号数字运算,并在LCD1602上显示操作过程。。 主要由51单片机+最小系统+LCD1602液晶显示模块+4*4矩阵按键电路;...

    一.硬件方案

    本设计是以51单片机为核心的计算器模拟系统设计,输入采用4×4矩阵键盘,可以进行加、减、乘、除4位带符号数字运算,并在LCD1602上显示操作过程。。
    主要由51单片机+最小系统+LCD1602液晶显示模块+4*4矩阵按键电路;如图:
    在这里插入图片描述

    二.设计功能

    (1)本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用)单片机。
    (2)矩阵按键输入、LCD1602液晶显示,构成一套可以运算两个数之间的加减乘除的设计。
    (3)最大运算是:9999*9999,可以运算负数;

    三.设计原理图

    (1)原理图主要采用AD软件进行设计,如图:
    在这里插入图片描述

    (2)Protues仿真图如下:
    在这里插入图片描述

    四.软件设计

    (1)程序流程图
    在这里插入图片描述

    (2)主程序源码

    void main()
    {
    	uchar   key=0xff;               //键值初始化
    	uchar   n=0;		 			//第1个数可以按1-4次
    	uchar   m=5; 					//第2个数可以按1-4次
    	uchar   x=0; 
    	data_a=0;                       //前一个数
    	data_b=0;                       //后一个数
    	data_c=0;                       //结果 
    	init_lcd();  					//1602液晶初始化
    	display_a();
        while(1)
    	  {
    	  	key=keycheckdown();			/*动态扫描键盘,返回按键对应值,赋给j        key=0到f */
    		if(0xff!=key)				/*若返回值有效,进入内部处理程序*/
    		{ 
    		  if(key<10)
    		  {
    	        if(n<4){data_a=data_a*10+key;m=5;display_a();}n++;  //首先输入第一个数
    		    if(m<4){data_b=data_b*10+key;n=5;display_b();}m++;  //必须按了+-*/才能输入第二个数		
    		  }
              else
              {	switch(key)		/*功能键选择*/
    					{
    						case 0xa:n=5;m=0;x=1;W_lcd(5,0,'+');break; //加  /* + S=1 */ /* 数值转换函数 */									
    						case 0xb:n=5;m=0;x=2;W_lcd(5,0,'-');break;		  /* - S=2 *///减
    						case 0xc:n=5;m=0;x=3;W_lcd(5,0,'*');break;		  /* * S=3 *///乘
    						case 0xd:n=5;m=0;x=4;W_lcd(5,0,'/');break;		  /* / S=4 *///除
    						case 0xe:n=5;m=5;eql(x);W_lcd(12,0,'=');display_c(x);break; 	  /* = */
    						case 0xf:n=0;x=0;m=5; data_a=0;data_b=0;data_c=0;LCD_Write_String(0,0,table);LCD_Write_String(0,1,table);W_lcd(0,0,'0');break; /*     C*/
    					}	  		  
    		  }
    			do{P1=0xf0;}while(P1!=0xf0);		/*等待按键松开*/
    	  	}//(0xff!=key)	  
    	  }//while
    }//main
    

    如需资料请关注公众号“单片机实例设计”,首页回复“计算器”获取资料;
    在这里插入图片描述

    展开全文
  • 使用6位数码管显示,可以实现加减乘除,当计算结果超过所能显示的位数时,显示错误。
  • 基于51单片机计算器

    万次阅读 2020-04-04 16:34:15
    继续写一下寒假做的51小项目,这一次是基于AT89C51计算器,带一个八位密码锁功能。 具体实现了计算器的加减乘除功能,并且自带八位密码锁,输入密码后按“=”确定,错误输入三次密码就会锁定,重启后解除锁定,...

    继续写一下寒假做的51小项目,这一次是基于AT89C51的计算器,带一个八位密码锁功能。
    具体实现了计算器的加减乘除功能,并且自带八位密码锁,输入密码后按“=”确定,错误输入三次密码就会锁定,重启后解除锁定,密码可以在密码表中设定。显示部分采用了1602显示屏。

    原理图

    这一次在使用AD画PCB时,考虑到计算器要脱离电源使用,所以加上了5V电子电池供电电路,让产品更有实用性。
    PCB
    部分代码,受篇幅限制把剩下的东西打包在了文后链接(proteus+ad+keil)

    main()
    {
     uchar i,num,sign,s;
     uchar temp[16];
     bit firstflag;
     float a=0,b=0;
     Lcd_Init();
     DelayMs(10);
     LcdWrite_cmd(0x01);
     LcdWrite_string(5,0,"WELCOM !");
     LcdWrite_string(3,1,"BY toyjis_YAO");
     for(s=0;s<25;s++)
     DelayMs(200);
     LcdWrite_cmd(0x01);
     mima();
     DelayMs(200);
     LcdWrite_string(0,1,"                ");//清除该行
      LcdWrite_string(0,1,"Right Open!>>>>");//密码正确显示的信息
     for(s=0;s<25;s++)
     DelayMs(200);
     LcdWrite_cmd(0x01);
     while(1)
     {
     num=KeyPro();
     if(num!=0xff)
     {
      if(i==0)
      LcdWrite_cmd(0x01);
    

    资源包含:proteus仿真+原理图;keil编写的C语言程序;ad原理图+PCB;产品说明书。
    资源链接:
    加我QQ:2430687381
    资源有偿,谢绝白嫖

    展开全文
  • 题目要求: 1、根据开发板设计10以内的加法.../*根据题目要求,设计计算器51单片机矩阵按键的S4,S8,S12,S16分别代表着+,-,*,/;而S13键表示为清零;S1,S2,S3代表着1,2,3;S5,S6,S7代表着4,5,6;S9,S10,S1

    题目要求:

    1、根据开发板设计10以内的加法计算器,用LED数码管显示数字和计算结果。(必做)。

    2、根据开发板设计100以内的计算器,用LED数码管显示数字和计算结果,要求可实现加法、减法、乘法和除法的整型运算(选作)。

    备注:做了第2题可不做第1题

    选做第2题.功能实现如附件视频所示。

    /*根据题目要求,设计计算器,51单片机矩阵按键的S4,S8,S12,S16分别代表着+,-,*,/;而S13键表示为清零;S1,S2,S3代表着1,2,3;S5,S6,S7代表着4,5,6;S9,S10,S11代表着7,8,9。如下排列所示:

     

    1    2    3    +

    4  5    6    -

    7    8    9    *

    清零 0    =    /

    */

    #include<reg51.h>
    typedef unsigned char u8;         //对数据类型进行声明定义
    typedef unsigned int u16;
    
    sbit LSA=P2^2;  //74HC138译码器数码管位选
    sbit LSB=P2^3;
    sbit LSC=P2^4;
    
    #define GPIO_KEY P1
    #define GPIO_DIG P0
    
    u16 KeyValue;        //用来存放读取到的键值
    u16 keyflag,i;       //用来判断按下的数字还是运算符或清空键
    u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};  //显示0~F、负号‘-’
    
    u16 wei[8]={0};    //用来存放每一位数码管数字的数组
    
    void delay(u16 i)//延时函数
    {  
         while(i--);
    }
    
    void display()    //扫描显示动态数码管
    {    
         LSA=0; LSB=0; LSC=0; GPIO_DIG=smgduan[wei[7]];delay(50); GPIO_DIG=0x00; //消隐
         LSA=1; LSB=0; LSC=0; GPIO_DIG=smgduan[wei[6]];delay(50); GPIO_DIG=0x00;
         LSA=0; LSB=1; LSC=0; GPIO_DIG=smgduan[wei[5]];delay(50); GPIO_DIG=0x00; 
         LSA=1; LSB=1; LSC=0; GPIO_DIG=smgduan[wei[4]];delay(50); GPIO_DIG=0x00; 
    }
    /*
    1    2    3    +
    4	 5    6	   -
    7    8    9    *
    清零 0    =    /
    */
    
    void KeyDown(void)//检测有按键按下并读取键值
    {
        u16 a=0;
        GPIO_KEY=0x0f;
        if(GPIO_KEY!=0x0f)//读取按键是否按下
        {
            delay(1000);//延时10ms进行消抖
            if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
            {   
                //测试列
                GPIO_KEY=0x0f;
                switch(GPIO_KEY)//行列扫描法
                {
                    case(0X07): KeyValue=1;break;
                    case(0X0b): KeyValue=2;break;
                    case(0X0d): KeyValue=3;break;
                    case(0X0e): KeyValue=13;break;
                }
                //测试行
                GPIO_KEY=0xf0;
                switch(GPIO_KEY)
                {
                    case(0X70): KeyValue=KeyValue;break;
                    case(0Xb0): KeyValue=KeyValue+3;break;
                    case(0Xd0): KeyValue=KeyValue+6;break;
                    case(0Xe0): KeyValue=KeyValue+9;break;
                }
    			if(KeyValue==11)
    			{
    				KeyValue=0;
    			}
                if(KeyValue==0 || KeyValue==1 || KeyValue==2 || KeyValue==3 || KeyValue==4 || KeyValue==5 || KeyValue==6 || KeyValue==7 || KeyValue==8 || KeyValue==9)
       {
           keyflag=1;
       }
                while((a<50)&&(GPIO_KEY!=0xf0))  //检测按键松手检测
                {
                    delay(1000);
                    a++;
                }
            }
        }
    }
    void main()
    {  
       u16 a=0,b=0,c=0;
    
       while(1)
       {    
             display();                     /* 第一个数字输入*/
             KeyDown();               
             if(keyflag==1)  
             {                                 
                //输入一位,数字向左移动一位     
    			for(i = 4; i <7;i++)
    			{wei[i]=wei[i+1];}  
    			wei[7] = KeyValue;                      
                keyflag=0;                                  
             }
    
             else if(KeyValue==10)
             {
                  for(i=0;i<8;i++)
                      wei[i]=0;              //对数码管清零
        
                   display(); 
            }
    
            else if(KeyValue==13)//加法运算      
             {
                 a=wei[0]*10000000+wei[1]*1000000+wei[2]*100000+wei[3]*10000+wei[4]*1000+wei[5]*100+wei[6]*10+wei[7];   //计算a的值
                 for(i=0;i<8;i++)
                 wei[i]=0;
                 while(1)                               //输入第二个数
                 {
                         display();
                         KeyDown();
                         if(KeyValue==12) break;//当读到等于号,既,KeyValue=12时,停止输入
                         if(keyflag==1)
                         {  
                            for(i = 4; i <7;i++)
    						{wei[i]=wei[i+1];}  
    						wei[7] = KeyValue;                      
              				keyflag=0;
                         }
                  }
                  b=wei[0]*1000000+wei[1]*1000000+wei[2]*100000+wei[3]*10000+wei[4]*1000+wei[5]*100+wei[6]*10+wei[7];   //计算b的值
                 c=a+b;
                 wei[0]=c/10000000%10;               //计算C的各个位的数字
                 wei[1]=c/1000000%10;
                 wei[2]=c/100000%10;
                 wei[3]=c/10000%10;
                 wei[4]=c/1000%10;
                 wei[5]=c/100%10;
                 wei[6]=c/10%10;
                 wei[7]=c%10;
     
                 display();
            }
     
            else if(KeyValue==16)//减法运算      
             {
                 a=wei[0]*10000000+wei[1]*1000000+wei[2]*100000+wei[3]*10000+wei[4]*1000+wei[5]*100+wei[6]*10+wei[7];   //计算a的值
                 for(i=0;i<8;i++)
                 wei[i]=0;
                 while(1)                                //输入第二个数
                 {
                         display();
                         KeyDown();
                         if(KeyValue==12) break;//当读到等于号,既,KeyValue=12时,停止输入
                         if(keyflag==1)
                         {  
                            for(i = 4; i <7;i++)
    						{wei[i]=wei[i+1];}  
    						wei[7] = KeyValue;                      
              				keyflag=0;
                         }
                  }
                  b=wei[0]*1000000+wei[1]*1000000+wei[2]*100000+wei[3]*10000+wei[4]*1000+wei[5]*100+wei[6]*10+wei[7];   //计算b的值
                 c=a-b;
                 wei[0]=c/10000000%10;               //计算C的各个位的数字
                 wei[1]=c/1000000%10;
                 wei[2]=c/100000%10;
                 wei[3]=c/10000%10;
                 wei[4]=c/1000%10;
                 wei[5]=c/100%10;
                 wei[6]=c/10%10;
                 wei[7]=c%10;
     
                 display();
            }
              
    
            else if(KeyValue==19)//乘法运算      
             {
                 a=wei[0]*10000000+wei[1]*1000000+wei[2]*100000+wei[3]*10000+wei[4]*1000+wei[5]*100+wei[6]*10+wei[7];   //计算a的值
                 for(i=0;i<8;i++)
                 wei[i]=0;
                 while(1)                                //输入第二个数
                 {
                         display();
                         KeyDown();
                         if(KeyValue==12) break;//当读到等于号,既,KeyValue=12时,停止输入
                         if(keyflag==1)
                         {  
                            for(i = 4; i <7;i++)
    						{wei[i]=wei[i+1];}  
    						wei[7] = KeyValue;                      
              				keyflag=0;
                         }
                  }
                  b=wei[0]*1000000+wei[1]*1000000+wei[2]*100000+wei[3]*10000+wei[4]*1000+wei[5]*100+wei[6]*10+wei[7];   //计算b的值
                 c=a*b;
                 wei[0]=c/10000000%10;               //计算C的各个位的数字
                 wei[1]=c/1000000%10;
                 wei[2]=c/100000%10;
                 wei[3]=c/10000%10;
                 wei[4]=c/1000%10;
                 wei[5]=c/100%10;
                 wei[6]=c/10%10;
                 wei[7]=c%10;
     
                 display();
            }
    
            else if(KeyValue==21)//除法运算      
             {
                 a=wei[0]*10000000+wei[1]*1000000+wei[2]*100000+wei[3]*10000+wei[4]*1000+wei[5]*100+wei[6]*10+wei[7];   //计算a的值
                 for(i=0;i<8;i++)
                 wei[i]=0;
                 while(1)                                //输入第二个数
                 {
                         display();
                         KeyDown();
                         if(KeyValue==12) break;//当读到等于号,既,KeyValue=12时,停止输入
                         if(keyflag==1)
                         {  
                            for(i = 4; i <7;i++)
    						{wei[i]=wei[i+1];}  
    						wei[7] = KeyValue;                      
              				keyflag=0;
                         }
                  }
                  b=wei[0]*1000000+wei[1]*1000000+wei[2]*100000+wei[3]*10000+wei[4]*1000+wei[5]*100+wei[6]*10+wei[7];   //计算b的值
                 c=a/b;
                 wei[0]=c/10000000%10;               //计算C的各个位的数字
                 wei[1]=c/1000000%10;
                 wei[2]=c/100000%10;
                 wei[3]=c/10000%10;
                 wei[4]=c/1000%10;
                 wei[5]=c/100%10;
                 wei[6]=c/10%10;
                 wei[7]=c%10;
     
                 display();
            }
                         
       }
    }

     

    展开全文
  • 具有记忆功能的简易计算器,支持加减乘除和括号运算,且可判断算式的正确性。
  • 基于51单片机的科学计算器,可实现加减乘除·,带括号运算,开根号,三角函数,对数函数,乘方。
  • LCD计算器设计 1.能实现加减乘除、幂次方、取根号等操作 2.数据结果能实现小数 3.使用LCD1602显示 4.个人代码还有bug 代码实现 #include"reg52.h" #include"math.h" /*********************************************...
  • 1、数字可处理10e-38~10e38 2、7位有效数字 3、精确到小数后六位 4、操作出错提醒
  • 基于51单片机的简单计算器

    万次阅读 多人点赞 2018-06-06 19:58:31
    在上一篇中,我们已经说过了基于51单片机的简单拨号器,在下边,我们将写一个计算器程序,原理很简单,只需要在拨号器的基础上,算出拨号器所表示的数字,并进行计算即可。 代码如下; #include"reg51.h&...
  • 基于51单片机计算器Proteus仿真:资源包含原理图,源程序及文档。
  • 基于51单片机计算器可完成基础计算 可以通过proteus仿真查看
  • 之前讲的计算器都是基于C语言的,接下来讲一下基于汇编语言的简易计算器。 硬件设计 (末尾附文件) 显示器仍然是数码管,MCU是C51,支持整数部分的计算 仿真图: 程序设计 YJ EQU 50H ;结果存放 YJ1 EQU 51H ;中间...
  • 设计了一个以宏晶STC89C52RC为核心的8位整数运算的计算器。首先提出了设计要求,然后进行方案论证、器件选型及硬件原理图的设计,最后给出了8位整数的加、减、乘、除运算程序。
  • 一个基于51单片机做的课程设计 源代码 原理图PCB 附带开题报告 到手参考即做

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 632
精华内容 252
关键字:

基于51单片机的计算器