蓝桥杯单片机快速开发笔记——PCF8591的DAC模拟电压输出

news2024/9/22 7:40:21

一、原理分析

        PCF8591电压信号探测器:http://t.csdnimg.cn/R38tC

        IIC原理:http://t.csdnimg.cn/v4dSv

        IIC指令:http://t.csdnimg.cn/RY6yi

       HC573/HC138:http://t.csdnimg.cn/W0a0U

        数码管:http://t.csdnimg.cn/kfm9Y

        独立键盘:http://t.csdnimg.cn/YPInc

二、思维导通

6ae47acad66c4bb5a0d3b71bb48966cb.png

三、示例例程

        1、题目要求:

        在新建的工程中,采用I/O模式编写代码,针对CT107D单片机综合训练平台,实现以下功能:

  1. 移植IIC总线的底层驱动代码文件至工程中。
  2. 配置J5为BTN模式,将S4设置为独立按键,并选择DAC的输出模式。
  3. 数码管显示格式如下:最左侧3位显示当前的DAC输出模式,最右侧3位显示当前DAC的输出电压,电压单位为V,保留2位小数。
  4. DAC的输出模式包括三种:
    • 模式1:显示“- -”,DAC输出固定电压为2.00V。
    • 模式2:显示“-2-”,DAC输出固定电压为4.00V。
    • 模式3:显示“-3-”,右侧显示PCF8591芯片AIN3通道的实时输入电压,并将该电压作为DAC的输出参数,实现DAC输出电压与PCF8591芯片AIN3通道输入电压同步变化。通过调节Rb2可调电阻,可改变DAC的输出电压。
  5. 系统上电后,默认工作在模式1。在模式1中按下S4按键,切换至模式2;在模式2中按下S4按键,切换至模式3;在模式3中按下S4按键,重新回到模式1,如此循环。
  6. 使用万用表测量J3的19和20引脚,即DAC输出电压,确保万用表显示的数值与数码管右侧显示的电压基本一致。

        2.示例代码

        

#include "stc15.h"
#include "iic.h"

#define TSMG 500
#define TKEY 200

sbit s4 = P3^3;

unsigned char stat = 1;     //模式
unsigned int smg_v = 200;   //数码管显示电压
unsigned int ain3 = 0;      //通道3数值

void delay_smg(unsigned int t)
{
	while(t--);
}

void delay_key(unsigned int t)
{
	while(t--);
}

code unsigned char Seg_Table[] = 
{
	0xc0, //0
	0xf9, //1
	0xa4, //2
	0xb0, //3
	0x99, //4
	0x92, //5
	0x82, //6
	0xf8, //7
	0x80, //8
	0x90, //9
	0x88, //A
	0x83, //b
	0xc6, //C
	0xa1, //d
	0x86, //E
	0x8e //F
};

code unsigned char Seg_DotTable[] = 
{
	0x40, //0
	0x79, //1
	0x24, //2
	0x30, //3
	0x19, //4
	0x12, //5
	0x02, //6
	0x78, //7
	0x00, //8
	0x10  //9
};
//控制所有数码管
void smg_all(unsigned dat)
{
	hc573(6,0xff);
	hc573(7,dat);
}

//单个数码管设置
void smg_bit(unsigned char channel, unsigned dat)
{
	hc573(6,0x01 << channel);
	hc573(7,dat);
	delay_smg(TSMG);
	hc573(6,0x01 << channel);
	hc573(7,0xff);
}
//数码管显示函数
void smg_dispay()
{
	smg_bit(0, 0xbf);
	smg_bit(1, Seg_Table[stat]);
	smg_bit(2, 0xbf);
	
	smg_bit(5, Seg_DotTable[smg_v / 100]);
	smg_bit(6, Seg_Table[(smg_v / 10) % 10]);
	smg_bit(7, Seg_Table[smg_v % 10]);
}

//读取AIN3实时输入电压
void read_pcf8591_ain3()
{
	unsigned int temp = 0;
	float v = 0;
	
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x43);	//输出DAC,转换AIN3
	I2CWaitAck();
	I2CStop();
	smg_dispay();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	temp = I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	
	v = temp * (5.0 / 255);
	ain3 = v * 100;
}
//输出电压函数
void out_pcf8591(unsigned int dat)
{
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x43);	//输出DAC,转换AIN3
	I2CWaitAck();
	I2CSendByte(dat);
	I2CWaitAck();
	I2CStop();
}

//系统初始化函数
void init_sys()
{
	hc573(5, 0x00);  //关闭蜂鸣器继电器
	hc573(4, 0xff);  //熄灭LED
	smg_all(0xff);   //熄灭所有数码管
	out_pcf8591(102);	//输出2.00V
	
}

//键盘扫描函数
void scan_key()
{
	if(s4 == 0)
	{
		delay_key(TKEY);
		if(s4 == 0)
		{
			switch(stat)
			{
				case 1:
					//当处于模式2时
					stat++;
					out_pcf8591(204);  //输出4V电压
					smg_v = 400;
				break;
				
				case 2:
					stat++;
				break;
				
				case 3:
					//当处于模式3时
					stat = 1;
					out_pcf8591(102);  //输出2V电压
					smg_v = 200;
				break;
			}
			
			
			while(s4 == 0)
			{
				smg_dispay();
			}
		}
	}
}


void main()
{
	init_sys();  	
	
	while(1)
	{
		if(stat == 3)  //当处于模式3时
		{
			read_pcf8591_ain3();
			smg_v = ain3;
			out_pcf8591(ain3);
		}
		
	  scan_key();
	  smg_dispay();
	}
}

 

 

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

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

相关文章

jmeter总结之:Regular Expression Extractor元件

Regular Expression Extractor是一个后处理器元件&#xff0c;使用正则从服务器的响应中提取数据&#xff0c;并将这些数据保存到JMeter变量中&#xff0c;以便在后续的请求或断言中使用。在处理动态数据或验证响应中的特定信息时很有用。 添加Regular Expression Extractor元…

实时数仓之实时数仓架构(Hudi)

目前比较流行的实时数仓架构有两类&#xff0c;其中一类是以FlinkDoris为核心的实时数仓架构方案&#xff1b;另一类是以湖仓一体架构为核心的实时数仓架构方案。本文针对FlinkHudi湖仓一体架构进行介绍&#xff0c;这套架构的特点是可以基于一套数据完全实现Lambda架构。实时数…

20232831 2023-2024-2 《网络攻防实践》第4次作业

目录 20232831 2023-2024-2 《网络攻防实践》第4次作业1.实验内容2.实验过程&#xff08;1&#xff09;ARP缓存欺骗攻击&#xff08;2&#xff09;ICMP重定向攻击&#xff08;3&#xff09;SYN Flood攻击&#xff08;4&#xff09;TCP RST攻击&#xff08;5&#xff09;TCP会话…

ocr之opencv配合paddleocr提高识别率

背景1&#xff1a;在这篇文章编写之前使用到的工具并不是opencv&#xff0c;而是java原有的工具BufferedImage。但因为在使用过程中会频繁切图&#xff0c;放大&#xff0c;模糊&#xff0c;所以导致的jvm内存使用量巨大&#xff0c;分秒中都在以百兆的速度累加内存空间。这种情…

docker可视化界面 - portainer安装

目录 一、官方安装说明 二、安装portainer 2.1拉取镜像 2.2运行portainer容器 2.3登录和使用portainer 一、官方安装说明&#xff1a; Install PortainerChoose to install Portainer Business Edition or Portainer Community Edition.https://www.portainer.io/install…

本地部署大模型的几种工具(上-相关使用)

目录 前言 为什么本地部署 目前的工具 vllm 介绍 下载模型 安装vllm 运行 存在问题 chatglm.cpp 介绍 下载 安装 运行 命令行运行 webdemo运行 GPU推理 ollama 介绍 下载 运行 运行不同参数量的模型 存在问题 lmstudio 介绍 下载 使用 下载模型文件…

OSCP靶场--plum

OSCP靶场–plum 考点(CVE-2022-25018 linux邮箱信息收集提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -Pn -sC -sV 192.168.178.28 --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-28 05:41 EDT Nmap scan report for 192.168.178.2…

第十二章 微服务核心(一)

一、Spring Boot 1.1 SpringBoot 构建方式 1.1.1 通过官网自动生成 进入官网&#xff1a;https://spring.io/&#xff0c;点击 Projects --> Spring Framework&#xff1b; 拖动滚动条到中间位置&#xff0c;点击 Spring Initializr 或者直接通过 https://start.spring…

【项目技术介绍篇】若依管理系统功能介绍

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

RTOS线程切换的过程和原理

0 前言 RTOS中最重要的一个概念就是线程&#xff0c;线程的按需切换能够满足RTOS的实时性要求&#xff0c;同时能将复杂的需求分解成一个个线程执行减轻我们开发负担。 本文从栈的角度出发&#xff0c;详细介绍RTOS线程切换的过程和原理。 注&#xff1a;本文参考的RTOS是RT-T…

硬件项目中的turn-key 是啥意思?案例应用

在硬件项目中&#xff0c;turn-key是指一种工程项目模式&#xff0c;即交钥匙工程。这种模式通常由独立的第三方软件厂商直接与芯片厂商合作&#xff0c;基于芯片厂商的硬件方案和协议&#xff0c;集成成熟的上层软件和应用&#xff0c;并整套提供给电子产品生产厂商。这种模式…

实现DevOps需要什么?

实现DevOps需要什么&#xff1f; 硬性要求&#xff1a;工具上的准备 上文提到了工具链的打通&#xff0c;那么工具自然就需要做好准备。现将工具类型及对应的不完全列举整理如下&#xff1a; 代码管理&#xff08;SCM&#xff09;&#xff1a;GitHub、GitLab、BitBucket、SubV…

UE小:基于UE5的两种Billboard material(始终朝向相机材质)

本文档展示了两种不同的效果&#xff0c;分别是物体完全朝向相机和物体仅Z轴朝向相机。通过下面的演示和相关代码&#xff0c;您可以更加直观地理解这两种效果的差异和应用场景。 1. 完全朝向相机效果 此效果下&#xff0c;物体将完全面向相机&#xff0c;不论相机在哪个角度…

语音陪玩交友软件系统程序-app小程序H5三端源码交付,支持二开!

电竞行业的发展带动其周边产业的发展&#xff0c;绘制着游戏人物图画的抱枕、鼠标垫、海报销量极大&#xff0c;电竞游戏直播、游戏教程短视频也备受人们喜爱&#xff0c;自然&#xff0c;像游戏陪练、代练行业也随之生长起来&#xff0c;本文就来讲讲&#xff0c;从软件开发角…

阿里云服务器多少钱一年?阿里云价格表新鲜出炉4月最新报价

2024年阿里云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网aliyunfuwuqi.com整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新…

PHP开发全新29网课交单平台源码修复全开源版本,支持聚合登陆易支付

这是一套最新版本的PHP开发的网课交单平台源代码&#xff0c;已进行全开源修复&#xff0c;支持聚合登录和易支付功能。 项目 地 址 &#xff1a; runruncode.com/php/19721.html 以下是对该套代码的主要更新和修复&#xff1a; 1. 移除了论文编辑功能。 2. 移除了强国接码…

Linux(CentOS)/Windows-C++ 云备份项目(客户端文件操作类,数据管理模块设计,文件客户端类设计)

文章目录 1. 客户端文件操作类2. 客户端数据管理模块设计3. 文件客户端类设计项目代码 客户端负责的功能 指定目录的文件检测&#xff0c;获取文件夹里面的文件 判断这个文件是否需要备份&#xff0c;服务器备份过的文件则不需要进行备份&#xff0c;已经备份的文件如果修改也…

纯分享万岳外卖跑腿系统客户端源码uniapp目录结构示意图

系统买的是商业版&#xff0c;使用非常不错有三端uniapp开源代码&#xff0c;自从上次分享uniapp后有些网友让我分享下各个端的uniapp下的各个目录结构说明 我就截图说以下吧&#xff0c;

【python】网络编程socket TCP UDP

文章目录 socket常用方法TCP客户端服务器UDP客户端服务器网络编程就是实现两台计算机的通信 互联网协议族 即通用标准协议,任何私有网络只要支持这个协议,就可以接入互联网。 socket socke模块的socket()函数 import socketsock = socket.socket(Address Family, type)参…

网络套接字补充——UDP网络编程

五、UDP网络编程 ​ 1.对于服务器使用智能指针维护生命周期&#xff1b;2.创建UDP套接字&#xff1b;3.绑定端口号&#xff0c;包括设置服务器端口号和IP地址&#xff0c;端口号一般是2字节使用uint16_t&#xff0c;而IP地址用户习惯使用点分十进制格式所以传入的是string类型…