这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取手持数字示波器】+使用STM32F103C8与ADS1256制作的电压、电

共2条 1/1 1 跳转至

【换取手持数字示波器】+使用STM32F103C8与ADS1256制作的电压、电流检测仪

助工
2024-10-29 19:08:53   被打赏 48 分(兑奖)     打赏

项目简介:利用ADS1256芯片对输入电压,电流做检测。可外接5V使用,也可以使用锂电池使用。该工具具有软启动功能,也可外接NTC温度传感器测量温度,电池电量低时自动关机保护锂电池。

一:硬件设计部分:

image.png

1.1充电芯片 LTC4054介绍:

LTC 4054 是一款完整的单节锂离子电池用恒定电流/恒定电压线性充电器·其 ThinSOT 封装与较少的外部元件数目使得 LTC4054 成为便携式应用的理想选择。而且,LTC4054 是专为在 USB 电源规范内工作而设计的。由于采用了内部 MOSFET 架构,所以不需要外部检测电阻器和隔离二极管。热反馈可对充电电流进行调节,以便在大功率操作或高环境温度条件下对芯片温度加以限制·充电电压固定于4.2V,而充电电流可通过一个电阻器进行外部设置。当充电电流在达到最终浮充电压之后降至设定值的1110时,LTC4054 将自动终止充电循环。当输人电压(交流适配器或 USB 电源)被拿掉时,LTC4054自动进人一个低电流状态,将电池电流降至 2μA 以下·可将 LTC4054 置于停机模式,从而将供电电流降至 25uA。LTC4054 的其他特点包括充电电流监控器、欠压闭锁、自动再充电和一个用于指示充电结束和输人电压接人的状态引脚。

上图为:锂电池充电电路 该电路使用LTC4054电池管理芯片对锂电池进行充电,LTC4054是凌特公司的生产的锂电池充电芯片,专门为单节锂电池充电需要设计的集成芯片。外部只需要几个元器件即可,无需专门的散热器,就可以对电池进行充电,充电电流可以通过5脚的电阻进行调节,最大支持600ma的充电电流。下图为芯片充电电流与电阻的对应关系。image.png

1.2 PS7516 升压芯片介绍


image.png

PS7516是一个效率高,固定550KHz频率,current mode PWM升压DC-DC转换器。PS7516低输入电压2.0V.内部集成了低RDS(ON)功率MOSFET,所以外部不需要肖特基二极管。使PS7516能做到高的转换效率。适用于锂电池升压5V1A的高效率应用中。

宽输入电压:2.0V~5.5V;高转换效率高达96%;低RDS(ON)集成功率MOSFET;550KHz固定开关频率;轻负载低功耗模式;±2.0%电压精度;PMOS电流限流短路保护;低静态电流;快速瞬态响应;内置软启动功能

过温保护,自恢复功能;过流保护;输出过压保护;超小型封装:SOT23-6,工作温度低

1.3 电池接口 和type-c功能选择电路、

可以选择外部接入3.7V锂电池对整个电路板进行供电,通过升压芯片为整个电路提供5V的电压,这样外部只需要一块锂电池就可以完成整个电路电压稳定;当电池电路不足时,可以使用type-c对电池进行充电,也可以使用type-c直接给电路板供电,改电路经过实际的测试,不过在使用的时候需要注意下,需要使PS7516处于升压状态,即PS7516输出端电压需要高于供电电压(锂电池),否则PS7516会处于降压状态,这时候,该芯片的电压纹波比较大,不能使用单片机的通讯功能。

image.png

1.4 2.5V基准电压电路

工作原理:TL431是一种三端可调分流并联稳压器,它被广泛应用于电源电路中,提供稳定的参考电压。TL431的内部结构包括一个2.5V的基准电压源、一个运放和一个输出开关管。它的工作原理基于运放的反馈机制,通过调整参考端电压来控制输出电压。

基本特性:TL431具有良好的温度稳定性,典型的动态输出阻抗为0.2Ω。它能够在1-100mA的阴极电流调节范围内工作,提供2.5V至36V的可调稳压输出。这使得TL431可以用于多种电路设计,包括并联稳压器、串联稳压器、开关调整控制电路和作为参考电压源。

工作机制:当TL431的参考端电压高于2.5V时,内部的运放输出高电平,导致输出开关管导通,从而将阴极和阳极之间形成导通路径。这时,阴极电压会被拉低,需要在电源正极和阴极之间接一个限流电阻。当参考端电压低于2.5V时,运放输出低电平,输出开关管截止,此时TL431的输出电压等于电源电压。

应用电路:在实际应用中,TL431可以通过外接电阻来设定输出电压。例如,在2.5V稳压电路中,将TL431的阴极和参考端连接在一起,通过调整输入电压和限流电阻,可以使输出电压稳定在2.5V。在可调稳压电路中,通过改变参考端和阴极之间的分压电阻值,可以实现不同的稳压输出。

image.png

1.5 ADS1256 芯片周围电路及其外部采样电路:

DS1256是TI(德州仪器)公司推出的一款微功耗、高精度、8通道、24位高性能模数转换器(ADC)。以下是对ADS1256的详细介绍:

1.5.1 主要特点:高精度与低噪声:

ADS1256具有24位分辨率,能提供高达23位无噪声分辨力,确保在各种测量应用中数据的精确性。

低噪声可编程增益放大器(PGA)以二进制步进提供1至64的增益,输入参考噪声为27nV。

多通道输入:该器件支持8个单端输入或4个差分输入(两者不可同时使用),可同时采集多路信号。

高速采样率:最大数据输出速率高达30kSPS(次采样/秒),满足快速数据采集的要求。

灵活的输入与配置:灵活的输入多路复用器处理差分或单端信号,包含用于验证连接到输入的外部传感器完整性的电路。

可编程滤波器允许用户在高达23位无噪声的分辨率和高达30kSPS的数据速率之间进行优化。

功耗管理:在正常工作模式下功耗低至38mW,待机模式下功耗进一步降低至0.4mW,有利于降低整体能耗和热管理问题。

校准与接口:提供板载校准,支持所有PGA设置的偏移和增益误差的自我校正和系统校正。通过SPI兼容串行接口进行通信,方便与各种数字系统进行数据交换。

电源需求:模拟供电为标准的5V,数字供电范围广,从1.8V至3.6V均可,为与其他电子系统的设计兼容提供了便利。

1.5.2 应用领域

ADS1256的高精度和低噪声特性使其成为多种高精度测量应用的理想选择,如应变计、气体分析、仪器仪表、压力传感器、血液分析以及医疗科学仪器等。

1.5.3 技术规格(部分)

分辨率和精度:24位分辨率,高达23位无噪声分辨力。采样率:最大30kSPS。输入通道:8个单端输入或4个差分输入。非线性:十万分之一(最大值)。功耗:正常模式下38mW,待机模式下0.4mW。

image.png

image.png

1.6 屏幕显示电路:

采用0.96寸的SPI屏幕进行数据显示

image.png

二:软件部分:

2.1 ADS1256底层驱动代码

ADS1256_VAR_T ADS1256 = {0};

static const uint8_t s_tabDataRate[ADS1256_DRATE_MAX] =
{
    0xF0,       /* 复位时缺省值 */
    0xE0,
    0xD0,
    0xC0,
    0xB0,
    0xA1,
    0x92,
    0x82,
    0x72,
    0x63,
    0x53,
    0x43,
    0x33,
    0x20,
    0x13,
    0x03
};

	//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
unsigned char SPIx_ReadWriteByte(unsigned char TxData)
{
//	uint8_t buf;
//	HAL_SPI_TransmitReceive(&hspi1,&TxData,&buf,1,1000);
//	return buf;
	
	unsigned int retry=0;		
	__HAL_SPI_ENABLE(&hspi2);	
	while((SPI2->SR&1<<1)==0)//等待发送区空	
	{
		retry++;
		if(retry>2000)return 0;
	}			  
	SPI2->DR=TxData;	 	  //发送一个byte 
	retry=0;
	while((SPI2->SR&1<<0)==0) //等待接收完一个byte  
	{
		retry++;
		if(retry>2000)return 0;
	}	  						    
	return SPI2->DR;          //返回收到的数据	
}

void ADS1256_ResetHard(void)
{
		ADS1256_RESET_LOW;
    delay_ms(5);
    ADS1256_RESET_HIGH;
    delay_ms(5);
}

void ADS1256_INIT(ADS1256_GAIN_E _gain, ADS1256_DRATE_E _drate)
{
	uint8_t ReadRate = 0;
	HAL_NVIC_DisableIRQ(EXTI15_10_IRQn);
	ADS1256_ResetHard();
	delay_us(1);
	waitDRDY();
	setPGA(_gain);
	delay_us(1);
	setDataRate(s_tabDataRate[_drate]);
	delay_us(1);
	ReadRate = readByteFromReg(REG_DRATE);
	while(ReadRate != s_tabDataRate[_drate])
	{
			ReadRate = readByteFromReg(REG_DRATE);
			writeByteToReg(REG_DRATE, s_tabDataRate[_drate]);
	}
	
	setDIFFChannel(7,8);
	delay_us(1);
	
	writeByteToReg(REG_STATUS, 0x06);						//高位在前   开启自动校准    关闭模拟缓冲区
	delay_us(1);
	waitDRDY();
	
	CS_0();
	SPIx_ReadWriteByte(CMD_SYNC);
	SPIx_ReadWriteByte(CMD_WAKEUP);
	CS_1();
	HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}

int32_t ADS1256_BACK(void)
{
	int32_t Sum = 0;
	int16_t buf = 0;
	while(!DRDY_IS_LOW());
	setDIFFChannel(3,4);
	CS_0();
	SPIx_ReadWriteByte(CMD_SYNC);
	SPIx_ReadWriteByte(CMD_WAKEUP);
	SPIx_ReadWriteByte(CMD_RDATA);
	delay_us(2);
	buf |= (SPIx_ReadWriteByte(0) << 8);
	buf |= (SPIx_ReadWriteByte(0) );
	Sum = ((int32_t)buf) << 8;
	Sum |= SPIx_ReadWriteByte(0);
	CS_1();
	return Sum;
}

void setChannel(uint8_t ch)
{
	switch(ch)
	{
		case 0:
			setDIFFChannel(2, 1);
		break;
		case 1:
			setDIFFChannel(1, 0);
		break;
		case 2:
			setDIFFChannel(3, 4);
		break;
		case 3:
			setDIFFChannel(4, 5);
		break;
		case 4:
			setDIFFChannel(6, 7);
		break;
		case 5:
			setDIFFChannel(7, 8);
		break;
	}

}

void setpga(uint8_t pga)
{
	switch(pga)
	{
		case 0:
			setPGA(ADS1256_GAIN_1);
			ADS1256.Gain[0] = ADS1256_GAIN_1;
		break;
		case 1:
			setPGA(ADS1256_GAIN_32);
			ADS1256.Gain[1] = ADS1256_GAIN_32;
		break;
		case 2:
			setPGA(ADS1256_GAIN_1);
			ADS1256.Gain[2] = ADS1256_GAIN_1;
		break;
		case 3:
			setPGA(ADS1256_GAIN_32);
			ADS1256.Gain[3] = ADS1256_GAIN_32;
		break;
		case 4:
			setPGA(ADS1256_GAIN_16);
			ADS1256.Gain[4] = ADS1256_GAIN_16;
		break;
		case 5:
			setPGA(ADS1256_GAIN_1);
			ADS1256.Gain[5] = ADS1256_GAIN_1;
		break;
	}
}

extern int buf1 ;
void ADS1256_BACK_IRQ(void)
{
	int32_t Sum = 0;
	int16_t buf = 0;
	setChannel(ADS1256.Channel);
	
	CS_0();
	SPIx_ReadWriteByte(CMD_SYNC);
	SPIx_ReadWriteByte(CMD_WAKEUP);
	SPIx_ReadWriteByte(CMD_RDATA);
	delay_us(2);
	buf |= (SPIx_ReadWriteByte(0) << 8);
	buf |= (SPIx_ReadWriteByte(0) );
	Sum = ((int32_t)buf) << 8;
	Sum |= SPIx_ReadWriteByte(0);
	CS_1();
	delay_us(2);
	
	setpga(ADS1256.Channel);
	if(ADS1256.Channel == 0)
	{
		ADS1256.AdcNow[5] = Sum;/* 注意保存的是上一个通道的数据 */
	}
	else
	{
		ADS1256.AdcNow[ADS1256.Channel - 1] = Sum;
	}
	
	if(++ADS1256.Channel >= 6)
		ADS1256.Channel = 0;
	
	
//	writeByteToReg(REG_STATUS, 0x06);						//高位在前   开启自动校准    关闭模拟缓冲区
//	delay_us(1);
//	waitDRDY();
//	delay_us(2000);
	
	buf1 ++ ;
}


void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_11)
	{
		HAL_NVIC_DisableIRQ(EXTI15_10_IRQn);
		ADS1256_BACK_IRQ();
		HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
		__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_11);
		
	}
}

/*
*********************************************************************************************************
*	name: setDIFFChannel
*	function: Write to MUX register - set channel to read from in single-ended mode
*   Bit 7,6,5,4 determine the positive input channel (AINp).
*   Bit 3,2,1,0 determine the negative input channel (AINn). e.g. (0-1, 2,3 - 4,5 - 6,7)
*	parameter:
*	The return value: val
*********************************************************************************************************
*/
void setDIFFChannel(uint8_t positiveCh, uint8_t NegativeCh)
{
	writeByteToReg(REG_MUX, positiveCh <<4 | NegativeCh); //xxxx1000 - AINp = positiveCh, AINn = NegativeCh
}

/*
*********************************************************************************************************
*	name: writeCMD
*	function: Send Standalone commands to register
*	parameter: command
*	The return value: None
*********************************************************************************************************
*/

void writeCMD(uint8_t command)
{
//	uint8_t Txbuffer[1];
//	Txbuffer[0] = command;
	CS_0();
	SPIx_ReadWriteByte(command);
	CS_1();
}

/*
*********************************************************************************************************
*	name: setDataRate
*	function: sampling rate of collection
*	parameter: pga
*	The return value: None
*********************************************************************************************************
*/
void setDataRate(uint8_t drate)
{
	writeByteToReg(REG_DRATE,drate);
}

/**
*********************************************************************************************************
*	name: writeByteToReg
*	function: read 1 byte from register address registerID.
*	parameter: register ID
*	The return value:
*********************************************************************************************************
*/
void writeByteToReg(uint8_t registerID, uint8_t value)
{
	uint8_t Txbuffer[3];
	Txbuffer[0] = CMD_WREG | registerID;
	Txbuffer[1] = 0x00;
	Txbuffer[2] = value;
	CS_0();
	SPIx_ReadWriteByte(Txbuffer[0]);
	SPIx_ReadWriteByte(Txbuffer[1]);
	SPIx_ReadWriteByte(Txbuffer[2]);
	/*
	send8bit(CMD_WREG | registerID);		//1syt byte: address of the first register to write
	send8bit(0x00);							//2nd byte: number of byte to write = 1.
	send8bit(value);						//3rd byte: value to write to register
	*/
	CS_1();

}
/*
*********************************************************************************************************
*	name: setPGA
*	function: Set gain of amplifier
*	parameter: pga
*	The return value: None
*********************************************************************************************************
*/
void setPGA(uint8_t pga)
{
	writeByteToReg(REG_ADCON,pga);
}
/*
*********************************************************************************************************
*	name: Send8bit
*	function: SPI send data to SPI slave
*	parameter: data
*	The return value: NULL
*********************************************************************************************************
*/
void send8bit(uint8_t data)
{
	SPIx_ReadWriteByte(data);
}
/*
*********************************************************************************************************
*	name: waitDRDY
*	function: Wait for DRDY is Low
*	parameter: data
*	The return value: None
*********************************************************************************************************
*/
void waitDRDY(void)
{
	uint32_t i;
		for (i = 0; i < 40000000; i++){
			if (DRDY_IS_LOW()){
				break;
			}
		}
}
/*
*********************************************************************************************************
*	name: readChipID
*	function: Get data from Status register - chipID "check"
*	parameter:
*	The return value: val
*********************************************************************************************************
*/
uint8_t readChipID(void)
{
	waitDRDY();
	volatile uint8_t id = readByteFromReg(REG_STATUS);
	return (id >> 4);
}

/*
*********************************************************************************************************
*	name: receive8bit
*	function: receive data from SPI slave
*	parameter: data
*	The return value: NULL
*********************************************************************************************************
*/
uint8_t receive8bit(void)
{
	/*
	uint8_t TXbuffer[1];
	uint8_t RXbuffer[1];
	TXbuffer[0] = 0xff;

	HAL_SPI_Transmit(&hspi1, TXbuffer ,1,50);
	HAL_SPI_Receive(&hspi1, RXbuffer ,1,50);

	return RXbuffer[0];
	*/
	uint8_t send_data = 0xff;
	uint8_t read = 0;
	read = SPIx_ReadWriteByte(send_data);
	return read;



}
/*
*********************************************************************************************************
*	name: readByteFromReg
*	function: read 1 byte from register address registerID.
*	parameter: register ID
*	The return value:
*********************************************************************************************************
*/
uint8_t readByteFromReg(uint8_t registerID)
{
	uint8_t TXbuffer[2];
	TXbuffer[0] = CMD_RREG | registerID;
	TXbuffer[1] = 0x00;
	CS_0();
	SPIx_ReadWriteByte(TXbuffer[0]);
	SPIx_ReadWriteByte(TXbuffer[1]);
	delay_us(10);
	uint8_t read = receive8bit();
	CS_1();

	return read;
}
/*
*********************************************************************************************************
*	name: setBuffer
*	function: Set the internal buffer (True-enable), (Fasle-disable)
*	parameter: bool val
*	The return value: val
*********************************************************************************************************
*/
void setBuffer(void)
{
	uint8_t val = 1;
	uint8_t Txbuffer[2];
	Txbuffer[0] = CMD_WREG | REG_STATUS;
	Txbuffer[1] = (0 <<3) | (1 << 2) | (val << 1);

	CS_0();
	SPIx_ReadWriteByte(Txbuffer[0]);
	SPIx_ReadWriteByte(Txbuffer[1]);
	//send8bit(CMD_WREG | REG_STATUS);
	//send8bit((0 <<3) | (1 << 2) | (val << 1));
	CS_1();
}

2.2  OLED屏显示部分驱动代码

u8 OLED_GRAM[128][8];


	//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
unsigned char SPI1_ReadWriteByte(unsigned char TxData)
{
//	uint8_t buf;
//	HAL_SPI_TransmitReceive(&hspi1,&TxData,&buf,1,1000);
//	return buf;
	
	unsigned int retry=0;		
	__HAL_SPI_ENABLE(&hspi1);	
	while((SPI1->SR&1<<1)==0)//等待发送区空	
	{
		retry++;
		if(retry>2000)return 0;
	}			  
	SPI1->DR=TxData;	 	  //发送一个byte 
	retry=0;
	while((SPI1->SR&1<<0)==0) //等待接收完一个byte  
	{
		retry++;
		if(retry>2000)return 0;
	}	  						    
	return SPI1->DR;          //返回收到的数据	
}

//发送一个字节
void OLED_WR_Byte(u8 dat,u8 cmd)
{
		if(cmd)
		{
			OLED_DC_Set();
		}
		else
		{
			OLED_DC_Clr();
		}
		OLED_CS_Clr();
		SPI1_ReadWriteByte(dat);//检查接收标志位
		delay_us(1);
		OLED_DC_Set();
		OLED_CS_Set();
}


//反显函数
void OLED_ColorTurn(u8 i)
{
	if(i==0)
		{
			OLED_WR_Byte(0xA6,OLED_CMD);//正常显示
		}
	if(i==1)
		{
			OLED_WR_Byte(0xA7,OLED_CMD);//反色显示
		}
}

//屏幕旋转180度
void OLED_DisplayTurn(u8 i)
{
	if(i==0)
		{
			OLED_WR_Byte(0xC8,OLED_CMD);//正常显示
			OLED_WR_Byte(0xA1,OLED_CMD);
		}
	if(i==1)
		{
			OLED_WR_Byte(0xC0,OLED_CMD);//反转显示
			OLED_WR_Byte(0xA0,OLED_CMD);
		}
}

//开启OLED显示 
void OLED_DisPlay_On(void)
{
	OLED_WR_Byte(0x8D,OLED_CMD);//电荷泵使能
	OLED_WR_Byte(0x14,OLED_CMD);//开启电荷泵
	OLED_WR_Byte(0xAF,OLED_CMD);//点亮屏幕
}

//关闭OLED显示 
void OLED_DisPlay_Off(void)
{
	OLED_WR_Byte(0x8D,OLED_CMD);//电荷泵使能
	OLED_WR_Byte(0x10,OLED_CMD);//关闭电荷泵
	OLED_WR_Byte(0xAE,OLED_CMD);//关闭屏幕
}

//更新显存到OLED	
void OLED_Refresh(void)
{
	u8 i,n;
	for(i=0;i<8;i++)
	{
	   OLED_WR_Byte(0xb0+i,OLED_CMD); //设置行起始地址
	   OLED_WR_Byte(0x00,OLED_CMD);   //设置低列起始地址
	   OLED_WR_Byte(0x10,OLED_CMD);   //设置高列起始地址
	   for(n=0;n<128;n++)
		 OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA);
  }
}


//清屏函数
void OLED_Clear(void)
{
	u8 i,n;
	for(i=0;i<8;i++)
	{
	   for(n=0;n<128;n++)
			{
			 OLED_GRAM[n][i]=0;//清除所有数据
			}
  }
//	OLED_Refresh();//更新显示
}

//画点 
//x:0~127
//y:0~63
void OLED_DrawPoint(u8 x,u8 y)
{
	u8 i,m,n;
	i=y/8;
	m=y%8;
	n=1<<m;
	OLED_GRAM[x][i]|=n;
}

//画线
//x:0~127
//y:0~63
void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2)
{
	u8 i,k,k1,k2;
	if(x1==x2)    //画竖线
	{
			for(i=0;i<(y2-y1);i++)
			{
				OLED_DrawPoint(x1,y1+i);
			}
  }
	else if(y1==y2)   //画横线
	{
			for(i=0;i<(x2-x1);i++)
			{
				OLED_DrawPoint(x1+i,y1);
			}
  }
	else      //画斜线
	{
		k1=y2-y1;
		k2=x2-x1;
		k=k1*10/k2;
		for(i=0;i<(x2-x1);i++)
			{
			  OLED_DrawPoint(x1+i,y1+i*k/10);
			}
	}
}
//x,y:圆心坐标
//r:圆的半径
void OLED_DrawCircle(u8 x,u8 y,u8 r)
{
	int a, b,num;
    a = 0;
    b = r;
    while(2 * b * b >= r * r)      
    {
        OLED_DrawPoint(x + a, y - b);
        OLED_DrawPoint(x - a, y - b);
        OLED_DrawPoint(x - a, y + b);
        OLED_DrawPoint(x + a, y + b);
 
        OLED_DrawPoint(x + b, y + a);
        OLED_DrawPoint(x + b, y - a);
        OLED_DrawPoint(x - b, y - a);
        OLED_DrawPoint(x - b, y + a);
        
        a++;
        num = (a * a + b * b) - r*r;//计算画的点离圆心的距离
        if(num > 0)
        {
            b--;
            a--;
        }
    }
}



//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//size:选择字体 12/16/24
//mode: 0:正常模式	1:反白显示
void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode)
{
	u8 i,m,temp,size2,chr1;
	u8 y0=y;
	size2=(size1/8+((size1%8)?1:0))*(size1/2);  //得到字体一个字符对应点阵集所占的字节数
	chr1=chr-' ';  //计算偏移后的值
	for(i=0;i<size2;i++)
	{
		if(size1==12)
        {temp=asc2_1206[chr1][i];} //调用1206字体
		else if(size1==16)
        {temp=asc2_1608[chr1][i];} //调用1608字体
		else if(size1==24)
        {temp=asc2_2412[chr1][i];} //调用2412字体
		else return;
				temp = (mode == 0) ? temp : ~temp;
				for(m=0;m<8;m++)           //写入数据
				{
					if(temp&0x80)
					{OLED_DrawPoint(x,y);}
					temp<<=1;
					y++;
					if((y-y0)==size1)
					{
						y=y0;
						x++;
						break;
          }
				}
  }
}


//显示字符串
//x,y:起点坐标  
//size1:字体大小 
//*chr:字符串起始地址 
void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode)
{
	while((*chr>=' ')&&(*chr<='~'))//判断是不是非法字符!
	{
		OLED_ShowChar(x,y,*chr,size1,mode);
		x+=size1/2;
		if(x>128-size1)  //换行
		{
			x=0;
			y+=2;
    }
		chr++;
  }
}

//m^n
u32 OLED_Pow(u8 m,u8 n)
{
	u32 result=1;
	while(n--)
	{
	  result*=m;
	}
	return result;
}

////显示2个数字
////x,y :起点坐标	 
////len :数字的位数
////size:字体大小
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode)
{
	u8 t,temp;
	for(t=0;t<len;t++)
	{
		temp=(num/OLED_Pow(10,len-t-1))%10;
			if(temp==0)
			{
				OLED_ShowChar(x+(size1/2)*t,y,'0',size1,mode);
      }
			else 
			{
			  OLED_ShowChar(x+(size1/2)*t,y,temp+'0',size1,mode);
			}
  }
}

//显示汉字
//x,y:起点坐标
//num:汉字对应的序号
void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1)
{
	u8 i,m,n=0,temp,chr1;
	u8 x0=x,y0=y;
	u8 size3=size1/8;
	while(size3--)
	{
		chr1=num*size1/8+n;
		n++;
			for(i=0;i<size1;i++)
			{
				if(size1==16)
						{temp=Hzk1[chr1][i];}//调用16*16字体
				else if(size1==24)
						{temp=Hzk2[chr1][i];}//调用24*24字体
				else if(size1==32)       
						{temp=Hzk3[chr1][i];}//调用32*32字体
				else if(size1==64)
						{temp=Hzk4[chr1][i];}//调用64*64字体
				else return;
							
						for(m=0;m<8;m++)
							{
								if(temp&0x01)
								{OLED_DrawPoint(x,y);}
								temp>>=1;
								y++;
							}
							x++;
							if((x-x0)==size1)
							{x=x0;y0=y0+8;}
							y=y0;
			 }
	}
}

void OLED_ShowChinese_HZ12(u8 x,u8 y,u8 num)
{
	u8 i,m,temp,chr1;
	u8 x0=x,y0=y;
	chr1 = num * 2;
	for(i=0;i<12;i++)
	{
		temp=Hzk5[chr1][i];
		for(m=0;m<8;m++)
		{
			if(temp&0x01)
			{OLED_DrawPoint(x,y);}
			temp>>=1;
			y++;
		}
		x++;
		y = y0;
	}
	x=x0;y=y0+8;
	chr1 = num * 2 + 1;
	for(i=0;i<12;i++)
	{
		temp=Hzk5[chr1][i];
		for(m=0;m<4;m++)
		{
			if(temp&0x01)
			{OLED_DrawPoint(x,y);}
			temp>>=1;
			y++;
		}
		x++;
		y = y0+8;
	}
}

//num 显示汉字的个数
//space 每一遍显示的间隔
void OLED_ScrollDisplay(u8 num,u8 space)
{
	u8 i,n,t=0,m=0,r;
	while(1)
	{
		if(m==0)
		{
	    OLED_ShowChinese(128,24,t,16); //写入一个汉字保存在OLED_GRAM[][]数组中
			t++;
		}
		if(t==num)
			{
				for(r=0;r<16*space;r++)      //显示间隔
				 {
					for(i=0;i<144;i++)
						{
							for(n=0;n<8;n++)
							{
								OLED_GRAM[i-1][n]=OLED_GRAM[i][n];
							}
						}
           OLED_Refresh();
				 }
        t=0;
      }
		m++;
		if(m==16){m=0;}
		for(i=0;i<144;i++)   //实现左移
		{
			for(n=0;n<8;n++)
			{
				OLED_GRAM[i-1][n]=OLED_GRAM[i][n];
			}
		}
		OLED_Refresh();
	}
}

//配置写入数据的起始位置
void OLED_WR_BP(u8 x,u8 y)
{
	OLED_WR_Byte(0xb0+y,OLED_CMD);//设置行起始地址
	OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
	OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD);
}

//x0,y0:起点坐标
//x1,y1:终点坐标
//BMP[]:要写入的图片数组
void OLED_ShowPicture(u8 x0,u8 y0,u8 x1,u8 y1,u8 BMP[])
{
	u32 j=0;
	u8 x=0,y=0;
	if(y%8==0)y=0;
	else y+=1;
	for(y=y0;y<y1;y++)
	 {
		 OLED_WR_BP(x0,y);
		 for(x=x0;x<x1;x++)
		 {
			 OLED_WR_Byte(BMP[j],OLED_DATA);
			 j++;
     }
	 }
}


	
//OLED的初始化
void OLED_Init(void)
{
	
		OLED_RST_Set();
		OLED_RST_Clr();//复位
		delay_ms(200);
		OLED_RST_Set();
	
		OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
		OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
		OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
		OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
		OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
		OLED_WR_Byte(0xff,OLED_CMD);// Set SEG Output Current Brightness
		OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
		OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
		OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
		OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
		OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
		OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset	Shift Mapping RAM Counter (0x00~0x3F)
		OLED_WR_Byte(0x00,OLED_CMD);//-not offset
		OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
		OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
		OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
		OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
		OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
		OLED_WR_Byte(0x12,OLED_CMD);
		OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
		OLED_WR_Byte(0x70,OLED_CMD);//Set VCOM Deselect Level
		OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
		OLED_WR_Byte(0x02,OLED_CMD);//
		OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
		OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
		OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
		OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7) 
		OLED_WR_Byte(0xAF,OLED_CMD);
		OLED_Clear();
}

1.3 数据计算部分代码:

VI_BUF_T VI_Buffer={
.First_V_Offset = -203,
.First_I_Offset = 4800,
.Second_V_Offset = -130,
.Second_I_Offset = -300
};


void First_V_CAL(void)
{
	VI_Buffer.First_V_Offset = ADS1256.AdcNow[0];
}

void First_I_CAL(void)
{
	VI_Buffer.First_I_Offset = ADS1256.AdcNow[1];
}

void Second_V_CAL(void)
{
	VI_Buffer.Second_V_Offset = ADS1256.AdcNow[2];
}

void Second_I_CAL(void)
{
	VI_Buffer.Second_I_Offset = ADS1256.AdcNow[3];
}


void VI_Handle(void)
{
	VI_Buffer.First_V_value = (ADS1256.AdcNow[0]-VI_Buffer.First_V_Offset)/1.0/FULL_Range/pow(2,ADS1256.Gain[0])*2*REF2_5	\
														*(First_V_UP + First_V_DOWN)/(First_V_DOWN) * xishu;
	
	VI_Buffer.First_I_value = (ADS1256.AdcNow[1]-VI_Buffer.First_I_Offset)/1.0/FULL_Range/pow(2,ADS1256.Gain[1])*2*REF2_5	\
														/First_I_R;
	
	VI_Buffer.Second_V_value = (ADS1256.AdcNow[2]-VI_Buffer.Second_V_Offset)*1.0/FULL_Range/pow(2,ADS1256.Gain[2])*2*REF2_5 \
														*(Second_V_UP + Second_V_DOWN)/(Second_V_DOWN);
	
	VI_Buffer.Second_I_value = (ADS1256.AdcNow[3]-VI_Buffer.Second_I_Offset)*1.0/FULL_Range/pow(2,ADS1256.Gain[3])*2*REF2_5	\
														/Second_I_R;
	
	VI_Buffer.First_V_value = fabsf(VI_Buffer.First_V_value);
	VI_Buffer.Second_V_value = fabsf(VI_Buffer.Second_V_value);
	
	VI_Buffer.First_P_value = VI_Buffer.First_V_value * fabsf(VI_Buffer.First_I_value);
	VI_Buffer.Second_P_value = VI_Buffer.Second_V_value * fabsf(VI_Buffer.Second_I_value);
	
	if(VI_Buffer.First_P_value > 0.01 && VI_Buffer.Second_P_value > 0.01)
		VI_Buffer.VI_EFF = VI_Buffer.First_P_value > VI_Buffer.Second_P_value ? (VI_Buffer.Second_P_value/VI_Buffer.First_P_value)*100 \
																																					: (VI_Buffer.First_P_value/VI_Buffer.Second_P_value)*100 ;
	else
		VI_Buffer.VI_EFF = 0;			
}

1.4 界面显示及其按键处理部分

meun_t meun={
							.meun_Id1 = 0,
							.meun_Id2 = 0,
							.meun_Id1_max = 6,
							.meun_Id2_max = 0,
							.meun_button = Idle,
							.meun_select = 1,
							.meun_select_max = 1,
							.meun_layer = 0,
							.set.meun_set_idischarge = 4000,
							.set.meun_set_icharge = 1000,
							.set.meun_light_state = 1,
							.set.meun_set_light_time = 5,
							.set.meun_light_time = 10
};

						
						
void meun_disp_1(void);
void meun_disp_2(void);
void Function_key_en(void);
void meun_disp_once(void);
void meun_disp_3(void);
void meun_disp_4(void);
void meun_disp_5(void);
void meun_disp_6(void);
						
						
						
//发送按键状态值
void send_button_value(button_type value)
{
	meun.meun_button = value;
}

//主界面
void MEUN_HOME(void)
{
	static uint8_t state = 0;
	char buf[10]={0};
	OLED_DrawLine(0,0,0,63);
	OLED_DrawLine(0,0,127,0);
	OLED_DrawLine(127,0,127,64);
	OLED_DrawLine(0,63,128,63);
	OLED_DrawLine(2,2,2,61);
	OLED_DrawLine(2,2,125,2);
	OLED_DrawLine(125,2,125,62);
	OLED_DrawLine(2,61,126,61);
	//第一行

	OLED_ShowString(5,5,(uint8_t *)"OUT1",12,0);
	OLED_ShowString(29,5,(uint8_t *)":",12,0);
	sprintf(buf,"%05.2fV",VI_Buffer.First_V_value);
	OLED_ShowString(35,5,(uint8_t *)buf,12,0);
	
	
	sprintf(buf,"%06.3fA",VI_Buffer.First_I_value);
	OLED_ShowString(76,5,(uint8_t *)buf,12,0);
	//第二行
	OLED_ShowString(5,19,(uint8_t *)"OUT2",12,0);
	OLED_ShowString(29,19,(uint8_t *)":",12,0);
	sprintf(buf,"%05.2fV",VI_Buffer.Second_V_value);
	OLED_ShowString(35,19,(uint8_t *)buf,12,0);
	sprintf(buf,"%06.3fA",VI_Buffer.Second_I_value);
	OLED_ShowString(76,19,(uint8_t *)buf,12,0);
	//第三行
	OLED_ShowChinese_HZ12(5,33,18);
	OLED_ShowChinese_HZ12(17,33,15);
	OLED_ShowString(29,33,(uint8_t *)":",12,0);
	sprintf(buf,"%6.2f%%",VI_Buffer.VI_EFF);
	OLED_ShowString(35,33,(uint8_t *)buf,12,0);
	if(state <= 1)
	{
		OLED_ShowString(110,33,(uint8_t *)"\\",12,0);
	}
	else if(state <= 3)
	{
		OLED_ShowString(110,33,(uint8_t *)"/",12,0);
	}
	else if(state <= 5)
	{
		OLED_ShowString(110,33,(uint8_t *)"-",12,0);
	}
	state ++;
	if(state > 5)
		state = 0;
	//第四行
	OLED_ShowChinese_HZ12(5,47,14);
	OLED_ShowChinese_HZ12(17,47,15);
	OLED_ShowString(29,47,(uint8_t *)":",12,0);
	if(VI_Buffer.First_P_value > 100)
	{
		sprintf(buf,"%5.1fW",VI_Buffer.First_P_value);
	}
	else
	{
		sprintf(buf,"%05.2fW",VI_Buffer.First_P_value);
	}
	OLED_ShowString(35,47,(uint8_t *)buf,12,0);
	
	if(VI_Buffer.Second_P_value > 100)
	{
		sprintf(buf,"%5.1fW",VI_Buffer.Second_P_value);
	}
	else
	{
		sprintf(buf,"%05.2fW",VI_Buffer.Second_P_value);
	}
	OLED_ShowString(82,47,(uint8_t *)buf,12,0);
}



//页脚显示
void MEUN_Footer(unsigned char type)
{
	OLED_DrawLine(2,52,125,52);
	OLED_DrawLine(4,57,8,57);
	OLED_DrawLine(4,58,8,58);
	OLED_DrawLine(4,59,8,59);
	OLED_DrawLine(4,60,8,60);
	if(type == 0)
		OLED_ShowString(12,53,(uint8_t *)"EN",12,0);
	else if(type == 1)
		OLED_ShowString(12,53,(uint8_t *)"TAB",12,0);
	
	OLED_DrawLine(44,57,48,57);
	OLED_DrawLine(44,58,48,58);
	OLED_DrawLine(44,59,48,59);
	OLED_DrawLine(44,60,48,60);
	OLED_DrawLine(52,57,56,57);
	OLED_DrawLine(52,58,56,58);
	OLED_DrawLine(52,59,56,59);
	OLED_DrawLine(52,60,56,60);
	OLED_ShowString(60,53,(uint8_t *)"BA",12,0);
	
	OLED_DrawLine(84,57,96,57);
	OLED_DrawLine(84,58,96,58);
	OLED_DrawLine(84,59,96,59);
	OLED_DrawLine(84,60,96,60);
	if(type == 0)
		OLED_ShowString(100,53,(uint8_t *)"TAB",12,0);
	else if(type == 1)
		OLED_ShowString(100,53,(uint8_t *)"EN",12,0);
}	


void meun_disp(void)
{
	if(meun.meun_layer == 0)
	{
		//主界面
		MEUN_HOME();
	}
	else if(meun.meun_layer == 1)
	{
		switch(meun.meun_Id1)
		{
			case 1:
							MEUN_Header();
							MEUN_Footer(0);
							OLED_ShowChinese(24,24,0,16);
							OLED_ShowChinese(40,24,1,16);
							OLED_ShowChinese(56,24,2,16);
							OLED_ShowChinese(72,24,9,16);
							OLED_ShowChinese(88,24,10,16);
				break;
			case 2:
							MEUN_Header();
							MEUN_Footer(0);
							OLED_ShowChinese(24,24,3,16);
							OLED_ShowChinese(40,24,4,16);
							OLED_ShowChinese(56,24,5,16);
							OLED_ShowChinese(72,24,9,16);
							OLED_ShowChinese(88,24,10,16);
				break;
			case 3:
							MEUN_Header();
							MEUN_Footer(0);
							OLED_ShowChinese(24,24,6,16);
							OLED_ShowChinese(40,24,7,16);
							OLED_ShowChinese(56,24,8,16);
							OLED_ShowChinese(72,24,9,16);
							OLED_ShowChinese(88,24,10,16);
				break;
			case 4:
							MEUN_Header();
							MEUN_Footer(0);
							OLED_ShowChinese(16,24,11,16);
							OLED_ShowChinese(32,24,12,16);
							OLED_ShowChinese(48,24,13,16);
							OLED_ShowChinese(64,24,14,16);
							OLED_ShowChinese(80,24,15,16);
							OLED_ShowChinese(96,24,16,16);
				break;
			case 5:
							MEUN_Header();
							MEUN_Footer(0);
							OLED_ShowChinese(16,24,20,16);
							OLED_ShowChinese(32,24,0,16);
							OLED_ShowChinese(48,24,0,16);
							OLED_ShowChinese(64,24,22,16);
							OLED_ShowChinese(80,24,15,16);
							OLED_ShowChinese(96,24,16,16);
				break;
			case 6:
							MEUN_Header();
							MEUN_Footer(0);
							OLED_ShowChinese(16,24,21,16);
							OLED_ShowChinese(32,24,0,16);
							OLED_ShowChinese(48,24,0,16);
							OLED_ShowChinese(64,24,22,16);
							OLED_ShowChinese(80,24,15,16);
							OLED_ShowChinese(96,24,16,16);
				break;
			
			default:
				break;
		}
	}
	else if(meun.meun_layer == 2)
	{
		if(meun.meun_Id2_max != 0)
		{
			switch(meun.meun_Id2)
			{
				case 1:
					break;
				
				default:
					break;
			}
		}
		else
		{
			switch(meun.meun_Id1)
			{
				case 1:
								MEUN_Header();
								MEUN_Footer(1);
								meun_disp_1();
					break;
				case 2:
								MEUN_Header();
								MEUN_Footer(1);
								meun_disp_2();
					break;
				case 3:
								MEUN_Header();
								MEUN_Footer(1);
								meun_disp_3();
					break;
				case 4:
								MEUN_Header();
								MEUN_Footer(1);
								meun_disp_4();
					break;
				case 5:
								MEUN_Header();
								MEUN_Footer(1);
								meun_disp_5();
					break;
				
				case 6:
								MEUN_Header();
								MEUN_Footer(1);
								meun_disp_6();
					break;
				
				default:
					break;
			}
		}
	}
	else if(meun.meun_layer == 3)
	{
		
	}
}
void Function_key_en(void)
{
	if(meun.meun_select == 0 || meun.meun_select_max == 0)
		return ;
	switch(meun.meun_Id1)
	{
			case 4:
				switch(meun.meun_select)
				{
					case 1:
							meun.set.meun_set_light_time  = (meun.set.meun_set_light_time + 1) > 60 ? 5:(meun.set.meun_set_light_time + 1);
						break;
					case 2:
							meun.set.meun_set_light_time  = (meun.set.meun_set_light_time + 5) > 60 ? 5:(meun.set.meun_set_light_time + 5);
						break;
					case 3:
							meun.set.meun_set_light_time  = (meun.set.meun_set_light_time + 20) > 60 ? 5:(meun.set.meun_set_light_time + 20);
						break;
					case 4:
							meun.set.meun_set_light_time  = (meun.set.meun_set_light_time - 1) < 5 ? 60:(meun.set.meun_set_light_time - 1);
						break;
					case 5:
							meun.set.meun_set_light_time  = (meun.set.meun_set_light_time - 5) < 5 ? 60:(meun.set.meun_set_light_time - 5);
						break;
					case 6:
							meun.set.meun_set_light_time  = (meun.set.meun_set_light_time - 20) < 5 ? 60:(meun.set.meun_set_light_time - 20);
						break;
				}
			break;
			
			case 5:
				switch(meun.meun_select)
				{
					case 1:
							meun.set.meun_set_icharge  = (meun.set.meun_set_icharge + 100) > 10000 ? 500:(meun.set.meun_set_icharge + 100);
						break;
					case 2:
							meun.set.meun_set_icharge  = (meun.set.meun_set_icharge + 500) > 10000 ? 500:(meun.set.meun_set_icharge + 500);
						break;
					case 3:
							meun.set.meun_set_icharge  = (meun.set.meun_set_icharge + 2000) > 10000 ? 500:(meun.set.meun_set_icharge + 2000);
						break;
					case 4:
							meun.set.meun_set_icharge  = (meun.set.meun_set_icharge - 100) < 500 ? 10000:(meun.set.meun_set_icharge - 100);
						break;
					case 5:
							meun.set.meun_set_icharge  = (meun.set.meun_set_icharge - 500) < 500 ? 10000:(meun.set.meun_set_icharge - 500);
						break;
					case 6:
							meun.set.meun_set_icharge  = (meun.set.meun_set_icharge - 2000) < 500 ? 10000:(meun.set.meun_set_icharge - 2000);
						break;
				}
			break;
				
			case 6:
				switch(meun.meun_select)
				{
					case 1:
							meun.set.meun_set_idischarge  = (meun.set.meun_set_idischarge + 100) > 16000 ? 100:(meun.set.meun_set_idischarge + 100);
						break;
					case 2:
							meun.set.meun_set_idischarge  = (meun.set.meun_set_idischarge + 500) > 16000 ? 100:(meun.set.meun_set_idischarge + 500);
						break;
					case 3:
							meun.set.meun_set_idischarge  = (meun.set.meun_set_idischarge + 2000) > 16000 ? 100:(meun.set.meun_set_idischarge + 2000);
						break;
					case 4:
							meun.set.meun_set_idischarge  = (meun.set.meun_set_idischarge - 100) < 100 ? 16000:(meun.set.meun_set_idischarge - 100);
						break;
					case 5:
							meun.set.meun_set_idischarge  = (meun.set.meun_set_idischarge - 500) < 100 ? 16000:(meun.set.meun_set_idischarge - 500);
						break;
					case 6:
							meun.set.meun_set_idischarge  = (meun.set.meun_set_idischarge - 2000) < 100 ? 16000:(meun.set.meun_set_idischarge - 2000);
						break;
				}
//				PL5500_SET_IDISCHARGE(meun.set.meun_set_idischarge);
			break;
	}
}

//设置界面显示1:电烙铁模式
void meun_disp_1(void)
{
	uint8_t x=25,y=35,x1=5,y1=15;
	char buf[10];
	meun.meun_select_max = 4;
	OLED_ShowChinese_HZ12(x,y,34);
	OLED_ShowChinese_HZ12(x+12,y,35);
	OLED_ShowChinese_HZ12(x+12*2,y,36);
	OLED_ShowString(x+12*3,y,(uint8_t *)":",12,0);
//	sprintf(buf,"%4.1fV",PL5500.OUT_V/1000.0);
//	OLED_ShowString(x+12*3+6,y,(uint8_t *)buf,12,0);
	switch(meun.meun_select)	
	{
		case 1:
			OLED_ShowString(x1,y1,(uint8_t *)"05V",16,1);
			OLED_ShowString(x1+30,y1,(uint8_t *)"12V",16,0);
			OLED_ShowString(x1+30*2,y1,(uint8_t *)"20V",16,0);
			OLED_ShowString(x1+30*3,y1,(uint8_t *)"24V",16,0);
		break;
		case 2:
			OLED_ShowString(x1,y1,(uint8_t *)"05V",16,0);
			OLED_ShowString(x1+30,y1,(uint8_t *)"12V",16,1);
			OLED_ShowString(x1+30*2,y1,(uint8_t *)"20V",16,0);
			OLED_ShowString(x1+30*3,y1,(uint8_t *)"24V",16,0);
		break;
		case 3:
			OLED_ShowString(x1,y1,(uint8_t *)"05V",16,0);
			OLED_ShowString(x1+30,y1,(uint8_t *)"12V",16,0);
			OLED_ShowString(x1+30*2,y1,(uint8_t *)"20V",16,1);
			OLED_ShowString(x1+30*3,y1,(uint8_t *)"24V",16,0);
		break;
		case 4:
			OLED_ShowString(x1,y1,(uint8_t *)"05V",16,0);
			OLED_ShowString(x1+30,y1,(uint8_t *)"12V",16,0);
			OLED_ShowString(x1+30*2,y1,(uint8_t *)"20V",16,0);
			OLED_ShowString(x1+30*3,y1,(uint8_t *)"24V",16,1);
		break;
	}
}

//设置界面显示2:笔记本模式
void meun_disp_2(void)
{
	uint8_t x=25,y=35,x1=25,y1=15;
	char buf[10];
	meun.meun_select_max = 2;
	OLED_ShowChinese_HZ12(x,y,34);
	OLED_ShowChinese_HZ12(x+12,y,35);
	OLED_ShowChinese_HZ12(x+12*2,y,36);
	OLED_ShowString(x+12*3,y,(uint8_t *)":",12,0);
//	sprintf(buf,"%4.1fV",PL5500.OUT_V/1000.0);
//	OLED_ShowString(x+12*3+6,y,(uint8_t *)buf,12,0);
	switch(meun.meun_select)	
	{
		case 1:
			OLED_ShowString(x1,y1,(uint8_t *)"19.5V",16,1);
			OLED_ShowString(x1+30*2,y1,(uint8_t *)"20V",16,0);
		break;
		case 2:
			OLED_ShowString(x1,y1,(uint8_t *)"19.5V",16,0);
			OLED_ShowString(x1+30*2,y1,(uint8_t *)"20V",16,1);
		break;
	}
}

//设置界面显示3:自定义模式
void meun_disp_3(void)
{
	uint8_t x=25,y=35,x1=11,y1=17;
	char buf[10];
	meun.meun_select_max = 6;
	OLED_ShowChinese_HZ12(x,y,34);
	OLED_ShowChinese_HZ12(x+12,y,35);
	OLED_ShowChinese_HZ12(x+12*2,y,36);
	OLED_ShowString(x+12*3,y,(uint8_t *)":",12,0);
//	sprintf(buf,"%4.1fV",PL5500.OUT_V/1000.0);
//	OLED_ShowString(x+12*3+6,y,(uint8_t *)buf,12,0);
	switch(meun.meun_select)	
	{
		case 1:
			OLED_ShowString(x1,y1,(uint8_t *)"+0.1V",12,1);
			OLED_ShowString(x1+40,y1,(uint8_t *)"+0.5V",12,0);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"+2.0V",12,0);
		break;
		case 2:
			OLED_ShowString(x1,y1,(uint8_t *)"+0.1V",12,0);
			OLED_ShowString(x1+40,y1,(uint8_t *)"+0.5V",12,1);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"+2.0V",12,0);
		break;
		case 3:
			OLED_ShowString(x1,y1,(uint8_t *)"+0.1V",12,0);
			OLED_ShowString(x1+40,y1,(uint8_t *)"+0.5V",12,0);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"+2.0V",12,1);
		break;
		
		case 4:
			OLED_ShowString(x1,y1,(uint8_t *)"-0.1V",12,1);
			OLED_ShowString(x1+40,y1,(uint8_t *)"-0.5V",12,0);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"-2.0V",12,0);
		break;
		case 5:
			OLED_ShowString(x1,y1,(uint8_t *)"-0.1V",12,0);
			OLED_ShowString(x1+40,y1,(uint8_t *)"-0.5V",12,1);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"-2.0V",12,0);
		break;
		case 6:
			OLED_ShowString(x1,y1,(uint8_t *)"-0.1V",12,0);
			OLED_ShowString(x1+40,y1,(uint8_t *)"-0.5V",12,0);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"-2.0V",12,1);
		break;
	}
}

//设置界面显示4:背光时间
void meun_disp_4(void)
{
	uint8_t x=25,y=35,x1=11,y1=17;
	char buf[10];
	meun.meun_select_max = 6;
	OLED_ShowChinese_HZ12(x,y,34);
	OLED_ShowChinese_HZ12(x+12,y,35);
	OLED_ShowChinese_HZ12(x+12*2,y,36);
	OLED_ShowString(x+12*3,y,(uint8_t *)":",12,0);
	sprintf(buf,"%2dS",meun.set.meun_set_light_time);
	OLED_ShowString(x+12*3+6,y,(uint8_t *)buf,12,0);
	switch(meun.meun_select)	
	{
		case 1:
			OLED_ShowString(x1,y1,(uint8_t *)"+1S",12,1);
			OLED_ShowString(x1+40,y1,(uint8_t *)"+5S",12,0);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"+20S",12,0);
		break;
		case 2:
			OLED_ShowString(x1,y1,(uint8_t *)"+1S",12,0);
			OLED_ShowString(x1+40,y1,(uint8_t *)"+5S",12,1);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"+20S",12,0);
		break;
		case 3:
			OLED_ShowString(x1,y1,(uint8_t *)"+1S",12,0);
			OLED_ShowString(x1+40,y1,(uint8_t *)"+5S",12,0);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"+20S",12,1);
		break;
		
		case 4:
			OLED_ShowString(x1,y1,(uint8_t *)"-1S",12,1);
			OLED_ShowString(x1+40,y1,(uint8_t *)"-5S",12,0);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"-20S",12,0);
		break;
		case 5:
			OLED_ShowString(x1,y1,(uint8_t *)"-1S",12,0);
			OLED_ShowString(x1+40,y1,(uint8_t *)"-5S",12,1);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"-20S",12,0);
		break;
		case 6:
			OLED_ShowString(x1,y1,(uint8_t *)"-1S",12,0);
			OLED_ShowString(x1+40,y1,(uint8_t *)"-5S",12,0);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"-20S",12,1);
		break;
	}
}

void meun_disp_5(void)
{
	uint8_t x=25,y=35,x1=11,y1=17;
	char buf[10];
	meun.meun_select_max = 6;
	OLED_ShowChinese_HZ12(x,y,34);
	OLED_ShowChinese_HZ12(x+12,y,35);
	OLED_ShowChinese_HZ12(x+12*2,y,36);
	OLED_ShowString(x+12*3,y,(uint8_t *)":",12,0);
	sprintf(buf,"%4.1fA",meun.set.meun_set_icharge/1000.0);
	OLED_ShowString(x+12*3+6,y,(uint8_t *)buf,12,0);
	switch(meun.meun_select)
	{
		case 1:
			OLED_ShowString(x1,y1,(uint8_t *)"+0.1A",12,1);
			OLED_ShowString(x1+40,y1,(uint8_t *)"+0.5A",12,0);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"+2A",12,0);
		break;
		case 2:
			OLED_ShowString(x1,y1,(uint8_t *)"+0.1A",12,0);
			OLED_ShowString(x1+40,y1,(uint8_t *)"+0.5A",12,1);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"+2A",12,0);
		break;
		case 3:
			OLED_ShowString(x1,y1,(uint8_t *)"+0.1A",12,0);
			OLED_ShowString(x1+40,y1,(uint8_t *)"+0.5A",12,0);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"+2A",12,1);
		break;
		
		case 4:
			OLED_ShowString(x1,y1,(uint8_t *)"-0.1A",12,1);
			OLED_ShowString(x1+40,y1,(uint8_t *)"-0.5A",12,0);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"-2A",12,0);
		break;
		case 5:
			OLED_ShowString(x1,y1,(uint8_t *)"-0.1A",12,0);
			OLED_ShowString(x1+40,y1,(uint8_t *)"-0.5A",12,1);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"-2A",12,0);
		break;
		case 6:
			OLED_ShowString(x1,y1,(uint8_t *)"-0.1A",12,0);
			OLED_ShowString(x1+40,y1,(uint8_t *)"-0.5A",12,0);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"-2A",12,1);
		break;
	}
}


void meun_disp_6(void)
{
	uint8_t x=25,y=35,x1=11,y1=17;
	char buf[10];
	meun.meun_select_max = 6;
	OLED_ShowChinese_HZ12(x,y,34);
	OLED_ShowChinese_HZ12(x+12,y,35);
	OLED_ShowChinese_HZ12(x+12*2,y,36);
	OLED_ShowString(x+12*3,y,(uint8_t *)":",12,0);
	sprintf(buf,"%4.1fA",meun.set.meun_set_idischarge/1000.0);
	OLED_ShowString(x+12*3+6,y,(uint8_t *)buf,12,0);
	switch(meun.meun_select)
	{
		case 1:
			OLED_ShowString(x1,y1,(uint8_t *)"+0.1A",12,1);
			OLED_ShowString(x1+40,y1,(uint8_t *)"+0.5A",12,0);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"+2A",12,0);
		break;
		case 2:
			OLED_ShowString(x1,y1,(uint8_t *)"+0.1A",12,0);
			OLED_ShowString(x1+40,y1,(uint8_t *)"+0.5A",12,1);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"+2A",12,0);
		break;
		case 3:
			OLED_ShowString(x1,y1,(uint8_t *)"+0.1A",12,0);
			OLED_ShowString(x1+40,y1,(uint8_t *)"+0.5A",12,0);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"+2A",12,1);
		break;
		
		case 4:
			OLED_ShowString(x1,y1,(uint8_t *)"-0.1A",12,1);
			OLED_ShowString(x1+40,y1,(uint8_t *)"-0.5A",12,0);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"-2A",12,0);
		break;
		case 5:
			OLED_ShowString(x1,y1,(uint8_t *)"-0.1A",12,0);
			OLED_ShowString(x1+40,y1,(uint8_t *)"-0.5A",12,1);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"-2A",12,0);
		break;
		case 6:
			OLED_ShowString(x1,y1,(uint8_t *)"-0.1A",12,0);
			OLED_ShowString(x1+40,y1,(uint8_t *)"-0.5A",12,0);
			OLED_ShowString(x1+40*2,y1,(uint8_t *)"-2A",12,1);
		break;
	}
}


3.3电路原理图和PCB效果图

image.png

PCB图:

image.png

image.png


最后实物测试图片:

image.pngimage.png





关键词: STM32F103C8     ADS1256     电流     电压    

院士
2024-10-30 11:22:39     打赏
2楼

这代码与实验相当详细了


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]