精华内容
下载资源
问答
  • 基于单片机的智能计算器!!!!!!!!!!!!!!!
  • 单片机小实例
  • 基于单片机的智能计算器实验说明:实验接线: 1,LCD1602液晶模块-->单片机管脚 参考LCD1602液晶显示实验接线(开发攻略内在对应的实验章节内实验现象有接线说明) 2,矩阵按键模块-->单片机管脚 参考矩阵按键...
  • 新手教程,基于51单片机的计算机例程,亲测有效,51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为...
  • 单片机为核心的计算器模拟系统设计,输入采用矩阵键盘,可以进行加减乘除等十几种数字运算,同时支持括号的嵌套使用级浮点数的运算,并在上显示操作过程。
  • 基于单片机的建议计算器设计,大学本科单片机课程设计
  • 基于51单片机计算器程序,编程语言用的是C语言。要做好计算器,4KB的程序存储空间已经不够用了,所以这里没有用51单片机,这里用的是AT89S52,拥有8KB程序存储空间。 实现功能:  1、一定数值范围内的加减乘除、...
  • 这是一款基于89C51单片机的智能计算器程序,使用的语言是C语言
  • 基于51单片机计算器设计。单片机最小系统外接lcd1602,4*4矩阵键盘,开发平台keil uv2及更高版本
  • 计算器采用51单片机,结合矩阵键盘以及1602显示屏,实现简单计算器功能,本系统中,最大计算为千位,超过千位,1602计算结果显示E,可以修改程序中的源码,即可使计算范围变大
  • 内含设计程序 论文 调试步骤等 本计算器能即能实现基本的加减乘除,也能实现平方开放,求幂函数等高级运算!
  • 三、编程实现 1、主函数部分: #include #include "LCD1602.h" #include "MatrixKey.h" /*********************************************** 51单片机大作业 —— 基于AT89C51的简易计算器 作者:智能医学工程2002班...

    目录

    一、硬件简介

    1、LCD1602液晶显示器介绍

    (1)LCD1602的组成

    (2)各引脚功能介绍

    (3)DDRAM

     2、矩阵按键介绍

    (1)矩阵按键的优点:

     (2)原理:

     (3)检测方法:

    (4)矩阵按键实物图

     3、开发板原理图

     二、算法设计

     三、编程实现

    1、主函数部分:

    2、矩阵按键扫描函数


    一、硬件简介

            本次的设计利用了两个外设模块,一个是利用了4*4的矩阵按键,另一个则是利用了LCD1602显示屏进行显示。

    1、LCD1602液晶显示器介绍

    (1)LCD1602的组成

            1602 液晶也叫 1602 字符型液晶,它能显示 2 行字符信息,每行又能显示 16 个字符。它是一种专门用来显示字母、数字、符号的点阵型液晶模块。它是由若 干个 5x7 或者 5x10 的点阵字符位组成,每个点阵字符位都可以用显示一个字符, 每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作 用,正因为如此,所以它不能很好的显示图片。其实物图如下所示

    (2)各引脚功能介绍

             上图中可以看到有16个管脚孔,从左到右的编号顺序是1-16,其功能定义如下:

    (3)DDRAM

             在 LCD1602 内部含有 80 个字节的 DDRAM,它是用来寄存显示字符的。其地址 和屏幕的对应关系如下表:

     2、矩阵按键介绍

    (1)矩阵按键的优点:

            独立键盘与单片机连接时,每一个按键都需要单片机的一个 I/O 口,若某 单片机系统需较多按键,如果用独立按键便会占用过多的 I/O 口资源。单片机 系统中 I/O 口资源往往比较宝贵,当用到多个按键时为了减少 I/O 口引脚,所以就引 入了矩阵键盘。

     (2)原理:

    开发板上将16个按键排成 4 行 4 列,第一行将每个按键的一端连接在一起构成行线,第一列将每 个按键的另一端连接在一起构成列线,这样便一共有 4 行 4 列共 8 根线,我们将 这 8 根线连接到单片机的 8 个 I/O 口上,通过程序扫描键盘就可检测 16 个 键。用这种方法我们也可实现 3 行 3 列 9 个键、 5 行 5 列 25 个键、 6 行 6 列 36个键甚至更多。

     (3)检测方法:

            矩阵键盘两端都与单片机 I/O 口相连, 因此在检测时需编程通过单片机 I/O 口送出低电平。检测方法有多种,最常用的是行列扫描和线翻转法。
            行列扫描法检测时,先送一列为低电平,其余几列全为高电平(此时我们确 定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电 平(这时我们又确定了行数),则我们便可确认当前被按下的键是哪一行哪一列 的,用同样方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平, 这样即可检测完所有的按键,当有键被按下时便可判断出按下的键是哪一个键。 当然我们也可以将行线置低电平,扫描列是否有低电平。从而达到整个键盘的检 测。
            线翻转法,就是使所有行线为低电平时,检测所有列线是否有低电平,如果 有,就记录列线值;然后再翻转,使所有列线都为低电平,检测所有行线的值, 由于有按键按下,行线的值也会有变化,记录行线的值。从而就可以检测到全部 按键。 矩阵键盘也少不了按键消抖的环节,本章实验中采用的是行列扫描法来检测哪个按键按下。

    (4)矩阵按键实物图

     3、开发板原理图

     

    其中矩阵按键与LCD1602对应的模块分别为:

    在本次实验中矩阵键盘各位置代表的数值或符号:

                    | 1 | | 2 | | 3 | | 4 |
                    | 5 | | 6 | | 7 | | 8 |
                    | 9 | | 0 | | + | | - |
                    | * |  | / |  | = |

     二、算法设计

            本次设计采用遍历的思想,将输入的数据和符号分别存储在两个不同的数组,其中为了实现优先级计算,即先计算乘除法再计算加减法,所以本实验采用两次遍历思想:第一次遍历找出乘除符号和其对应的两个数存入两个不同的数组,并对它们进行优先计算,计算完成后,则进行第二次遍历,计算加减法,把数据和运算符存在两个不同的数组,按照从头到尾的顺序依次对它们相加减,最后数组的最后一个元素则为输出的结果。

    注:本计算器可以计算整数型加减乘除运算,
            并且符合加减乘除的优先率,但不能计算浮点型。

     三、编程实现

    1、主函数部分:

    #include <REGX51.H>
    #include "LCD1602.h"
    #include "MatrixKey.h"
    /***********************************************
       51单片机大作业 —— 基于AT89C51的简易计算器
    			作者:智能医学工程2002班 龙思成
    				| 1 | | 2 | | 3 | | 4 |
    				| 5 | | 6 | | 7 | | 8 |
    				| 9 | | 0 | | + | | - |
    				| * | | / | | = |
    				LCD屏显示:
    		******************************************
    		* INPUT:输入的数值    OP:输入的运算符   *
    		* OUTPUT:计算结果                       *
    		******************************************
    		注意:本计算器可以计算整数型加减乘除运算,
    		并且符合加减乘除的优先率,但不能计算浮点型。
    ***********************************************/
    
    int shuju[5];  //存放数据的数组
    char yunsuan[5];   //存放运算符的数组
    int keynum;  //返回矩阵键盘的简直
    int dat;
    int j=0;
    int i=0;
    int jj;
    int ii;
    int j3=0;
    int i3=0;
    int yshuju[5];    //存储*与/对应的数据
    char youxian[5];  //存储 *与/运算符的数组
    
    void result() //结果显示函数
    {
    	LCD_ShowString(1,16," ");
    	if(shuju[jj]<=9){LCD_ShowNum(2,8,shuju[jj],1);}
    	if(shuju[jj]>9&&shuju[jj]<=99){LCD_ShowNum(2,8,shuju[jj],2);}
    	if(shuju[jj]>99&&shuju[jj]<=999){LCD_ShowNum(2,8,shuju[jj],3);}
    }
    
    void showdata()  //显示输入的数据
    {
    	if(dat<=9){LCD_ShowNum(1,7,dat,1);}
    	if(dat>9&&dat<=99){LCD_ShowNum(1,7,dat,2);}
    	if(dat>99&&dat<=999){LCD_ShowNum(1,7,dat,3);}
    }
    
    void main()
    {
    	LCD_Init();
    	LCD_ShowString(1,1,"INPUT:");
    	LCD_ShowString(1,13,"OP:");
    	LCD_ShowString(2,1,"OUTPUT:");
    	while(1)
    	{
    		keynum=MatrixKey(); //返回矩阵键盘的键值
    		if(keynum)
    		{
    			if(keynum<=10)  //输入的数据处理,若超过两位则左移
    			{
    				dat*=10;
    				dat+=keynum%10;
    				showdata();
    			}
    			if(keynum>10)
    			{
    				shuju[j]=dat;
    				j++;
    				dat=0;
    				LCD_ShowString(1,7,"      ");
    				if(keynum==11){yunsuan[i]='+';LCD_ShowString(1,16,"+");i++;}  
    				if(keynum==12){yunsuan[i]='-';LCD_ShowString(1,16,"-");i++;}
    				if(keynum==13){yunsuan[i]='*';LCD_ShowString(1,16,"*");i++;}
    				if(keynum==14){yunsuan[i]='/';LCD_ShowString(1,16,"/");i++;}
    				if(keynum==15)
    				{
    					for(ii=0,jj=1;jj<j;jj++) //优先遍历,找出*与/对应的数组元素,并优先计算
    					{
    						if(yunsuan[ii]=='*'|yunsuan[ii]=='/')
    						{
    							youxian[i3]=yunsuan[ii];
    							yshuju[j3]=shuju[jj];
    							if(youxian[i3]=='*')
    							{
    								yshuju[j3]=shuju[jj]*shuju[jj-1];
    								shuju[jj]=yshuju[j3];
    								shuju[jj-1]=0;
    							}
    							if(youxian[i3]=='/')
    							{
    								yshuju[j3]=shuju[jj-1]/shuju[jj];
    								shuju[jj]=yshuju[j3];
    								shuju[jj-1]=0;
    							}
    							yunsuan[ii]='+';
    						}
    						ii++;
    					}
    					for(ii=0,jj=1;jj<j;jj++) //第二次遍历,计算+ -法
    					{
    						if(yunsuan[ii]=='+')
    						{
    							shuju[jj]=shuju[jj]+shuju[jj-1];
    							result();
    						}
    						if(yunsuan[ii]=='-')
    						{
    							shuju[jj]=shuju[jj-1]-shuju[jj];
    							result();
    						}
    						if(yunsuan[ii]=='*')
    						{
    							shuju[jj]=shuju[jj]*shuju[jj-1];
    							result();
    						}
    						if(yunsuan[ii]=='/')
    						{
    							shuju[jj]=shuju[jj-1]/shuju[jj];
    							result();
    						}
    						ii++;
    					}
    				}
    			}
    		}
    	}
    }
    

    2、矩阵按键扫描函数

    #include <REGX52.H>
    #include "delay.h"
    
    
    unsigned char MatrixKey()
    {
    	unsigned char KeyNumber=0;
    	
    	P1=0xFF;
    	P1_3=0;
    	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
    	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
    	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
    	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
    	
    	P1=0xFF;
    	P1_2=0;
    	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
    	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
    	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
    	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
    	
    	P1=0xFF;
    	P1_1=0;
    	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
    	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
    	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
    	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
    	
    	P1=0xFF;
    	P1_0=0;
    	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
    	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
    	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
    	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
    	
    	return KeyNumber;
    }
    

    展开全文
  • 基于51单片机的简易计算器设计文件,包含源码和原理图
  • 基于51单片机的智能计算器, 可实现加减乘除 ,计算时小数点后精确到4位。
  • 基于单片机(AT89C51)的进制转换及进制计算器.rar
  • 基于51单片机计算器Proteus仿真:资源包含原理图,源程序及文档。
  • 设计的是简单的计算器,可以进行四则运算(+、-、×、÷),C语言编程,PROTUES仿真,实验报告 单片机课程设计
  • 单片机编程,里面是智能计算器的代码,比较好用,用的是c51芯片
  • 一个基于51单片机做的课程设计 源代码 原理图PCB 附带开题报告 到手参考即做
  • 基于单片机四则运算计算器设计设计要求硬件设计 设计要求 使用keil c软件基于单片机系统设计一个“简单的计算器”。要求设计的模拟计算器必须从按钮输入0~9组成一个数,再从按钮输入加、减、乘和除运算符(+、-、*、...

    基于单片机四则运算计算器设计+proteus仿真

    设计要求

    使用keil c软件基于单片机系统设计一个“简单的计算器”。要求设计的模拟计算器必须从按钮输入0~9组成一个数,再从按钮输入加、减、乘和除运算符(+、-、*、/),同样从按钮上输入另一个数,之后按下等于按钮能够实现两个数之间的和、差、积和商的运算并且显示相关的操作步骤。

    硬件设计

    1、AT89C51单片机
    2、手动复位电路
    3、时钟电路
    4、LCD602液晶显示
    5、4*4按键矩阵

    在这里插入图片描述

    软件设计流程图

    在这里插入图片描述

    程序代码

    #include "reg52.h"
    #include "stdio.h"
    #include "key.h"
    #include "1602.h"
    #define uchar unsigned char
    #define uint unsigned int
    uchar Line1[20];  //第一行显示数组
    uchar Line2[20];  //第二行显示数组
    uint key_flag;     //按键标志
    int result1 = 0; //存储第一个整数
    int result2 = 0;
    int Oper = 0;  //存储运算符
    uint succeed_flag = 0;  //计算完成标志
    
    void display_line1(uint key)
    {
        static uint num = 0;
        uchar str = 0;
     
        if(succeed_flag == 1)
        {    
            sprintf((char *)Line1,"                 ");  //直接输入空格便会清除
            print_string(Line1,1);
            sprintf((char *)Line2,"                 ");
            print_string(Line2,2);
            succeed_flag = 0;
            num = 0;
        }    
        switch(key)
        {
            case 0 :  str = '1';  break;
            case 1 :  str = '2';  break;
            case 2 :  str = '3';  break;
            case 3 :  str = '+';  break;
            case 4 :  str = '4';  break;
            case 5 :  str = '5';  break;
            case 6 :  str = '6';  break;
            case 7 :  str = '-';  break;
            case 8 :  str = '7';  break;
            case 9 :  str = '8';  break;
            case 10 : str = '9';   break;
            case 11 : str = '*';   break;
            case 12 :              break;
            case 13 : str = '0';   break;
            case 14 : str = '=';   break;
            case 15 : str = '/';   break;
          default:break;
        }
        Line1[num] = str;
        print_string(Line1,1);
        num ++;
        if(num >= 20)
            num = 0;
    }
    
    void distinguish_num1(uint key)
    {
        static int num = 0;
     
        switch(key)
        {
            case 0 :  num = num * 10 + 1;  break;
            case 1 :  num = num * 10 + 2;  break;
            case 2 :  num = num * 10 + 3;  break;
            case 4 :  num = num * 10 + 4;  break;
            case 5 :  num = num * 10 + 5;  break;
            case 6 :  num = num * 10 + 6;  break;
            case 8 :  num = num * 10 + 7;  break;
            case 9 :  num = num * 10 + 8;  break;
            case 10 : num = num * 10 + 9;   break;
            case 13 : num = num * 10 + 0;   break;
          default:break;
        }    
     
        if(key == 3)
        {
            Oper = 1;
            result1 = num;
            num = 0;   //将num清零,避免影响之后的计算
        }
        else if(key == 7)
        {
            Oper = 2;
            result1 = num;
            num = 0;   //将num清零,避免影响之后的计算
        }
        else if(key == 11)
        {
            Oper = 3;
            result1 = num;
            num = 0;    //将num清零,避免影响之后的计算
        }
        else if(key == 15)
        {
            Oper = 4;
            result1 = num;
            num = 0;    //将num清零,避免影响之后的计算
        }
    }
    
    void distinguish_num2(uint key)
    {
        static int num = 0;
        switch(key)
        {
            case 0 :  num = num * 10 + 1;  break;
            case 1 :  num = num * 10 + 2;  break;
            case 2 :  num = num * 10 + 3;  break;
            case 4 :  num = num * 10 + 4;  break;
            case 5 :  num = num * 10 + 5;  break;
            case 6 :  num = num * 10 + 6;  break;
            case 8 :  num = num * 10 + 7;  break;
            case 9 :  num = num * 10 + 8;  break;
            case 10 : num = num * 10 + 9;   break;
            case 13 : num = num * 10 + 0;   break;
          default:break;
        }    
        if(key == 14)
        {
            result2 = num;
            if(Oper == 1)  
            {
                result2 = result1 + result2;            
            }
            else if(Oper == 2)  
            {
                result2 = result1 - result2;
            }
            else if(Oper == 3)  
            {
                result2 = result1 * result2;
            }
            else if(Oper == 4)  
            {
                result2 = result1 / result2;
            }        
            sprintf((char *)Line2,"%d   ",result2);
            print_string(Line2,2);
            result1 = 0;
            result2 = 0;
            Oper = 0;
            num = 0;
            succeed_flag = 1;
        }
    }
    void main()
    {  
         lcd_init();   //lcd初始化
       while(1)
       {
           key_flag = key_scan();   //按键检测     没有按键被按下时 返回值为16
            if(key_flag != 16)    //有按键被按下
            {
                    display_line1(key_flag);
                  if(Oper == 0)
                    {
                        distinguish_num1(key_flag);
                    }
                    else
                    {
                        distinguish_num2(key_flag);                    
                    }
            }
       }
    }
    

    程序设计图:在这里插入图片描述
    如需源文件请私信我

    展开全文
  • 包含已经写好的程序,电路原理图,设计实验成功后的结果图,标准的课程设计文档,和设计要求。满足很多功能,除了基础的加减乘除,还有平方。。。。等等。仅用于学术交流。
  • 基于单片机的计算机万年历很好的有仿真实例。。。。。。。
  • 1、数字可处理10e-38~10e38 2、7位有效数字 3、精确到小数后六位 4、操作出错提醒
  • 基于c51单片机简单的计算器程序,简易计算器设计两位数加减运算 可实现三位数的加减乘除混合运算!将运算结果显示在数码管上!
  • 利用51单片机设计一个简单的计算器,能够实现简单的运算
  • 基于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;产品说明书。
    资源链接:

    展开全文
  • 用51单片机实现整数的加减乘除,通过矩阵按键实现数据的输入和处理,通过8个数码管实现数据及结果的显示。
  • 基于51单片机实现的计算器,有对应的keil5程序、Altium designer原理图、PCB图。并且含有对应的综合课程设计报告。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,512
精华内容 604
关键字:

基于单片机的计算器