基于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。
四、项目总结
本项目通过矩阵键盘和数码管实现了一个简单的计算器,支持加、减、乘、除运算。项目展示了硬件电路设计和软件编程的完整流程,具有较高的实用性和学习价值。
热门推荐
冬季高发!寒冷性荨麻疹的治疗与预防
70岁后肾功能只剩一半,4个方法延缓肾脏衰老
个性化营养方案助力失智预防,保健食品作用受关注
肾病患者警惕代谢性酸中毒:7大危害与4大治疗方案
南通农村丧事乐队的前世今生
南通农村丧事乐队:传统与现代的奇妙融合
无人机维护秘籍:让你的无人机飞得更高更远!
无人机失控怎么办?这些安全技术来保障
事业单位职测高效答题技巧:插空法VS最大信息法
事业单位职业能力倾向测验C类:考试内容与备考指南
职业能力倾向测验:职场进阶的科学指南
事业单位E类考试:职测备考秘籍
铁棍山药花样吃法大揭秘!
铁棍山药:养生还是“坑”?一文读懂选购与食用指南
温县铁棍山药:一根“铁棍”里的三千年养生智慧
速看!上海铁路第三大枢纽站将启用,坐这些方向火车要去松江站
地铁日均客流量突破800万乘次 深圳如何将“流量”变“留量”
深江铁路深圳机场东站即将开建!五分钟内完成所有中转
深圳一日游攻略推荐(独家整理多条路线)
一文详解:去除车内空调异味的四个有效方法
除夕:中国人最重要的团圆夜
汽车内饰精洗:不只是清洁,更是健康防护
动荡分化 破浪前行——世界经济形势回顾与展望
夜班族保健指南:5个维度打造健康生活方式
一桌茂名年夜饭:鸡猪鱼肉籺当家,满满都是家乡味
磷酸奥司他韦使用指南:剂量、时机与注意事项全解析
苏联解体后中国不索失地,为经济发展创造稳定环境
肝硬度值超7.4 kPa需警惕,FibroScan可无创检测
手机号也能查快递!多种官方渠道教你随时掌握物流动态
学生寒假作业拖延有解:时间管理与奖励机制双管齐下