基于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。
四、项目总结
本项目通过矩阵键盘和数码管实现了一个简单的计算器,支持加、减、乘、除运算。项目展示了硬件电路设计和软件编程的完整流程,具有较高的实用性和学习价值。
热门推荐
吃火锅必点麻酱,竟偷偷护牙?
糖尿病患者服用二甲双胍注意事项有哪些?
冬日暖胃必选:北新桥卤煮老店的百年味道
东四大街探秘:东来顺&八大楼传奇
电脑无法关机怎么办?五种实用解决方案帮你轻松应对关机故障
百家姓的“上古八大姓”,延续了五千多年,看看你是谁家的后代?
秋冬游西双版纳野象谷:观象、科普两不误
野象谷:人象和谐共处的生态乐园
探访勐远仙境:绿色旅游新地标
西双版纳秋冬旅游攻略:三个必去景点详解
绍兴消费总额达2705.6亿元,增速居全省第二
绍兴东街:千年老街的商业新生
甲癌术后为什么要服用优甲乐?有什么效果?
《蛟龙行动》票房口碑双丰收的秘密:精良制作与专业精神的完美结合
孙膑:马陵之战的战术大师
田忌赛马背后的孙膑兵法智慧
从残疾到军事家:孙膑的逆袭之路
韶关下雪后,火锅护牙秘籍大公开!
冬季火锅季,如何守护你的口腔健康?
冬季火锅季,如何保护你的牙齿?
长沙市口腔医院专家解析:火锅后如何清新口气?
中国在没有引入阿拉伯数字前,古人怎么书写算式解答数学问题?
如何正确书写大写数字“叁佰”,及其在生活中的应用与重要性
肝癌复发有解:载药微球栓塞结合免疫疗法成治疗新趋势
过年氛围已拉满!快来湖里citywalk吧!
佛教知识 | 绕佛三匝的含义与礼仪
佛山古村深度游:岭南文化的活化石
广府文化:岭南的独特魅力
春节打卡广东绝美景点:丹霞山&黄满寨瀑布
白鹅潭艺术中心:岭南文化新地标