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

ops/2024/12/13 1:30:27/

所有仿真详情导航:

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  intsbit 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,控制LEDfor (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.ppmy.cn/ops/141393.html

相关文章

SpringBoot3

1. 配置文件 1. 基本使用 使用 配置文件classpath:application.properties spring.jdbc.drivercom.mysql.cj.jdbc.Driver spring.jdbc.urljdbc:mysql://localhost:3306/batis spring.jdbc.usernameroot spring.jdbc.password123456使用配置文件的值&#xff1a;Value("…

鸿蒙分享(五):axios网络请求+简单封装

代码仓库&#xff1a;share_harmonyos: 鸿蒙分享 鸿蒙api:12 axios开源库地址&#xff1a;OpenHarmony三方库中心仓 1.axios使用 1.安装 ohpm install ohos/axios 2.添加网络权限 common--src--module.json5 添加如下: "requestPermissions": [{"name&quo…

ZED相机应用

下载SDK wget https://stereolabs.sfo2.cdn.digitaloceanspaces.com/zedsdk/3.6/ZED_SDK_Ubuntu18_cuda11.5_v3.6.5.run 安装 ./ZED_SDK_Ubuntu18_cuda11.5_v3.6.5.run skip_python 测试 cd /usr/local/zed/tools ls ZED_Calibration ZED_Depth_Viewer ZED_Diagnostic ZED_E…

C++设计模式(建造者、中介者、备忘录)

一、建造者模式 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 示例&#xff1a; //房子&#xff08;产品类&#xff09; class House { private:int rooms;int windows;string decoration; public:void setRooms(int r) {rooms …

单片机+Qt上位机

目录 一、引言 通信方式 优势 案例 常见问题及解决方法 二、单片机与 Qt 上位机的通信方式 &#xff08;一&#xff09;使用 QT 上位机和 STC 单片机实现串口通信 三、单片机 Qt 上位机的优势 &#xff08;一&#xff09;高效便捷的 USB 通信上位机解决方案 &#xf…

鸿蒙高级开发者认证试题(基础)

目录 一、单选题&#xff08;每题 3 分&#xff0c;共 30 分&#xff09; 二、多选题&#xff08;每题 5 分&#xff0c;共 30 分&#xff09; 以下是一份鸿蒙高级开发者认证试题示例&#xff0c;涵盖了鸿蒙开发相关的多个重要知识点&#xff0c;你可以根据实际情况进行调整和…

数据分析岗位求职攻略 —— 常见面试题目及答案

请简要介绍一下数据分析的过程和方法。 答&#xff1a;数据分析过程通常包括数据采集、数据清理、数据探索、数据建模、和优化模型等步骤。在这个过程中&#xff0c;需要运用统计学、机器学习、数据挖掘、数据可视化等技术方法分析数据的特征&#xff0c;实现数据服务化。 请…

事务的传播机制

事务传播机制的概念&#xff1a; 事务传播机制就是: 多个事务⽅法存在调⽤关系时, 事务是如何在这些⽅法间进⾏传播的。 在我们学习数据库的时候&#xff0c;不存在事务传播机制这个概念&#xff0c;因为数据库是直接执行这个方法而不是有方法之间的互相调用&#xff0c;在我们…