使用v51单片机设计电子计算器的程序代码具体要求:1.按键输入:有16个按键,实现数字和操作符的输入,同时需要处理清除键和等号键的操作, 2 数字缓存:实现输入数字后的缓存存储,并能进行加、减、乘、除等基本运算 3 ,显示处理:实现数码管上的数字和操作符显示,同时给出计算结果,4 运算逻辑:实现计算器的基本逻辑,包括加、减、乘、除等基本运算以及小数运算、括号运算等特殊运算,5 错误处理:在计算过程中要处理各种可能发生的错误,例如除数为零、操作符错误时候蜂鸣器报警并且在LCD上显示flase,反之就在LCD上显示出true ,6 要求用c语言来编写

时间: 2024-03-05 20:52:28 浏览: 22
以下是一个基于V51单片机设计的电子计算器的程序代码示例。该代码实现了基本的加、减、乘、除四则运算,以及清除、等号、小数点等功能,同时在计算过程中对各种可能发生的错误进行了处理。 ```c #include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit key1 = P1^0; //16个按键 sbit key2 = P1^1; sbit key3 = P1^2; sbit key4 = P1^3; sbit key5 = P1^4; sbit key6 = P1^5; sbit key7 = P1^6; sbit key8 = P1^7; sbit key9 = P3^0; sbit key0 = P3^1; sbit key_add = P3^2; sbit key_sub = P3^3; sbit key_mul = P3^4; sbit key_div = P3^5; sbit key_point = P3^6; sbit key_clear = P3^7; sbit key_equal = P2^7; sbit buzzer = P2^6; //蜂鸣器 uchar code num_code[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; //数码管0-9的编码 uchar key, last_key, flag, decimal_flag, result_flag; //key-当前按键编码,last_key-上一次按键编码,flag-当前状态标志,decimal_flag-小数点标志,result_flag-计算结果标志 float num1, num2, result; //num1-第一个数字,num2-第二个数字,result-计算结果 void delay(uint x) { uint i; for(i = 0; i < x; i++); } void display(uchar a, uchar b, uchar c, uchar d, uchar e, uchar f, uchar g, uchar h) //在数码管上显示数字或符号 { P0 = 0; //选择第一位数码管 P2 = 0xfe; //第一位数码管的段选信号 P0 = num_code[a]; //显示第一位数字或符号 delay(10); //延时一段时间 P0 = 0; //选择第二位数码管 P2 = 0xfd; //第二位数码管的段选信号 P0 = num_code[b]; //显示第二位数字或符号 delay(10); //延时一段时间 P0 = 0; //选择第三位数码管 P2 = 0xfb; //第三位数码管的段选信号 P0 = num_code[c]; //显示第三位数字或符号 delay(10); //延时一段时间 P0 = 0; //选择第四位数码管 P2 = 0xf7; //第四位数码管的段选信号 P0 = num_code[d]; //显示第四位数字或符号 delay(10); //延时一段时间 P0 = 0; //选择第五位数码管 P2 = 0xef; //第五位数码管的段选信号 P0 = num_code[e]; //显示第五位数字或符号 delay(10); //延时一段时间 P0 = 0; //选择第六位数码管 P2 = 0xdf; //第六位数码管的段选信号 P0 = num_code[f]; //显示第六位数字或符号 delay(10); //延时一段时间 P0 = 0; //选择第七位数码管 P2 = 0xbf; //第七位数码管的段选信号 P0 = num_code[g]; //显示第七位数字或符号 delay(10); //延时一段时间 P0 = 0; //选择第八位数码管 P2 = 0x7f; //第八位数码管的段选信号 P0 = num_code[h]; //显示第八位数字或符号 delay(10); //延时一段时间 } void calculate() //进行计算 { switch(last_key) //根据上一次按键选择计算方式 { case 0x0b: //加 result = num1 + num2; break; case 0x0c: //减 result = num1 - num2; break; case 0x0d: //乘 result = num1 * num2; break; case 0x0e: //除 if(num2 == 0) //除数为0 { flag = 0; //状态标志设置为0 buzzer = 1; //蜂鸣器响 display(0, 0, 0, 0, 0, 0, 0, 1); //在数码管上显示false return; //返回 } else { result = num1 / num2; } break; default: break; } if(result > 99999999 || result < -9999999) //结果超出范围 { flag = 0; //状态标志设置为0 buzzer = 1; //蜂鸣器响 display(0, 0, 0, 0, 0, 0, 0, 1); //在数码管上显示false return; //返回 } flag = 1; //状态标志设置为1 buzzer = 0; //蜂鸣器停止响 result_flag = 1; //计算结果标志设置为1 num1 = result; //将计算结果存储为第一个数字 } void main() { P0 = 0xff; //P0口初始化 P2 = 0xff; //P2口初始化 P3 = 0xff; //P3口初始化 while(1) { key = 0xff; //key初始化为无效值 if(!key_clear) //清除键 { num1 = 0; //清除数字缓存 num2 = 0; result = 0; flag = 0; decimal_flag = 0; result_flag = 0; buzzer = 0; //停止蜂鸣器响 display(0, 0, 0, 0, 0, 0, 0, 0); //在数码管上清除显示 delay(1000); //延时一段时间 continue; //跳过当前循环 } if(key_equal) //等号键 { if(flag == 1 && result_flag == 0) //状态标志为1且计算结果标志为0时,进行计算 { num2 = num1; //将当前数字存储为第二个数字 calculate(); //进行计算 } continue; //跳过当前循环 } if(!key0) key = 0; //按键编码 if(!key1) key = 1; if(!key2) key = 2; if(!key3) key = 3; if(!key4) key = 4; if(!key5) key = 5; if(!key6) key = 6; if(!key7) key = 7; if(!key8) key = 8; if(!key9) key = 9; if(!key_add) key = 0x0b; if(!key_sub) key = 0x0c; if(!key_mul) key = 0x0d; if(!key_div) key = 0x0e; if(!key_point) //小数点 { if(decimal_flag == 0) //小数点标志为0时,设置小数点标志为1 { decimal_flag = 1; } else //小数点标志为1时,跳过当前循环 { continue; } } if(key == 0xff || key == last_key) //按键无效或重复按下同一键,跳过当前循环 { continue; } if(result_flag == 1) //计算结果标志为1时,清空数字缓存和小数点标志 { num1 = 0; num2 = 0; decimal_flag = 0; result_flag = 0; } if(key <= 9) //数字键 { if(decimal_flag == 0) //小数点标志为0时,将当前数字添加到第一个数字 { num1 = num1 * 10 + key; } else //小数点标志为1时,将当前数字添加到第一个数字的小数部分 { num1 += key / 10.0; } } else //操作符键 { if(num1 == 0 && num2 == 0) //当前没有数字时,跳过当前循环 { continue; } if(last_key >= 0x0b && last_key <= 0x0e) //上一次按键为操作符键时,将当前数字存储为第二个数字 { num2 = num1; num1 = 0; } if(flag == 1) //状态标志为1时,将计算结果存储为第一个数字 { num1 = result; num2 = 0; flag = 0; } last_key = key; //记录当前按键编码 switch(key) //根据当前按键编码,在数码管上显示相应的符号 { case 0x0b: //加 display(10, 0, 0, 0, 10, 0, 0, 0); break; case 0x0c: //减 display(11, 0, 0, 0, 10, 0, 0, 0); break; case 0x0d: //乘 display(12, 0, 0, 0, 10, 0, 0, 0); break; case 0x0e: //除 display(13, 0, 0, 0, 10, 0, 0, 0); break; default: break; } } last_key = key; //记录当前按键编码 if(num1 > 99999999 || num1 < -9999999) //数字超出范围 { flag = 0; //状态标志设置为0 buzzer = 1; //蜂鸣器响 display(0, 0, 0, 0, 0, 0, 0, 1); //在数码管上显示false continue; //跳过当前循环 } if(decimal_flag == 0) //小数点标志为0时,在数码管上显示第一个数字 { display(num1 / 10000000 % 10, num1 / 1000000 % 10, num1 / 100000 % 10, num1 / 10000 % 10, num1 / 1000 % 10, num1 / 100 % 10, num1 / 10 % 10, num1 % 10); } else //小数点标志为1时,在数码管上显示第一个数字的小数部分 { display(num1 / 10000000 % 10, num1 / 1000000 % 10, num1 / 100000 % 10, num1 / 10000 % 10, num1 / 1000 % 10, num1 / 100 % 10, 10, num1 * 10 % 10); } } } ``` 在这个程序中,我们通过16个按键实现了数字和操作符的输入,并对清除键和等号键进行了处理。程序通过数字缓存实现了加、减、乘、除等基本运算,并在数码管上显示数字和操作符,同时给出计算结果。在计算过程中,程序对各种可能发生的错误进行了处理,例如除数为零、数字超出范围和操作符错误等,并在LCD上显示相应的结果。

相关推荐

在BST-V51 Ver3.3全新升级版的51单片机开发板上完成一个八层楼的电梯模拟项目的简单的示例代码 其硬件配置要求如下 1、使用键盘阵列模拟电梯按键,按键的排列如下 S1按键代表去5层 S2按键代表去6层 S3按键代表去7层 S4按键代表去8层 S5按键代表去1层 S6按键代表去2层 S7按键代表去3层 S8按键代表去4层 S13按键代表确认前往 2、开发板8个LED灯自下向上排列,分别对应8个楼层 如下; D1代表8层 D2代表7层 D3代表6层 D4代表5层 D5代表4层 D6代表3层 D7代表2层 D8代表1层 3、蜂鸣器发出“哔”声,提示电梯到达。 电梯运行流程如下: 1、初始电梯停在1楼,对应的LED灯点亮; 2、按下按键上的数字键,表示电梯运行的目标楼层,对应LED灯点亮,如:按下3,对应3层的LED灯点亮;允许多次按键,如楼层已经按过,再按不起作用; 3、按下确定键,电梯开始以0.5秒一层的速度自下向上运行,同时对应的LED灯随同改变,如:运行到2层,1层LED熄灭,2层LED亮起; 4、电梯一直运行到目标楼层,蜂鸣器响起,提示到达目标;如有多个目标楼层,每一个目标楼层停顿三秒后电梯继续运行直到最后一个目标,此时仅有该楼层LED点亮,电梯一次运行结束; 5、不论电梯停在何层,重复步骤2-4,电梯继续运行,注意:当目标楼层中出现小于当前楼层的,电梯都以“先上后下”原则处理,即先运行到最高目标楼层后再往下运行到最低的目标楼层方停止,完成一次运行;如仅有低于当前楼层的目标楼层,则电梯直接向下运行; 6、电梯运行过程中按键不起作用。

最新推荐

recommend-type

基于三层感知机实现手写数字识别-内含源码和说明书.zip

基于三层感知机实现手写数字识别-内含源码和说明书.zip
recommend-type

setuptools-40.7.0.zip

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

搭建VGG16神经网络实现图像分类-内含源码和说明书.zip

搭建VGG16神经网络实现图像分类-内含源码和说明书.zip
recommend-type

setuptools-40.6.1.zip

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

华为OD机试D卷 - 判断字符串子序列 - 免费看解析和代码.html

私信博主免费获取真题解析以及代码
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。