蓝桥杯单片机 | 特训案例【进阶06】基于PCF8591的DAC模拟电压输出

该博客介绍了一项基于CT107D单片机的实战项目,涉及IIC总线、PCF8591芯片的使用。通过编写代码,实现了数码管显示DAC输出模式和电压,包括固定电压输出和AIN3通道实时电压输出。同时,通过S4按键进行模式切换,系统在三种模式间循环。用户可使用万用表验证DAC输出电压与数码管显示的一致性。
摘要由CSDN通过智能技术生成

【1】题目要求

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

1、将IIC总线的底层驱动代码文件正确移植到工程中。

2、将J5配置BTN模式,把S4设置为独立按键,选择DAC的输出模式。

3、数码管的显示格式如下图,数码管最左边3位显示当前的DAC输出模式,数码管最右边3位显示当前DAC的输出电压,电压单位为V,保留2位小数。

4、DAC的输出模式有3种。
    模式1中,数码管左边显示“-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、使用万用表测量J31920引脚,即DAC输出电压,万用表显示的数值应与数码管右侧显示的电压基本一致。

【小提示】:

IIC接口的基本原理,可见本博客:《【蓝桥杯单片机进阶强化-01】IIC总线接口技术基础》

PCF8591的基本原理,可见本博客:《【蓝桥杯单片机进阶强化-02】PCF8591的基本原理与A/D转换应用》

【2】核心源码分析

/*==================蓝桥杯单片机特训==================
【进阶06】:基于PCF8591的DAC模拟电压输出
**平  台:CT107D单片机综合实训平台
**模  式:IO模式
**底层驱动文件:2022年竞赛资源数据包提供的文件
**设  计:欧浩源(小蜜蜂老师,ohy3686@qq.com)
**时  间:2022-04-05
**更多详见:www.xmf393.com
====================================================*/

#include "reg52.h"
#include "iic.h"

sbit S4 = P3^3;

//定义动态显示中单个数码管点亮时长
#define TSMG	500
//-------共阳数码管的段码编码表(无小数点)--------
//0 1 2 3 4 5 6 7 8 9 A B C D E F - .
unsigned char code SMG_NoDot[18]={0xc0,0xf9,
	  0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
    0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
//-------共阳数码管的段码编码表(带小数点)--------
//0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
unsigned char code SMG_Dot[10]={0x40,0x79,
		0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
//-----------------------------------------------

unsigned char adc_value = 0;		//AIN3的采样数据
float adc_volt = 0;					//AIN3的换算电压
unsigned int smg_volt = 0;			//AIN3的显示电压

unsigned char stat_smg = 1;			//当前显示界面标志
unsigned char mode = 1;				//模式

/*====锁存器设置和数码管显示的代码参考前面的案例====*/
//===================电压值显示函数===================
void DisplaySMG_ADC()
{
	//输出电压
	DisplaySMG_Bit(7,SMG_NoDot[smg_volt	% 10]);
	DisplaySMG_Bit(6,SMG_NoDot[(smg_volt / 10) % 10]);		
	DisplaySMG_Bit(5,SMG_Dot[smg_volt / 100]);				
	//工作模式
	DisplaySMG_Bit(2,SMG_NoDot[16]);
	DisplaySMG_Bit(1,SMG_NoDot[mode]);		
	DisplaySMG_Bit(0,SMG_NoDot[16]);		
}

//===============PCF8591电压采样处理函数===============
void Read_PCF8591_AIN3()
{
	IIC_Start();					
	IIC_SendByte(0x90);		//PCF8591的写设备地址 
	IIC_WaitAck();				
	IIC_SendByte(0x43); 	//输出DAC,转换AIN3			
	IIC_WaitAck();  						
	IIC_Stop(); 
	
	DisplaySMG_ADC();		//等待电压转换完成
	
	IIC_Start();									
	IIC_SendByte(0x91); 	//PCF8591的读设备地址
	IIC_WaitAck(); 								
	adc_value = IIC_RecByte();	//读出AD采样数据
	IIC_SendAck(1);			 	//产生非应答信号 								
	IIC_Stop();
	//将ADC采样到的数据换算成对应的电压值
	adc_volt = adc_value * (5.0 / 255);
	smg_volt = adc_volt * 100;
}
//===============PCF8591电压输出设置函数===============
void Set_PCF8591_DAC(unsigned char dat)
{
	IIC_Start();					
	IIC_SendByte(0x90);		//PCF8591的写设备地址 
	IIC_WaitAck();	
	IIC_SendByte(0x43); 	//输出DAC,转换AIN3	
	IIC_WaitAck(); 								
	IIC_SendByte(dat); 		//设置DAC电压输出参数
	IIC_WaitAck(); 			//产生非应答信号 								
	IIC_Stop();
}
//===================按键扫描处理函数==================
void Scan_Keys()
{
	if(S4 == 0)
	{
		DelaySMG(500);	
		if(S4 == 0)
		{
			if(mode == 1)						
			{
				mode = 2;					//切换为模式2
				Set_PCF8591_DAC(204);	    //输出固定电压4V
				smg_volt = 400;				//显示电压:4.00
			}
			else if(mode == 2)
			{
				mode = 3;					//切换为模式3
			}
			else if(mode == 3)
			{
				mode = 1;					//切换为模式1
				Set_PCF8591_DAC(102);	    //输出固定电压2V
				smg_volt = 200;				//显示电压:2.00
			}
			while(S4 == 0)					//松手检测
			{	
				DisplaySMG_ADC();			//保持数码管动态显示
			}
		}
	}
}

【注】:更多关于蓝桥杯单片机备赛内容,详见《蓝桥杯单片机设计与开发》小蜜蜂特训手册,本站可下载,相关更多蓝桥杯的案例完整源码及学习备赛笔记,欢迎进入 小蜜蜂笔记 公众号。

  • 33
    点赞
  • 155
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论
开关电源具有体积小、效率高、重量轻、噪声低等优点,其应用越来越广泛。我们在设计蓄电池充电器时,就采用开关电源作为主电路,其中开关器件采用第三代IGBT,其主要优点是耐压高,驱动功率小,开关频率高,导通电阻小。 目前,数模转换器从接口上可分为两大类:并行接口数模转换器和串行接口数模转换器。并行接口数模转换器的引脚多,体积大,占用单片机的口线多;而串行数模转换器的体积小,占用单片机的口线少。 电源设计人员经常面临种种互相对立的要求。一方面要缩小体积、降低成本,另一方面又要提供更多功能并提高输出功率。受原理上的限制,模拟电源本身的功能有限,而模拟电源控制器的设计更是越来越复杂。由于这一原因,有些设计人员转向了纯数字电源设计。然而,对于许多设计人员来说,如此快速地转向不熟悉的领域并不容易。比较可行的一种折衷方法是采用传统模拟电源,但增加数字单片机做为前端。 这种设计的优点在于电源本身的控制仍然使用模拟技术来实现。因此电源设计人员不需要从头重新开始全数字设计就可以为现有设计增加新的功能。采用这种方法,设计中仍然使用熟悉的误差放大器、电流检测以及电压检测电路。当然,尽管有些设计单元(如补偿网络)仍然采用分立器件实现,但其余部分则由单片机来控制。 单片机能够带来的功能可分为四类:控制、监测、判断性功能及通信。控制功能与单片机和电源之间的硬件接口有关。有些电源控制器在内部生成控制信号(如参考电压)。这样的控制器为单片机提供的外部连接点很少。 目前,单片机在许多电源设计中的作用主要是监测。许多单片机都有片上模数转换器(ADC)和模拟比较器。因此,单片机在监测输入电压、输入电流、输出电压输出电压和温度等信号方面是理想之选。 单片机能够监测范围如此广泛的信号,就可以完成更多功能,如智能故障检测。单片机的多功能源于其可编程能力,可以方便地进行定制来满足设计要求。这样,对于故障情况就可以分类进行处理。短暂的过流以及其他非关键故障可能只需要设置一个标志就可以了。而过热这样的故障则可能需要关闭电源,直到故障排除。需要重新启动电源的故障也可以进行更严格的控制。在某个时间段内如果有太多的故障,单片机就可以永久关断电源。 由于采用接口简单的模拟数字转换器TLC5615,使得开关电源的硬件电路大为简化,线路板面积缩小,成本降低。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蜜蜂老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值