问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
CSDN
1.
https://m.blog.csdn.net/MGT_9796/article/details/142160567

基于51单片机的简易计算器设计是一个结合硬件和软件的项目,通过AT89C51单片机实现基本的算术运算功能。该项目使用矩阵键盘作为输入设备,数码管作为显示设备,支持加、减、乘、除运算,并对特殊情况进行处理。

一、硬件设计

1. 数码管显示

本次设计采用四位共阴数码管进行显示,使用P0口控制段码,P1口的P10、P12、P13、P14进行位选。采用动态扫描方式显示,通过定时器实现高实时性。

2. 矩阵按键

由于需要处理多个按键输入(数字、运算符、清除等),采用矩阵键盘设计。矩阵键盘通过扫描方式实现,可以节省IO资源。

二、软件设计

1. 数码管显示控制

数码管显示通过定时器中断实现扫描。定时器中断函数nixie_Loop负责从数码管缓冲区获取数据并显示。

#include <REGX52.H>
unsigned char nixie_Buf[9]={0,10,10,10,10,10,10,10,10};
unsigned char Data[]={0x3f,0x30,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0x79,0x3E};

void nixie(unsigned char Location, unsigned char number) {
    nixie_Buf[Location] = number;
}

void nixie_Scan(unsigned char Location, unsigned char number) {
    P0 = 0x00;
    switch(Location) {
        case 1: P1_0 = 0; P1_1 = 1; P1_2 = 1; P1_3 = 1; break;
        case 2: P1_0 = 1; P1_1 = 0; P1_2 = 1; P1_3 = 1; break;
        case 3: P1_0 = 1; P1_1 = 1; P1_2 = 0; P1_3 = 1; break;
        case 4: P1_0 = 1; P1_1 = 1; P1_2 = 1; P1_3 = 0; break;
        default: break;
    }
    P0 = Data[number];
}

void nixie_Loop() {
    static unsigned char i = 1;
    nixie_Scan(i, nixie_Buf[i]);
    i++;
    if(i >= 9) { i = 1; }
}

2. 矩阵键盘扫描

矩阵键盘通过列扫描方式实现。函数MatrixKey负责检测按键状态并返回按键编号。

#include <REGX52.H>
#include "delay.h"

unsigned char MatrixKey() {
    unsigned char KeyNumber = 255;
    P2 = 0xff;
    P2_3 = 0;
    if(P2_7 == 0) { delay(20); while(P2_7 == 0); delay(20); KeyNumber = 0; }
    if(P2_6 == 0) { delay(20); while(P2_6 == 0); delay(20); KeyNumber = 4; }
    if(P2_5 == 0) { delay(20); while(P2_5 == 0); delay(20); KeyNumber = 8; }
    if(P2_4 == 0) { delay(20); while(P2_4 == 0); delay(20); KeyNumber = 12; }

    P2 = 0xff;
    P2_2 = 0;
    if(P2_7 == 0) { delay(20); while(P2_7 == 0); delay(20); KeyNumber = 1; }
    if(P2_6 == 0) { delay(20); while(P2_6 == 0); delay(20); KeyNumber = 5; }
    if(P2_5 == 0) { delay(20); while(P2_5 == 0); delay(20); KeyNumber = 9; }
    if(P2_4 == 0) { delay(20); while(P2_4 == 0); delay(20); KeyNumber = 13; }

    P2 = 0xff;
    P2_1 = 0;
    if(P2_7 == 0) { delay(20); while(P2_7 == 0); delay(20); KeyNumber = 2; }
    if(P2_6 == 0) { delay(20); while(P2_6 == 0); delay(20); KeyNumber = 6; }
    if(P2_5 == 0) { delay(20); while(P2_5 == 0); delay(20); KeyNumber = 10; }
    if(P2_4 == 0) { delay(20); while(P2_4 == 0); delay(20); KeyNumber = 14; }

    P2 = 0xff;
    P2_0 = 0;
    if(P2_7 == 0) { delay(20); while(P2_7 == 0); delay(20); KeyNumber = 3; }
    if(P2_6 == 0) { delay(20); while(P2_6 == 0); delay(20); KeyNumber = 7; }
    if(P2_5 == 0) { delay(20); while(P2_5 == 0); delay(20); KeyNumber = 11; }
    if(P2_4 == 0) { delay(20); while(P2_4 == 0); delay(20); KeyNumber = 15; }
    return KeyNumber;
}

3. 定时器配置

定时器0用于控制数码管扫描。配置函数Timer0_Init初始化定时器,中断函数Timer0_Routine负责扫描数码管。

#include <REGX52.H>

void Timer0_Init() {
    TMOD &= 0xf0;
    TMOD |= 0x01;
    TF0 = 0;
    TR0 = 1;
    TH0 = 0xfc;
    TL0 = 0x18;
    ET0 = 1;
    EA = 1;
    PT0 = 0;
}

void Timer0_Routine() interrupt 1 {
    static unsigned int T0Count1;
    TL0 = 0X18;
    TH0 = 0xfc;
    T0Count1++;
    if(T0Count1 >= 2) {
        T0Count1 = 0;
        nixie_Loop();
    }
}

三、功能演示

1. 运算逻辑

用户通过矩阵键盘输入操作数和运算符,按下等于号后显示计算结果。例如,输入12加3,结果为15。

2. 特殊情况处理

  • 当结果小于等于0时,显示0。
  • 当除数为0时,结果强制设置为0。

四、项目总结

本项目通过矩阵键盘和数码管实现了一个简单的计算器,支持加、减、乘、除运算。项目展示了硬件电路设计和软件编程的完整流程,具有较高的实用性和学习价值。








© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号