ブルーブリッジカップMCU|特別トレーニングケース[Advanced05]フォトレジスターと調整可能な抵抗器の電圧のサンプリング

【1】タイトル要件

新しいプロジェクトを作成し、I / Oモードでコードを記述し、CT107DMCU包括的なトレーニングプラットフォームに次の機能を実装します。

1.IICバスの基になるドライバーコードファイルをプロジェクトに正しく移植します。

2.フォトレジスタrd1はPCF8591AIN1チャネルに接続され、調整可能な抵抗rb2はPCF8591のAIN3チャネルに接続されます。

3.システムの電源を入れた後、AIN1チャネルとAIN3チャネルの電圧が周期的にサンプリングされ、A / D変換結果が読み取られ、対応する実際の電圧値に変換され、小数点以下2桁が予約されます。 Vです。

4.サンプリングしたリアルタイム電圧値をデジタルチューブに表示します。表示形式は図のようになります。デジタルチューブの左端の3桁は、AIN1チャネル、つまりサンプリングの電圧値を表示します。フォトレジスターrd1。デジタルチューブの右端にある3桁の数字は、 AIN3チャネルを表示します。つまり、調整可能な抵抗rd3の電圧値をサンプリングすると、未使用のデジタルチューブが消えます。

【ヒント】:

IICインターフェースの基本原理は、このブログで見ることができます:「[BlueBridge Cup MCU Advanced Strengthening-01] IIC BusInterfaceTechnologyBasics」

PCF8591の基本原理は、このブログで見ることができます:「[BlueBridge Cup MCUAdvancedEnhancement-02]PCF8591の基本原理とA/D変換アプリケーション」

[2]コアソースコードの分析

/*==================蓝桥杯单片机特训==================
【进阶05】:采样光敏电阻与可调电阻的电压
**平  台:CT107D单片机综合实训平台
**模  式:IO模式
**底层驱动文件:2022年竞赛资源数据包提供的文件
**设  计:欧浩源(小蜜蜂老师,[email protected])
**时  间:2022-04-01
**更多详见:www.xmf393.com
====================================================*/

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

//定义动态显示中单个数码管点亮时长
#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 adc1_value = 0;		//AIN1的采样数据
float adc1_volt = 0;				//AIN1的换算电压
unsigned int smg1_volt = 0;			//AIN1的显示电压
unsigned char adc3_value = 0;		//AIN3的采样数据
float adc3_volt = 0;				//AIN3的换算电压
unsigned int smg3_volt = 0;			//AIN3的显示电压


/*====锁存器设置和数码管显示的代码参考前面的案例====*
//===================电压值显示函数===================
void DisplaySMG_ADC()
{
	//数码管右起第0位
	DisplaySMG_Bit(7,SMG_NoDot[smg1_volt	% 10]);
	//数码管右起第1位
	DisplaySMG_Bit(6,SMG_NoDot[(smg1_volt / 10) % 10]);		
	//数码管右起第2位
	DisplaySMG_Bit(5,SMG_Dot[smg1_volt / 100]);				

	//数码管右起第5位
	DisplaySMG_Bit(2,SMG_NoDot[smg3_volt	% 10]);
	//数码管右起第6位
	DisplaySMG_Bit(1,SMG_NoDot[(smg3_volt / 10) % 10]);		
	//数码管右起第7位
	DisplaySMG_Bit(0,SMG_Dot[smg3_volt / 100]);		
}
//===============PCF8591电压采样处理函数===============
unsigned char Read_PCF8591_ADC(unsigned char ain)
{
	unsigned char tmp;
	IIC_Start();					
	IIC_SendByte(0x90);		//PCF8591的写设备地址 
	IIC_WaitAck();				
	if(ain == 1)
	{
		IIC_SendByte(0x01); //通道1,光敏电阻电压
	}
	else if(ain == 3)
	{
		IIC_SendByte(0x03); //通道3,可调电阻电压
	}		
	IIC_WaitAck();  						
	IIC_Stop(); 
	
	DisplaySMG_ADC();			//等待电压转换完成
	
	IIC_Start();									
	IIC_SendByte(0x91); 	//PCF8591的读设备地址
	IIC_WaitAck(); 								
	tmp = IIC_RecByte(); 	//读出AD采样数据
	IIC_SendAck(1);			 	//产生非应答信号 								
	IIC_Stop();
	return tmp;
}
//=============采样光敏电阻和可调电阻的电压=============
void Read_AIN1_AIN3()
{
	adc1_value = Read_PCF8591_ADC(1);
	adc1_volt = adc1_value * (5.0 / 255);
	smg1_volt = adc1_volt * 100;
	
	adc3_value = Read_PCF8591_ADC(3);
	adc3_volt = adc3_value * (5.0 / 255);
	smg3_volt = adc3_volt * 100;
}

【注】:ブルーブリッジカップMCUの準備内容の詳細については、このサイトからダウンロードできる「ブルーブリッジカップMCUの設計と開発」リトルビー特別トレーニングマニュアル、および関連するその他のブルーブリッジカップケースを参照してください。完全なソースコードと学習準備コンテストノート、 リトルビーノート」の公式アカウントへようこそ 

おすすめ

転載: blog.csdn.net/ohy3686/article/details/123968723