51单片机实现三位十进制数加减乘除运算

51单片机实现三位十进制数加减乘除运算

一.题目

51单片机IO接口作业

请将附件给出的Proteus图用51单片机完成一个计算器功能。

1、显示采用动态分时8位共阳数码管输出。

2、采用4*4矩阵键盘输入,键盘上已经标识对应键。

3、完成三位十进制数的加、减、乘、除运算。

4、开机显示最右边数码管显示‘0’,输入按键值后依次左移。"+—*/"数码管显示分别“A B C D”。

按要求上交实验报告(加、减、乘、除的对应的Proteus仿真截图一定要有,下载到开发板图也必须有)。

二.实验思路

程序分为以下几步:

  1. 数码管显示模块,数码管上显示数字
  2. 矩阵键盘模块,用户按下按键返回相应的按键值
  3. 主函数,实现加减乘除运算,偷了点懒,其实加减乘除运算也可以独立出来做成一个模块

三.程序代码

#include<reg52.h>//共阳极数码管
unsigned char code segCodeTable[16] = {0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
//位码表
unsigned char code posCodeTable[8] = {
0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char code key_value[16]={0xD7,0xEB,0xDB,0xBB,0xED,0xDD,0xBD,0xEE,0xDE,0xBE,0x77,0x7B,0x7D,0x7E,
0xB7,0xE7};//键盘标识对应的键盘值 
void dis_seg7(unsigned long num,unsigned char dec_hex);
unsigned char keyscan();
void delayms (void);
unsigned char pre_P1;void main()
{unsigned char key0=0,key1=0,key2=0;unsigned char value = 0,j = 0;unsigned char state = 0;unsigned char dec_hex = 10;unsigned int NUMA = 0,NUMB = 0;unsigned long dis_num = 0;while(1){value = keyscan();//if((pre_P1 == 0xf0)&&(P1 != 0xf0))//实现数码管显示多位数字if((pre_P1 == 0xf0)&&(P1 != 0xf0)){if(value >= 0 && value <= 9){dec_hex = 10;key2 = key1;key1 = key0;key0 = value;dis_num = 100*key2 + 10* key1 + key0;}//按下操作符+-*/前,保存数码管显示数字dis_num到NUMA//	key0 = 0;key1 = 0;//key2 = 0;dis_num = value;//上述四条语句的目的:按下操作符显示对应的16进制数;//实现数码管的清零,即实现120+150,数码管一次显示120;//A(表示加号);150else if(value>=10&&value<=13){NUMA = dis_num;key0 = 0;key1 = 0;key2 = 0;dis_num = value;dec_hex = 16;if(value == 10 ){state ='+';			}else if(value == 11){state = '-';}else if (value == 12){state = '*';}else if (value == 13){state = '/';}}//按下等号时,保存数码管显示数字dis_num到NUMB,实现计算else if(value == 14){dec_hex = 10;key0 = 0;key1 = 0;key2 = 0;NUMB = dis_num;if(state == '+'){dis_num = NUMA + NUMB;}else if(state == '-'){dis_num = NUMA - NUMB;}else if(state == '*'){dis_num = NUMA * NUMB;}else if(state == '/'){dis_num = NUMA / NUMB;}} //数码管清零else if(value == 15){dec_hex = 10;key0 = 0;key1 = 0;key2 = 0;NUMA = 0;NUMB = 0;dis_num = 0;			}}pre_P1 = P1;dis_seg7(dis_num,dec_hex);for(j = 0;j < 200;j++);}	
}//七段数码管显示模块
void dis_seg7(unsigned long num,unsigned char dec_hex)
{char i = 0,count = 8;unsigned int j =0;char dis_data = 0;for(i = 0;i < count;i++){dis_data = num % dec_hex;num = num / dec_hex;P2 = segCodeTable[dis_data];P3 = posCodeTable[i];for(j = 0;j < 200;j++);P2 = 0xff; //清除余晖if(num == 0){break;}}	 
}//延时模块
void delayms (void)
{
unsigned char i;
for (i=200;i>0;i--);
}//按键扫描模块
unsigned char keyscan()
{unsigned char rowscan,colscan,row_col,i;static unsigned char value;P1 = 0xf0;	//P1输出 0xf0if((P1&0xf0) != 0xf0) //P1读入数据,判断是否有按键按下{delayms();//延时消抖if((P1&0xf0) != 0xf0){//本代码采用逐行扫描的方式来确定按下的按键rowscan = 0xfe;while((rowscan&0x10)!=0){P1 = rowscan;colscan = P1 & 0xf0;if(colscan != 0xf0){//确定按下按键的行号与列号,查表,返回按键值row_col = colscan | (rowscan&0x0f);for(i = 0;i<16;i++){if(row_col == key_value[i]){value = i;}}break;}else {rowscan = (rowscan << 1) | 0x1;}}}}return value;
}

四.运行结果

1.加法

123 + 456 = 579

image-20210428192551440

image-20210428192632301

image-20210428192705666

image-20210428192738306

2.减法

789 - 123 = 666

image-20210428192903244

image-20210428192938888

image-20210428193015322

image-20210428193047695

3.乘法

100 * 234 = 23400

image-20210428193129775

image-20210428193153045

image-20210428193224389

image-20210428193241823

4.除法

480/160 =3

image-20210428193428830

image-20210428193500788

image-20210428193549611

image-20210428193609649
github下载链接
代码及proteus工程下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

未能加载文件或程序集“Microsoft.Office.Interop.Owc11, Version=11.0.0.0, ...”或它的某一个依赖项~[解决方案]...

配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。 分析器错误信息: 未能加载文件或程序集“Microsoft.Office.Interop.Owc11, Version11.0.0.0, Cultureneutral, PublicKeyToken71e9bce111e9429c”或它的某一个…

方法javaJVM学习笔记-内存处理

本文是一篇关于方法java的帖子 大多数JVM将内存区域分离为Method Area&#xff08;Non-Heap&#xff09;&#xff0c;Heap&#xff0c;Program Counter Register&#xff0c;Java Method Statck&#xff0c;Native Method Stack和Direct Memomry&#xff08;备注&#xff1a;Di…

数据结构单向不循环链表实现多项式合并

多项式合并 思路 多项式合并 P1 5 2x 8x ^8 3x^16 P2 6x 16x^6 - 8x^8 P P1 P2 5 8x 16x^6 3x^16 使用带头结点的单向不循环链表 每个节点分为三个部分&#xff0c;系数项&#xff0c;指数项&#xff0c;指针域 结构体表示为 struct node_st {int exponent;int …

下 终端_Linux/UNIX 下终端复用利器 tmux

tmux 是一个终端复用器(terminal multiplexer)。简介tmux 是一个终端复用器类自由软件&#xff0c;功能类似 GNU Screen&#xff0c;但使用 BSD 许可发布。用户可以通过 tmux 在一个终端内管理多个分离的会话&#xff0c;窗口及面板&#xff0c;对于同时使用多个命令行&#xf…

消失的字符串——c语言函数中的数据存储方式以及字符串实现

2019独角兽企业重金招聘Python工程师标准>>> 事情是这样的&#xff0c;最近在学习翁老师的Mooc之C语言程序设计&#xff0c;插一句&#xff0c;真的是好老师&#xff0c;讲的真的太好了&#xff0c;在c里的字符串这里&#xff0c;翁老师演示了一个小程序&#xff0c…

JQuery 文本框高亮显示插件

以前使用Mootools Js框架&#xff0c;文本框有个$(id).highlight()高亮方法&#xff0c;使其高亮显示&#xff0c;效果如下&#xff1a; JQuery 中没有这个方法&#xff0c;自己今天写了一个Plugin&#xff0c;把代码贴出来分享一下&#xff1b; 代码如下&#xff1a; jquery-h…

链方法[C# 基础知识系列]专题三:如何用委托包装多个方法——委托链

最近研究链方法&#xff0c;稍微总结一下&#xff0c;以后继续补充&#xff1a; 弁言&#xff1a; 上一专题分析了下编译器是如何来翻译委托的&#xff0c;从中间语言的角度去看委托&#xff0c;希望可以帮助大家进一步的理解委托&#xff0c;然而之前的分析都是委托只是封装一…

51单片机lcd1602的简单实用

基础知识准备 lcd1602简介 图片来自b站斌哥单片机 需要关注的有以下几点&#xff1a; RS : 高数据低命令&#xff1b;RS 1时&#xff0c;lcd1602读写数据&#xff0c;RS0时&#xff0c;lcd1602读写命令R/W&#xff1a;高读低写&#xff1b;RW1时&#xff0c;单片机读取lcd160…

firedebug调试Jquery

不了解的同学先“点这里”看看什么是Firebug。简单来说&#xff0c;Firebug是Firefox上用来监视、编辑和调试站点的CSS、HTML、DOM和JavaScript的扩展工具。 我们先到Firebug的主页上下载最新的版本装上&#xff0c;下面开始调试&#xff1a; 1、查看、编辑HTML元素及其(转) 安…

51单片机数字钟的实现

作业 用51单片机完成一个数字钟的计时及校时功能。 1、设置8个数码管的显示缓冲区为DISPBUFF[8],并初始化为02,02,-,04,08,-,03,06. 2、定时器0每隔5ms刷新一次数码管显示缓冲区&#xff0c;并显示时间(中断来做&#xff09; 3、定时器1负责精确定时&#xff0c;计时1s,每隔…

Google Map API 学习三

转载于:https://www.cnblogs.com/MyFlora/p/3154066.html

慎用SELECT INTO复制表

很多时候我们习惯于用SELECTINTO 复制一个表或表结构&#xff0c;因为它方便&#xff0c;快捷&#xff0c;而且在某些情况下效率比INSERT INTO 效率要高一些。但是要注意&#xff1a; SELECT INTO 复制表或表结构的时候&#xff0c;只是得到了一个“外壳”&#xff0c;就像克隆…

信号的采样与插值重建(包含matlab)

实验任务 双频信号的采样和插值重建&#xff1a;对双频信号进行采样&#xff08;符合奈奎斯特低通采样定理&#xff09;&#xff0c;绘制波形和频谱&#xff1b;编制sinc函数插值函数&#xff0c;对采样进行恢复&#xff0c;绘制波形。 实验原理 matlab代码 clear all; clos…

dc概论之IO约束

版权声明&#xff1a;转载时请以超链接形式标明文章原始出处和作者信息及本声明http://bb2hh.blogbus.com/logs/39654476.html 注明&#xff1a;如需转载&#xff0c;请注明作者出处&#xff0c;谢谢&#xff5e;&#xff0c;Author&#xff1a;pythonlong以下根据资料和个人体…

普通调幅(AM)与抑制载波双边带调幅(DSB)matlab编程实现

实验任务 实现单频信号的AM、DSB调制&#xff0c;绘制调制前后的波形和频谱 实验原理 matlab代码 AM调制 clear all; ts 0.0025; %信号抽样时间间隔 fs 1/ts; %抽样频率 t 0:ts:10-ts; %时间向量 df fs/length(t); %fft的频率分辨率 msg2 cos(2*pi*2*t); Pn fft(msg2…

MySQL中MySQL X.X Command Line Client一闪而过的问题

问题介绍&#xff1a;我安装完MySQL(我安装的是5.5)后&#xff0c;使用MySQL 5.5 Command Line Client&#xff0c;每次点击&#xff0c;总是一闪而过。解决方法如下&#xff1a;首先进入cmd 切入MySQL的安装目录&#xff0c;然后切入 bin 目录 &#xff0c;输入mysqld-nt --sk…

4pam调制与解调(matlab实现)

实验原理 这是一种使用脉冲幅度调制技术的线路编码。PAM4信号有四个电压电平&#xff0c;每个幅度电平分别对应逻辑比特00、01、10和11。换言之&#xff0c;PAM4编码的每个符号由2个比特组成&#xff0c;它们对应一个电压电平&#xff0c;即幅度。 00对应-3,01对应-1,10对应1,…

普通调幅(AM)与包络检波(matlab实现)

普通调幅&#xff08;AM&#xff09;与包络检波 1.实验任务 采用matlab实现普通调幅信号的包络检波&#xff0c;并绘制包络检波后的信号的波形与频谱。 2.实验原理&#xff08;请读者参见matlab通信仿真文件夹&#xff09; 3.matlab代码 time.33;%采样时长 Ts1/10000;%采样…

免费Google地图API使用说明(转)

转自&#xff1a;http://www.cnblogs.com/mypig/articles/1936154.html01事件监视 02 03GEvent.addListener用来注册事件监视器&#xff0c;在这个例子中&#xff0c;在用户移动或拖拽地图后&#xff0c;输出地图中心点的经/纬. 04 05 06var map new GMap(document.getElem…

双栈共享存储空间(C++代码实现)

理论部分 理论来源&#xff1a;b站up主:跟懒猫老师快乐数据结构 C代码 #include<iostream> using namespace std; const int STACKSIZE 6; //两栈共享存储空间编程 //使用类模板编程 template<class DataType> class BothStack { private:DataType *data;//属性…