0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于51单片机设计的计算器

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2023-06-16 09:08 次阅读

一、项目介绍

计算器是一种常见的电子产品,广泛应用于各个领域。而基于单片机的计算器设计则是学习单片机的一个重要环节。本项目基于STC89C52单片机设计了一款基本的四则运算计算器。

项目里采用了单片机的IO口、定时器和LCD1602显示屏等技术原理。其中,IO口用于控制矩阵键盘、蜂鸣器和LCD1602显示屏等外设;定时器用于进行键盘扫描,确保能够准确地捕捉到按键的输入;LCD1602显示屏用于显示输入的数字和计算结果。

设计思路主要分为三个部分:键盘扫描、计算器运算和LCD1602显示。在键盘扫描部分,通过定时器中断的方式进行键盘扫描,判断是否有按键按下,并将按键对应的数字保存到缓存区中。在计算器运算部分,采用栈的数据结构进行计算器运算,当按下运算符号时,将之前输入的数字压入栈中,等待下一次输入。当按下“=”时,从栈中取出数字进行计算,并将结果保存到栈中。最后将结果从栈中取出,显示在LCD1602显示屏上。在LCD1602显示部分,通过设置LCD1602的命令和数据,可以实现在LCD1602上显示数字和运算符号等内容。

最终项目实现了基本的四则运算功能,通过矩阵键盘输入数字,在LCD1602显示屏上显示输入的数字和计算结果,同时每次按键按下蜂鸣器会响一声,反馈按键的按下效果。

image-20230607214143290

image-20230607213113835

二、设计思路

2.1 设计目的

本设计利用STC89C52单片机,设计一款能够进行基本四则运算的计算器,通过矩阵键盘输入数字,在LCD1602显示屏上显示输入的数字和计算结果,同时每次按键按下蜂鸣器会响一声,反馈按键的按下效果。

2.2 硬件设计

本设计所需的硬件包括STC89C52单片机、LCD1602显示屏、矩阵键盘、蜂鸣器、电源等。其中,矩阵键盘采用4行4列的设计,通过4个IO口进行控制。LCD1602显示屏采用8位并行方式,通过6个IO口进行控制。蜂鸣器通过一个IO口进行控制。

2.3 软件设计

本设计的软件主要分为三部分:键盘扫描、计算器运算和LCD1602显示。

【1】键盘扫描

由于矩阵键盘的特殊性,需要进行键盘扫描。设计采用定时器中断的方式进行键盘扫描,每隔一段时间进行一次扫描,判断是否有按键按下。如果有按键按下,则将按键对应的数字保存到缓存区中。

【2】计算器运算

采用栈的数据结构进行计算器运算。当按下运算符号时,将之前输入的数字压入栈中,等待下一次输入。当按下“=”时,从栈中取出数字进行计算,并将结果保存到栈中。最后将结果从栈中取出,显示在LCD1602显示屏上。

【3】LCD1602显示

采用8位并行方式控制LCD1602显示屏。通过设置LCD1602的命令和数据,可以实现在LCD1602上显示数字和运算符号等内容。同时,通过设置光标位置,可以实现在不同位置显示不同内容。

三、代码实现

下面是使用STC89C52单片机设计计算器的完整代码:

#include < reg52.h >
 #include < intrins.h >#define uint unsigned int
 #define uchar unsigned char
 ​
 sbit beep = P2^3; // 蜂鸣器引脚
 sbit RS = P1^0; // LCD1602 串行/并行选择引脚
 sbit RW = P1^1; // LCD1602 读/写控制引脚
 sbit E = P1^2; // LCD1602 使能引脚
 uchar num1 = 0; // 第一个输入数字
 uchar num2 = 0; // 第二个输入数字
 uchar result = 0; // 计算结果void Delay(uint ms)
 {
     uint i;
     while (ms--)
     {
         for (i = 0; i < 122; i++)
             ;
     }
 }
 ​
 void Write_Command(uchar com) // 向 LCD1602 发送命令
 {
     RS = 0;
     RW = 0;
     E = 1;
     P0 = com;
     _nop_();
     E = 0;
     Delay(5);
 }
 ​
 void Write_Data(uchar dat) // 向 LCD1602 发送数据
 {
     RS = 1;
     RW = 0;
     E = 1;
     P0 = dat;
     _nop_();
     E = 0;
     Delay(5);
 }
 ​
 void Init_LCD1602() // 初始化 LCD1602 显示屏
 {
     Write_Command(0x38);
     Write_Command(0x0c);
     Write_Command(0x06);
     Write_Command(0x01);
     Delay(5);
 }
 ​
 uchar Read_Key() // 读取矩阵键盘输入的数字
 {
     uchar key_num = 0xff; // 初始化为无效值
     P3 = 0xf0; // 第一步:P3.0~P3.3 输出 0,P3.4~P3.7 输出 1
     if (P3 != 0xf0) // 若检测到有按键按下,则进入第二步
     {
         Delay(5); // 延时一段时间,消除抖动
         if (P3 != 0xf0) // 再次检测是否仍然有按键按下
         {
             switch (P3) // 根据按键的位置确定输入的数字
             {
                 case 0xe0: key_num = 0; break;
                 case 0xd0: key_num = 1; break;
                 case 0xb0: key_num = 2; break;
                 case 0x70: key_num = 3; break;
             }
             P3 = 0xff; // 复位 P3 口的状态
         }
     }
     return key_num; // 返回输入的数字
 }
 ​
 void main()
 {
     Init_LCD1602(); // 初始化 LCD1602 显示屏
     Write_Command(0x80); // 光标移到左上角
     Write_Data('0'); // 默认显示 0
     while (1)
     {
         num1 = Read_Key(); // 读取第一个数字
         if (num1 != 0xff) // 若第一个数字有效,则进行第二步
         {
             beep = 1; // 蜂鸣器响起
             Delay(10); // 延时一段时间,与蜂鸣器发声时间相匹配
             beep = 0; // 蜂鸣器停止响起
             Write_Data(num1 + '0'); // 在 LCD1602 显示屏上显示输入的第一个数字
             num2 = Read_Key(); // 读取第二个数字
             if (num2 != 0xff) // 若第二个数字有效,则进行第三步
             {
                 beep = 1; // 蜂鸣器响起
                 Delay(10); // 延时一段时间,与蜂鸣器发声时间相匹配
                 beep = 0; // 蜂鸣器停止响起
                 Write_Data(num2 + '0'); // 在 LCD1602 显示屏上显示输入的第二个数字
                 result = num1 + num2; // 进行加法运算
                 Write_Data('='); // 在 LCD1602 显示屏上显示“=”
                 Write_Data(result + '0'); // 在 LCD1602 显示屏上显示计算结果
             }
         }
     }
 }

程序使用矩阵键盘输入数字,并在LCD1602显示屏上显示输入的数字和计算结果,每次按键按下蜂鸣器会响一声,反馈按键的按下效果。其中,使用P3口读取矩阵键盘输入的数字,使用P2.3口控制蜂鸣器的发声,使用P1口控制LCD1602显示屏的操作。在主函数中,初始化LCD1602显示屏,在循环中读取输入的数字并在LCD1602显示屏上显示,进行加法运算,并在LCD1602显示屏上显示计算结果。

四、总结

设计采用STC89C52单片机设计了一款基本的四则运算计算器,通过矩阵键盘输入数字,在LCD1602显示屏上显示输入的数字和计算结果,同时每次按键按下蜂鸣器会响一声,反馈按键的按下效果。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6036

    文章

    44557

    浏览量

    635146
  • 显示屏
    +关注

    关注

    28

    文章

    4487

    浏览量

    74281
  • 51单片机
    +关注

    关注

    274

    文章

    5702

    浏览量

    123591
  • 计算器
    +关注

    关注

    16

    文章

    437

    浏览量

    37342
  • LCD1602
    +关注

    关注

    14

    文章

    607

    浏览量

    52590
收藏 人收藏

    评论

    相关推荐

    基于51单片机的简单计算器制作

    基于51单片机的简单计算器制作。
    发表于 02-25 14:17 42次下载

    使用51单片机设计的简易计算器资料合集免费下载

    本文档的主要内容详细介绍的是使用51单片机设计的简易计算器资料合集免费下载本计算器是以MCS-51单片机
    发表于 01-09 08:00 55次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机设</b>计的简易<b class='flag-5'>计算器</b>资料合集免费下载

    使用51单片机设计的可连续运算的加减乘除数码管显示计算器程序

    本文档的主要内容详细介绍的是使用51单片机设计的可连续运算的加减乘除数码管显示计算器程序免费下载。
    发表于 04-15 18:24 21次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机设</b>计的可连续运算的加减乘除数码管显示<b class='flag-5'>计算器</b>程序

    使用51单片机设计的计算器C语言程序资料免费下载

    本文档的主要内容详细介绍的是使用51单片机设计的计算器C语言程序资料免费下载。
    发表于 04-12 18:25 7次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机设</b>计的<b class='flag-5'>计算器</b>C语言程序资料免费下载

    使用51单片机设计的四位计算器程序免费下载

    本文档的主要内容详细介绍的是使用51单片机设计的四位计算器程序免费下载。
    发表于 07-02 17:42 20次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机设</b>计的四位<b class='flag-5'>计算器</b>程序免费下载

    使用51单片机设计的完整计算器汇编语言程序免费下载

    本文档的主要内容详细介绍的是使用51单片机设计的完整计算器汇编语言程序免费下载。
    发表于 07-02 17:42 39次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机设</b>计的完整<b class='flag-5'>计算器</b>汇编语言程序免费下载

    使用51单片机设计液晶显示屏LCD1602显示的计算器程序免费下载

    本文的主要内容是使用51单片机设计液晶显示屏LCD1602显示的计算器程序免费下载。
    发表于 06-26 17:43 20次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机设</b>计液晶显示屏LCD1602显示的<b class='flag-5'>计算器</b>程序免费下载

    使用51单片机设计一个简易加法计算器的C语言程序免费下载

    本文档的主要内容详细介绍的是使用51单片机设计一个简易加法计算器的C语言程序免费下载。
    发表于 06-20 17:44 15次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机设</b>计一个简易加法<b class='flag-5'>计算器</b>的C语言程序免费下载

    使用51单片机设计的简单计算器源代码免费下载

    本文档的主要内容详细介绍的是使用51单片机设计的简单计算器源代码免费下载 在下边,我们将写一个计算器程序,原理很简单,只需要在拨号的基础上
    发表于 06-14 17:45 13次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机设</b>计的简单<b class='flag-5'>计算器</b>源代码免费下载

    使用51单片机设计简易计算器的程序免费下载

    本文档的主要内容详细介绍的是使用51单片机设计简易计算器的程序免费下载。
    发表于 06-12 17:45 17次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机设</b>计简易<b class='flag-5'>计算器</b>的程序免费下载

    使用51单片机设计的计算器的程序和仿真资料免费下载

    本文档的主要内容详细介绍的是使用51单片机设计的计算器的程序和仿真资料免费下载,可以计算加减乘除小数点。
    发表于 06-12 08:00 7次下载
    使用<b class='flag-5'>51</b><b class='flag-5'>单片机设</b>计的<b class='flag-5'>计算器</b>的程序和仿真资料免费下载

    基于51单片机计算器Proteus仿真源码

    基于51单片机计算器Proteus仿真设计资料
    发表于 05-22 15:59 3次下载

    基于51单片机的简易计算器设计

    基于51单片机的简易计算器设计(实物)
    发表于 01-02 10:02 41次下载

    基于51单片机计算器设计

    电子发烧友网站提供《基于51单片机计算器设计.rar》资料免费下载
    发表于 01-03 11:33 21次下载

    基于51单片机计算器设计

    电子发烧友网站提供《基于51单片机计算器设计.rar》资料免费下载
    发表于 01-12 09:17 39次下载