Blue Bridge Cup MCU | Mallette de formation spéciale [Advanced 06] Sortie de tension analogique DAC basée sur PCF8591

【1】Exigences du titre

Créez un nouveau projet, écrivez du code en mode E/S et implémentez les fonctions suivantes sur la plate-forme de formation complète du microcontrôleur CT107D :

1. Transplantez correctement le fichier de code de pilote sous-jacent du bus IIC dans le projet.

2. Configurez J5 en mode BTN , définissez S4 comme bouton indépendant et sélectionnez le mode de sortie du DAC.

3. Le format d'affichage du tube numérique est comme indiqué dans la figure ci-dessous. Les 3 chiffres les plus à gauche du tube numérique affichent le mode de sortie DAC actuel, et les 3 chiffres les plus à droite du tube numérique affichent la tension de sortie DAC actuelle. La tension l'unité est V et 2 décimales sont réservées.

4. Il existe trois modes de sortie du DAC.
    En mode 1 , le côté gauche du tube numérique affiche « -1- », et le DAC produit une tension fixe de 2,00 V.
    En mode 2 , le côté gauche du tube numérique affiche « -2- », et le DAC produit une tension fixe de 4,00 V.
    En mode 3 , le côté gauche du tube numérique affiche " -3- ", le côté droit du tube numérique affiche la tension d'entrée en temps réel du canal AIN3 de la puce PCF8591 , et cette tension est utilisée comme paramètre de sortie du DAC, de sorte que la tension de sortie du DAC et la tension d'entrée du canal AIN3 de la puce PCF8591 Pour conserver le changement synchrone, la tension de sortie du DAC peut être modifiée en modifiant la résistance réglable de Rb2 .

5. Une fois le système sous tension, il fonctionne en mode 1. Appuyez sur le bouton S4 en mode 1 pour accéder au mode 2 ; appuyez sur le bouton S4 en mode 2 pour accéder au mode 3 ; appuyez sur le bouton S4 en mode 3 pour revenir au mode 1, et ainsi de suite.

6. Utilisez un multimètre pour mesurer les broches 19 et 20 de J3 , c'est-à-dire la tension de sortie du DAC.La valeur affichée par le multimètre doit être fondamentalement la même que la tension affichée sur le côté droit du tube numérique.

【indice】:

Le principe de base de l'interface IIC peut être vu dans ce blog : "[Blue Bridge Cup MCU Advanced Strengthening-01] IIC Bus Interface Technology Basics" .

Le principe de base du PCF8591 peut être vu dans ce blog : "[Blue Bridge Cup MCU Advanced Enhancement-02] Principe de base et application de conversion A/N du PCF8591"

[2] Analyse du code source principal

/*==================蓝桥杯单片机特训==================
【进阶06】:基于PCF8591的DAC模拟电压输出
**平  台:CT107D单片机综合实训平台
**模  式:IO模式
**底层驱动文件:2022年竞赛资源数据包提供的文件
**设  计:欧浩源(小蜜蜂老师,[email protected])
**时  间: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();			//保持数码管动态显示
			}
		}
	}
}

[Remarque] : pour plus d'informations sur le contenu de préparation du MCU Blue Bridge Cup, veuillez vous référer au manuel de formation spécial Little Bee « Blue Bridge Cup MCU Design and Development » , qui peut être téléchargé à partir de ce site, et plus d'informations sur le boîtier Blue Bridge Cup. code source complet et préparations d'étude Notes de compétition, bienvenue sur le compte officiel de  " Little Bee Notes "  .

Je suppose que tu aimes

Origine blog.csdn.net/ohy3686/article/details/123969207
conseillé
Classement