【51单片机】简单四则运算


使用51单片机实现简单的四则运算(只包含+ - * / 和 =)


实验设备 : 普中科技 单片机开发试验仪

开发软件 : Keil uVision3

烧录软件 : PZ-ISP V1.48

设计思路

由于51单片机数据存储空间有限,所以不能开辟过多的数据空间,C语言处理四则运算的代码无法直接通过改写,编译烧录。故此次实验采用状态转换的方式实现计算器的简单四则运算。使用数据空间3个:a, b, c。即可实现。下图为状态转换图。
AT89C51简单四则运算状态图
在程序实现过程中,如果遇到’=’则需要显示结果到显示屏,这部分说明请看代码相应位置。对于错误输入在各自状态有相应处理过程,如不存储该错误输入等。此外,在程序实现过程中添加 状态11:用于清屏重置;状态12:ERROR状态。下面介绍接线及运行结果。

接线

Jp8连JP4 Jp9连Jp5 把1602液晶插入
接线

按键说明

按键说明

输入

输入

计算结果

计算结果

程序代码

/**************************************************************************************
*                     简易四则运算计算器                                           *
*                                                                                     *
*       仪器:普中科技 单片机开发实验仪                                                  *
*       连接方法:Jp8连JP4  Jp9连Jp5 把1602液晶插入                                   *
*                                                                                     *
***************************************************************************************/

#include <reg51.h>     //此文件中定义了51的一些特殊功能寄存器

#define uchar unsigned char
#define uint unsigned int

#define MAXLEN 16

sbit EN=P2^7;  //LCD的使能引脚
sbit RS=P2^6;  //LCD数据命令选择端
sbit RW=P2^5;  //LCD的读写选择端

sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
sbit K4=P3^3;
sbit K8=P3^7;   // 清屏,重置变量

bit flag = 0;   // + 或 - 标识符; 0:+;1:-;

uchar KEY_CODE[]={ 0xed,0xdd,0xbd,0x7d,//3X4矩阵键盘键值表
                   0xeb,0xdb,0xbb,0x7b,
                   0xe7,0xd7,0xb7,0x77};
//定义字符键值表
uchar CHAR_TABLE[]={
  0x30,0x31,0x32,0x33,//这四个会在液晶显示器中显示0 1 2 3
                    0x34,0x35,0x36,0x37,//这四个会显示4 5 6 7 
                    0x38,0x39,0x2b,0x3d,//这四个会显示8 9 + =
                    0x2b,0x2d,0x2a,0x2f,//这四个会显示+ - * /
                    0x45,0x52,0x4f};    //这三个会显示E R O

uchar QUEUE[2*MAXLEN]={
  ' ',' ',' ',' ',' ',' '};        //定义一个队列

int count = 0;  

unsigned int state=0;
long a=0,b=0,c=0;


void mscanf(uchar *var);                //从矩阵键盘中获取值
void print(uchar *outStr,uint end);     //打印字符串

void delay5MS();            //短延时函数
void delay100MS();          //较长延时函数
void writeCMD(uchar com);       //写命令子程序
void showOneChar(uchar dat);    //写数据子程序

void init();        //初始化子程序,初始化液晶显示屏

void clear();       //清除显示屏上的显示
void clearInit();   //清屏,重置变量

void splitResultNum(long result);       // 分离数值

void number();                  //state0: 数字输入
void middle_add_sub();          //state:1:
void add_sub();                 //state:2:
void middle_add_sub_times();    //state:3;
void middle_add_sub_div();      //state:4;
void add_sub_times();           //state:5;
void add_sub_div();             //state:6;
void mulMidState();             //state7: *中间态
void divMidState();             //state8: /中间态
void mulState();                //state9: *计算态
void divState();                //state10: /计算态
void showError();               //state12:错误状态


/**************** 主函数 ******************/
void main()
{
    // state0:数字输入态
    // state1:+,-中间态
    // state2:+,-计算态
    // state3:+/-,*中间态
    // state4:+/-,/中间态
    // state5:+/-,*计算态
    // state6:+/-,/计算态
    // state7:*中间态
    // state8:/中间态
    // state9:*计算态
    // state10:/计算态
    // state11:清屏重置
    // state12:错误状态
    state = 0;
    init();
    while(1){
        switch(state){
            case 0:     // state0:数字输入态 
                number();
                break;
            case 1:     // state1:+,-中间态
                middle_add_sub();
                break;
            case 2:     // state2:+,-计算态
                add_sub();
                break;
            case 3:     // state3:+,-,*中间态
                middle_add_sub_times();
                break;
            case 4:     // state4:+,-,/中间态
                middle_add_sub_div();
                break;
            case 5:     // state5:+,-,*计算态
                add_sub_times();
                break;
            case 6:     // state6:+,-,/计算态
                add_sub_div();
                break;
            case 7:     // state7:*中间态
                mulMidState();
                break;
            case 8:     // state8:/中间态
                divMidState();
                break;
            case 9:     // state9:*计算态
                mulState();
                break;
            
  • 6
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值