63 基于单片机的四个速度比较

news2025/4/20 2:15:25

所有仿真详情导航:

PROTEUS专栏说明-CSDN博客

目录

一、主要功能

二、硬件资源

三、主程序编程

四、资源下载


一、主要功能

        基于51单片机,采用四个滑动变阻器连接数模转换器模拟四个速度值,通过LCD1602显示,然后检测出最高的值,其他三个与之相减,绝对值小于10的速度找出,这时候采用四个LED灯分别对应四个速度,绝对值小于10的速度对应的状态灯亮起

具体动态效果看B站演示视频(高清需要跳转到B站看)

基于单片机的四个速度比较_哔哩哔哩_bilibili

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

三、主程序编程

#include <REGX52.H>
#include<intrins.h>
#include<stdio.h>
#include <stdlib.h>
#include "Delay.h"
#include "LCD1602.h"
#define uchar unsigned char
#define uint unsigned  int

sbit ADC_CS=P2^5;                 //adc0832引脚
sbit ADC_CLK=P2^6;
sbit ADC_DI=P2^7;
sbit ADC_DO=P2^4;
sbit ADC_CS1=P1^0;                 //adc0832引脚
sbit ADC_CLK1=P1^1;
sbit ADC_DI1=P1^2;
sbit ADC_DO1=P1^3;
sbit s1led = P3^5;
sbit s2led = P3^6;
sbit s3led = P3^7;
sbit s4led = P2^3;
static double u,u1,u2,u3;      //定义浓度变量
uchar get_AD_Res()            //ADC0832启动读取函数
{
	 unsigned char i,ch;

ADC_CS=0; //片选,DO为高阻态
ADC_DO=0;
Delay(2);

ADC_CLK=0;
Delay(2);
ADC_DI=1;
ADC_CLK=1;//第一个脉冲,起始位
Delay(2);

ADC_CLK=0;
Delay(2);
ADC_DI=1;
ADC_CLK=1;//第二个脉冲,DI=1表示双通道单极性输入
Delay(2);

ADC_CLK=0;
Delay(2);
ADC_DI=0; //第三个脉冲,DI=1表示选择通道1(CH2),DI=0时选择通0(CH1)
ADC_CLK=1;
Delay(2);

ADC_DI=0; //DI转为高阻态,失去输入意义;
ADC_DO=1; //DO脱离高阻态为输出数据作准备

ADC_CLK=1;
Delay(2);
ADC_CLK=0; //第一个下降沿,为去数准备;
Delay(2); //这里加一个脉冲AD才能正确读出数据,不加的话读出的数据少一位,且是错的。

for (i=0; i<8; i++) //读取数据
    {
    ADC_CLK=1;
    Delay(2);
    ADC_CLK=0;
    Delay(2);
    ch=(ch<<1)|ADC_DO;//在每个脉冲的下降沿DO输出一位数据,最终ch为8位二进制数
   }
  
     ADC_CS=1;//取消片选,一个转换周期结束
   return(ch);//把转换结果返回
}

uchar get_AD_Res_CH1() // 读取CH1端口的AD值
{
    	 unsigned char i,ch;

ADC_CS=0; //片选,DO为高阻态
ADC_DO=0;
Delay(2);

ADC_CLK=0;
Delay(2);
ADC_DI=1;
ADC_CLK=1;//第一个脉冲,起始位
Delay(2);

ADC_CLK=0;
Delay(2);
ADC_DI=1;
ADC_CLK=1;//第二个脉冲,DI=1表示双通道单极性输入
Delay(2);

ADC_CLK=0;
Delay(2);
ADC_DI=1; //第三个脉冲,DI=1表示选择通道1(CH2),DI=0时选择通0(CH1)
ADC_CLK=1;
Delay(2);

ADC_DI=0; //DI转为高阻态,失去输入意义;
ADC_DO=1; //DO脱离高阻态为输出数据作准备

ADC_CLK=1;
Delay(2);
ADC_CLK=0; //第一个下降沿,为去数准备;
Delay(2); //这里加一个脉冲AD才能正确读出数据,不加的话读出的数据少一位,且是错的。

for (i=0; i<8; i++) //读取数据
    {
    ADC_CLK=1;
    Delay(2);
    ADC_CLK=0;
    Delay(2);
    ch=(ch<<1)|ADC_DO;//在每个脉冲的下降沿DO输出一位数据,最终ch为8位二进制数
   }
  
     ADC_CS=1;//取消片选,一个转换周期结束
   return(ch);//把转换结果返回
}


uchar get_AD_Res1()            //ADC0832启动读取函数
{
	 unsigned char i,ch;

ADC_CS1=0; //片选,DO为高阻态
ADC_DO1=0;
Delay(2);

ADC_CLK1=0;
Delay(2);
ADC_DI1=1;
ADC_CLK1=1;//第一个脉冲,起始位
Delay(2);

ADC_CLK1=0;
Delay(2);
ADC_DI1=1;
ADC_CLK1=1;//第二个脉冲,DI=1表示双通道单极性输入
Delay(2);

ADC_CLK1=0;
Delay(2);
ADC_DI1=0; //第三个脉冲,DI=1表示选择通道1(CH2),DI=0时选择通0(CH1)
ADC_CLK1=1;
Delay(2);

ADC_DI1=0; //DI转为高阻态,失去输入意义;
ADC_DO1=1; //DO脱离高阻态为输出数据作准备

ADC_CLK1=1;
Delay(2);
ADC_CLK1=0; //第一个下降沿,为去数准备;
Delay(2); //这里加一个脉冲AD才能正确读出数据,不加的话读出的数据少一位,且是错的。

for (i=0; i<8; i++) //读取数据
    {
    ADC_CLK1=1;
    Delay(2);
    ADC_CLK1=0;
    Delay(2);
    ch=(ch<<1)|ADC_DO1;//在每个脉冲的下降沿DO输出一位数据,最终ch为8位二进制数
   }
  
     ADC_CS1=1;//取消片选,一个转换周期结束
   return(ch);//把转换结果返回
}

uchar get_AD_Res_CH11() // 读取CH1端口的AD值
{
    	 unsigned char i,ch;

ADC_CS1=0; //片选,DO为高阻态
ADC_DO1=0;
Delay(2);

ADC_CLK1=0;
Delay(2);
ADC_DI1=1;
ADC_CLK1=1;//第一个脉冲,起始位
Delay(2);

ADC_CLK1=0;
Delay(2);
ADC_DI1=1;
ADC_CLK1=1;//第二个脉冲,DI=1表示双通道单极性输入
Delay(2);

ADC_CLK1=0;
Delay(2);
ADC_DI1=1; //第三个脉冲,DI=1表示选择通道1(CH2),DI=0时选择通0(CH1)
ADC_CLK1=1;
Delay(2);

ADC_DI1=0; //DI转为高阻态,失去输入意义;
ADC_DO1=1; //DO脱离高阻态为输出数据作准备

ADC_CLK1=1;
Delay(2);
ADC_CLK1=0; //第一个下降沿,为去数准备;
Delay(2); //这里加一个脉冲AD才能正确读出数据,不加的话读出的数据少一位,且是错的。

for (i=0; i<8; i++) //读取数据
    {
    ADC_CLK1=1;
    Delay(2);
    ADC_CLK1=0;
    Delay(2);
    ch=(ch<<1)|ADC_DO1;//在每个脉冲的下降沿DO输出一位数据,最终ch为8位二进制数
   }
  
     ADC_CS1=1;//取消片选,一个转换周期结束
   return(ch);//把转换结果返回
}

void main()					  //主函数
{	
	int values[4];
  int max_value;
	int i;
	s1led = 0;
	s2led = 0;
	s3led = 0;
	s4led = 0;
	LCD_Init();         //显示屏初始化
	LCD_ShowString(1,1,"1:");//显示
	LCD_ShowString(1,7,"2:");
	LCD_ShowString(2,1,"3:");
	LCD_ShowString(2,7,"4:");
	while(1)
	{
	    u=get_AD_Res();
		  u=u/255*100;
			u1=get_AD_Res_CH1();
		  u1=u1/255*100;
			u2=get_AD_Res1();
		  u2=u2/255*100;
			u3=get_AD_Res_CH11();
		  u3=u3/255*100;
				
		  values[0]=u;
		  values[1]=u1;
			values[2]=u2;
			values[3]=u3;
		
		  max_value = values[0];
    for (i = 1; i < 4; i++)
		{
        if (values[i] > max_value)
					{
            max_value = values[i];
          }
				}
		LCD_ShowNum(1,14,max_value,3);
		
	
		  LCD_ShowNum(1,3,u,3);
	    LCD_ShowNum(1,9,u1,3); 
			LCD_ShowNum(2,3,u2,3);
	    LCD_ShowNum(2,9,u3,3); 
				
				
				 // 判断剩余值与最大值的差值是否大于30,控制LED
        for (i = 0; i < 4; i++) {
            if (abs(values[i] - max_value) > 30) {
                // 对应LED亮
                if (i == 0) {
                    s1led = 1;
                } else if (i == 1) {
                    s2led = 1;
                } else if (i == 2) {
                    s3led = 1;
                } else if (i == 3) {
                    s4led = 1;
                }
            } else {
                // 对应LED灭
                if (i == 0) {
                    s1led = 0;
                } else if (i == 1) {
                    s2led = 0;
                } else if (i == 2) {
                    s3led = 0;
                } else if (i == 3) {
                    s4led = 0;
                }
            }
        }
		
		  
	}
	
	
}



四、资源下载

全部资料(源程序、仿真文件、安装包、演示视频):
链接: https://pan.baidu.com/s/1mPGnG9dU8bJ2l5sTD7apnw?pwd=zejf 提取码: zejf 
--来自百度网盘超级会员v4的分享

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

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

相关文章

4.模块化技术之子程序

总学习目录请点击下面连接 SAP ABAP开发从0到入职&#xff0c;冷冬备战-CSDN博客 目录 ​编辑 1.模块化基础和概述 使用模块化有什么好处 两大类模块化技术 程序局部的模块化 SAP系统内全局模块化 封装有什么好处&#xff1f; 2.子程序模块化 三种传递类型 子程序结构…

利用Python实现子域名简单收集

免责申明 本文仅是用于学习研究子域名信息收集&#xff0c;请勿用在非法途径上&#xff0c;若将其用于非法目的&#xff0c;所造成的一切后果由您自行承担&#xff0c;产生的一切风险和后果与笔者无关&#xff1b;本文开始前请认真详细学习《‌中华人民共和国网络安全法》【学法…

k8s,进一步理解Pod

比如&#xff0c;凡是调度、网络、存储&#xff0c;以及安全相关的属性&#xff0c;基本上是Pod 级别的。 这些属性的共同特征是&#xff0c;它们描述的是“机器”这个整体&#xff0c;而不是里面运行的“程序”。比如&#xff0c;配置这个“机器”的网卡&#xff08;即&#…

Unity 使用LineRenderer制作模拟2d绳子

效果展示&#xff1a; 实现如下&#xff1a; 首先&#xff0c;直接上代码&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;public class LineFourRender : MonoBehaviour {public Transform StartNode;public Transform MidNod…

博物馆导览系统方案(一)背景需求分析与核心技术实现

维小帮提供多个场所的室内外导航导览方案&#xff0c;如需获取博物馆导览系统解决方案可前往文章最下方获取&#xff0c;如有项目合作及技术交流欢迎私信我们哦~撒花&#xff01; 一、博物馆导览系统的背景与市场需求 在数字化转型的浪潮中&#xff0c;博物馆作为文化传承和知…

14.在 Vue 3 中使用 OpenLayers 自定义地图版权信息

在 WebGIS 开发中&#xff0c;默认的地图服务通常会带有版权信息&#xff0c;但有时候我们需要根据项目需求自定义版权信息或添加额外的版权声明。在本文中&#xff0c;我们将基于 Vue 3 的 Composition API 和 OpenLayers&#xff0c;完成自定义地图版权信息的实现。 最终效果…

详解下c语言中的typedef

相信学习过c语言的很多同学都对typedef很陌生&#xff0c;感觉它离自己很遥远&#xff0c;自己很少用到。但实际上&#xff0c;我们看很多地方&#xff0c;包括很多大神级别的代码中&#xff0c;它却又经常使用。今天我们就详细描述下它&#xff0c;使我们对它有一个更深的认识…

19. Three.js案例-创建一个带有纹理映射的旋转平面

19. Three.js案例-创建一个带有纹理映射的旋转平面 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染场景的主要类。它利用 WebGL 技术在浏览器中绘制 3D 图形。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersobj…

Ensemble Learning via Knowledge Transfer for CTR Prediction 论文阅读

Abstract:点击率&#xff08;CTR&#xff09;预测在推荐系统和网络搜索中起着关键作用。虽然许多现有的方法利用集成学习来提高模型性能&#xff0c;但它们通常将集成限制在两个或三个子网络中&#xff0c;很少探索更大的集成。在本文中&#xff0c;我们研究了更大的集成网络&a…

苍穹外卖项目练习总结

做这个练习项目已经接近两年之久&#xff0c;现在拿出来复习一遍&#xff0c;主要就是里面处理问题的流程&#xff0c;以及整体思考的逻辑需要重新回顾一遍&#xff0c;后续会逐渐总结这一段时间以来学习到的知识。 项目整体包含两部分&#xff0c;一个是管理端&#xff0c;一…

数学拯救世界(三)———破魔

题目一&#xff1a; 还记不记得&#xff0c;出现带分数的话可以怎么办&#xff1f; 题目二&#xff1a; 还记不记得&#xff0c;昨天讲的重叠数 题目三&#xff1a; 提公因数&#xff0c;抓住问题本质 题目四&#xff1a;

JAVA |日常开发中连接Sqlite数据库详解

JAVA &#xff5c;日常开发中连接Sqlite数据库详解 前言一、SQLite 数据库概述1.1 定义与特点1.2 适用场景 二、Java 连接 SQLite 数据库的准备工作2.1 添加 SQLite JDBC 驱动依赖2.2 了解 JDBC 基础概念 三、建立数据库连接3.1 代码示例3.2 步骤解析 四、执行 SQL 语句4.1 创建…

对 JavaScript 说“不”

JavaScript编程语言历史悠久&#xff0c;但它是在 1995 年大约一周内创建的。 它最初被称为 LiveScript&#xff0c;但后来更名为 JavaScript&#xff0c;以赶上 Java 的潮流&#xff0c;尽管它与 Java 毫无关系。 它很快就变得非常流行&#xff0c;推动了 Web 应用程序革命&…

解谜类游戏《迷失岛2》等如何抽象出一套通用高效开发框架?

解谜类游戏以精妙的谜题设计和引人入胜的故事叙述为特点&#xff0c;考验着玩家的智慧与观察力。《迷失岛2》与《南瓜先生2九龙城寨》正是这一领域的佳作。游戏以独特的艺术风格和玩法设计吸引了大量玩家&#xff0c;而它们背后隐藏着一套强大的框架。 上海胖布丁游戏的技术总…

CID引流电商

ClickID技术是基于多家媒体平台开发的电商引流服务&#xff0c;通过媒体提供的宏参数&#xff0c;间接解决电商平台订单数据的回传问题&#xff0c;帮助账户收集到极致精准的数据模型&#xff0c;搭建不同媒体往各平台引流的桥梁。简单来说就是通过ClickID数据监测到另外一个平…

保姆级教程Docker部署Redis镜像

目录 1、创建挂载目录和配置文件 2、运行Redis镜像 3、查看redis运行状态 1、创建挂载目录和配置文件 # 创建宿主机Redis配置文件存放目录 sudo mkdir -p /data/docker/redis/conf# 创建Redis配置文件 cd /data/docker/redis/conf sudo touch redis.conf 到Github上找到Redi…

如何将快捷指令添加到启动台

如何将快捷指令添加到启动台/Finder/访达&#xff08;Mac&#xff09; 1. 打开快捷指令创建快捷指令 示例创建了一个文件操作测试的快捷指令。 2. 右键选择添加到程序坞 鼠标放在待添加的快捷指令上。 3. 右键添加到访达 鼠标放在待添加的快捷指令上。 之后就可以在启…

【AI学习】Mamba学习(二十):Mamba是一种线性注意力

论文《Demystify Mamba in Vision: A Linear Attention Perspective 》从线性注意力的视角&#xff0c;对Mamba 进行了阐释。 论文名称&#xff1a;Demystify Mamba in Vision: A Linear Attention Perspective (Arxiv 2024.05) 论文地址&#xff1a;https://arxiv.org/pdf/24…

Bootstrap-HTML(三)Bootstrap5列表组全解析

Bootstrap-HTML&#xff08;三&#xff09;Bootstrap5列表组全解析 前言&#xff08;一&#xff09;HTML 列表基础回顾1.无序列表2.有序列表3.定义列表 二、无样式的有序列表和无序列表内联列表 三、Bootstrap5 列表组1.基础的列表组2.设置禁用和活动项3.链接项的列表组4.移除列…