基于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。
四、项目总结
本项目通过矩阵键盘和数码管实现了一个简单的计算器,支持加、减、乘、除运算。项目展示了硬件电路设计和软件编程的完整流程,具有较高的实用性和学习价值。
热门推荐
车多缓缓归,到家说一声
电线选2.5平跟 4 平?都选 4 平有无必要?听良心师傅透彻分析!
牙齿有个洞一碰就疼怎么办?龋齿/牙龈炎治疗方式各不相同!
轻微蛀牙能自愈吗?来了解下怎么处理比较好
您应该看牙周病医生治疗牙龈病的 6 个迹象
春晚舞台的文化自信:民族风与汉服的复兴与创新
项目管理EV如何计算
单个项目预算管理方法有哪些
工程项目管理中如何实现成本控制的7个策略
美联储降息周期全面分析:历史数据、影响评估与投资策略
柯洁退赛引发争议:围棋比赛究竟是比规则还是比棋艺?
《新水浒传》音乐里的江湖豪情
《新水浒传》经典音乐盘点:哪段旋律最让你热血沸腾?
西洋参泡水的功效与作用、禁忌和食用方法
消费者才是电商的最大公约数
从DOS到Windows:比尔·盖茨的传奇之路
川藏线沿途加油站分布情况
电脑大写锁定键失灵?多种解决方案帮你轻松应对
Mac用户必看:一键掌握Shift与Caps Lock的妙用
维生素的营养作用与健康:通俗科普
蛋仔派对最新搞笑瞬间大集合!
蛋仔派对新玩法上线!逃出惊魂夜&特种蛋集合
《教父》背后:意大利南部移民的真实故事
《教父》角色心理剖析:维托 vs 迈克尔
维托·柯里昂:《教父》中的人脉王
揭秘《教父》:维托·柯里昂的真实原型是查理·卢奇安诺
《教父》:黑手党世界的权力与人性
2024九华山门票价格多少钱?九华山门票老人/学生/小孩免费/优惠人群对象政策
九华山的具体地理位置
什么检查能查心脏病?心血管医生科普:3大类9个项目1次总结收藏