当前位置: 首页 > news >正文

51单片机应用从零开始(五)·加减乘除运算

51单片机应用从零开始(一)-CSDN博客

51单片机应用从零开始(二)-CSDN博客

51单片机应用从零开始(三)-CSDN博客

51单片机应用从零开始(四)-CSDN博客

详解 KEIL C51 软件的使用·建立工程-CSDN博客

详解 KEIL C51 软件的使用·设置工程·编绎与连接程序-CSDN博客

        前面我们通过对P3口的控制实现了流水灯的操作,下面我们来进行加减乘除运算的学习。

1.  用 P0 口、P1 口分别显示加法和减法运算结果

#include<reg51.h> 
void main(void) 
{ unsigned char m,n; m=43; //即十进制数 2x16+11=43 n=60; //即十进制数 3x16+12=60 P1=m+n; //P1=103=0110 0111B,结果 P1.3、P1.4、P1.7 口的灯被点亮P0=n-m; //P0=17=0001 0001B,结果 P0.0、P0.4 的灯被熄灭}

2.  用 P0、P1 口显示乘法运算结果

        51单片机的P0口和P1口是用来进行输入输出的通用口,可以通过程序来进行控制。如果要使用P0和P1口来显示乘法运算结果,可以采用以下步骤:

  1. 定义变量:定义两个变量m和n,分别用来存储乘数和被乘数。

  2. 通过P0口输入数据:使用P0口进行输入操作,将乘数和被乘数分别输入到变量m和n中。

  3. 进行乘法运算:使用乘法指令MUL将m和n相乘,将结果存入寄存器中。

  4. 将乘法结果存到P1口中:使用P1口进行输出操作,将乘法结果从寄存器中读取,通过P1口输出。

下面是代码实现的具体步骤:

#include<reg51.h> //包含单片机寄存器的头文件
void main(void) 
{ unsigned char m,n; unsigned int s; m=64; n=71; s=m*n;  //s=64*71=4544,需要 16 位二进制数表示,高 8 位送 P1 口,低 8 位送 P0 口//由于4544=17*256+192=H3*16*16*16+H2*16*16+H1*16+H0 //两边同除以 256,可得 17+192/256=H3*16+H2+(H1*16+H0)/256 //因此,高 8 位 16 进制数 H3*16+H2 必然等于 17,即 4544除以 256 的商//低 8 位 16 进制数 H1*16+H0 必然等于 192,即 4544 除以256 的余数P1=s/256; //高 8 位送 P1 口 ,P1=17=11H=0001 0001B, P1.0 和 P1.4口灭,其余亮P0=s%256; //低 8 位送 P0 口 , P3=192=c0H=1100 0000B,P3.1,P3.6,P3.7 口灭,其余亮
}

3.  用 P1、P0 口显示除法运算结果

#include<reg51.h> //包含单片机寄存器的头文件
void main(void) 
{ P1=36/5; //求整数P0=((36%5)*10)/5; //求小数while(1) ; //无限循环防止程序“跑飞”}

4.  用自增运算控制 P0 口 8 位 LED 流水花样

#include<reg51.h> //包含单片机寄存器的头文件
/****************************************************** 
函数功能:延时一段时间
******************************************************/ 
void delay(void) 
{ unsigned int i; for(i=0;i<20000;i++) ; 
} 
/****************************************************** 
函数功能 :主函数
******************************************************/ 
void main(void) 
{ unsigned char i; for(i=0;i<255;i++) //注意 i 的值不能超过 255 { P0=i; //将 i 的值送 P0 口delay(); //调用延时函数} 
}

更多推荐:

时光の尘_千题千解·Java面试宝典,Linux学习,C++学习-CSDN博客

相关文章:

  • Spark DataFrame join后移除重复的列
  • 【Linux网络】搭建内外网的网关服务器,实现DNS分离解析与DHCP自动分配
  • 决策树,sql考题,30个经典sql题目
  • 扩散模型实战(九):使用CLIP模型引导和控制扩散模型
  • Genio 500_MT8385安卓核心板:功能强大且高效
  • 【算法】算法题-20231117
  • Android 11.0 存在中文字符,中文文件名,中文系统属性,编译报错的解决方案
  • Apache Airflow (八) :DAG任务依赖设置
  • Docker push的 http 413问题处理
  • 卡尔曼家族从零解剖-(07) 高斯分布积分为1,高斯分布线性变换依旧为高斯分布,两高斯函数乘积仍为高斯。
  • 智慧汽车—城市NOA迎爆发
  • 【Python】Pandas(学习笔记)
  • 大数据毕业设计选题推荐-机房信息大数据平台-Hadoop-Spark-Hive
  • 学习王阳明知行合一随录
  • yolov5模型代码怎么修改
  • 【剑指offer】让抽象问题具体化
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 5、React组件事件详解
  • css属性的继承、初识值、计算值、当前值、应用值
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • java取消线程实例
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • React-redux的原理以及使用
  • SpingCloudBus整合RabbitMQ
  • Theano - 导数
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • vue自定义指令实现v-tap插件
  • 记一次和乔布斯合作最难忘的经历
  • 聚簇索引和非聚簇索引
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 思维导图—你不知道的JavaScript中卷
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 原生js练习题---第五课
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 翻译 | The Principles of OOD 面向对象设计原则
  • #etcd#安装时出错
  • #if 1...#endif
  • ${factoryList }后面有空格不影响
  • (SpringBoot)第七章:SpringBoot日志文件
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)springboot教学评价 毕业设计 641310
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (学习日记)2024.02.29:UCOSIII第二节
  • .gitignore文件—git忽略文件
  • .NET开发人员必知的八个网站
  • .NET连接MongoDB数据库实例教程
  • .NET正则基础之——正则委托
  • .net中我喜欢的两种验证码
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • []T 还是 []*T, 这是一个问题
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [Angular 基础] - 指令(directives)