单片机AT89C52实现的8位计算器

5星 · 超过95%的资源 需积分: 9 3 下载量 4 浏览量 更新于2024-09-12 收藏 4KB TXT 举报
"这篇文档是关于使用单片机AT89C52实现一个简单的8位数字计算器的程序设计,支持基本的加减乘除运算,并具有连续计算功能。" 在单片机编程中,计算器的实现通常涉及到输入、运算和显示等关键模块。在这个例子中,使用了AT89C52单片机,它是一款常见的8位微控制器,具有丰富的I/O口和内部程序存储器。以下是对给定代码部分的详细解释: 1. **头文件和宏定义**: - `#include<reg52.h>`:这个头文件包含了52系列单片机的寄存器定义,方便对单片机的IO端口进行操作。 - `#define` 宏定义:用于创建符号常量,如 `uint` 定义无符号整型,`uchar` 定义无符号字符型,以及对特定端口位的定义,如 `dula` 和 `wela` 分别对应P2^6和P2^7,这些是用于控制显示器的。 2. **数据结构和数组**: - `uchar LA[8]`:定义了一个8位字符数组,可能用于存储待显示的数字。 - `uchar codewetable[]` 和 `uchar codedutable[]`:这两个数组分别存储了数字0-9的7段码,用于驱动7段LED显示器。 3. **变量声明**: - `uchar temp, flag, ch, date, count, p, mark`:这些变量用于不同目的,例如 `temp` 用于暂存按键状态,`flag` 标记是否有按键按下,`ch` 保存当前运算符,`date` 记录按键值,`count` 可能用于计数,`p` 指向显示的数字,`mark` 用于标记计算器的状态。 4. **延时函数**: - `void delay(uint z)`:这是一个简单的延时函数,通过嵌套循环来实现。这种延迟方法虽然不精确,但对于简单应用来说足够了。 5. **初始化函数**: - `void init()`:初始化函数用于设置计算器的初始状态,清零所有变量,准备开始新的计算。 6. **按键扫描函数**: - `uchar keyscan()`:该函数用于检测按键输入。它通过读取P1口并比较其值来识别按键是否被按下。这里使用了两次按键检测,以避免按键抖动造成误判。 7. **主程序**: 主程序未在提供的代码中给出,但通常会包含以下部分: - 键盘扫描(调用 `keyscan()` 函数) - 数字和运算符的处理,更新 `num1`, `num2`, `num` 等变量 - 根据运算符执行相应的计算(如加法、减法、乘法、除法) - 显示结果(使用7段码数组和控制位) - 检查是否有新的运算请求(`flag` 变量) 通过以上分析,我们可以看到这个计算器程序的核心是处理输入、执行运算和显示结果。虽然具体的主程序逻辑没有给出,但从提供的代码片段中可以推断出整个程序的大致结构和工作原理。对于学习单片机编程和数字电路设计的人来说,这样的项目是一个很好的实践案例。
2018-01-15 上传
51计算器程序#include #include #define uchar unsigned char #define uint unsigned int sbit lcden=P3^4; sbit lcdrw=P3^6; sbit lcdrs=P3^5; uchar num,temp,jia=0,cheng=0,chu=0,jian=0,qing=0; uint key,key1,shu; uchar fuhao,flag1,flag=0; uchar table[]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,}; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=114;y>0;y--); } bit lcd_bz() { bit result; lcdrs = 0; lcdrw= 1; lcden = 1; _nop_(); _nop_(); _nop_(); _nop_(); result=(bit)(P0&0x80;); lcden=0; return result; } void write_com(uchar com) { while(lcd_bz()); lcdrs=0; lcden=0; lcdrw=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } void write_date(uchar date) { while(lcd_bz()); lcdrs=1; lcden=0; lcdrw=0; P0=date; delay(5); lcden=1; delay(5); lcden=0; } void lcd_init() { lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); } void keyscan() { P3=0xfe; temp=P3; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) { temp=P3; switch(temp) { case 0xee:key=1;num=0;break; case 0xde:key=2;num=0;break; case 0xbe:key=3;num=0;break; case 0x7e:num=1;break; //¼ÓºÅ } while(temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xfd; temp=P3; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) { temp=P3; switch(temp) { case 0xed:key=4;num=0;break; case 0xdd:key=5;num=0;break; case 0xbd:key=6;num=0;break; case 0x7d:num=2;break; //¼õºÅ } while( temp!=0xf0) { temp=P3; temp=temp&0xf0; } } } P3=0xfb; temp=P3; temp=temp&0xf0; while(temp!=0xf0) { delay(5); temp=P3; temp=temp&0xf0; while(temp!=0xf0) { temp=P3; switch(temp) { case 0xeb:key=7;num=0;break; case 0xdb:key=8;num=0;break; case 0xbb:key=9;num=0;break