基于stm32f103c8t6浊度计
前言
本次设计的基于stm32f103c8t6浊度计主要由硬件部分加软件部分组成
硬件部分主要是IR333光源发射部分+红外接收管光源接受部分+放大电路+stm32f103c8t6主控芯片+lcd1602显示模块组成
软件部分主要是通过stm32cubemx配置管脚之后添加adc通道函数、lcd1602写命令函数、lcd1602读数据函数等生成的
一、硬件部分
发射接收及放大电路硬件部分:
LCD102显示硬件部分:
其中最主要的是信号放大电路,由于红外接收管接受的光信号过小,所以在他输入ad转换器之前必须进行信号的放大放大芯片可以选用LM324,部分仿真图如下图所示:
二、软件部分(主要函数块及总代码)
1.主函数部分
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 /
/ MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals /
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
/ USER CODE BEGIN 2 */
HAL_ADCEx_Calibration_Start(&hadc1);
HAL_ADC_Start_DMA(&hadc1,ADC_ConvertedValue,1);
HAL_Delay(400); //延时400ms,等液晶稳定
Lcd_Init(); // 液晶初始化函数*,设置液晶的工作模式*
unsigned char IN[]={0x20,0x20,0x20,0x20,0x44,0x69,0x67,0x69,
0x74,0x61,0x6c,0x3a};
unsigned char UN[]={0x20,0x20,0x20,0x20,0x41,0x6e,0x61,0x6c,
0x6f,0x67,0x3a,0x20};
//uint8_t num[10] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //0-9
/* USER CODE END 2 */
/* Infinite loop /
/ USER CODE BEGIN WHILE */
unsigned char i;
unsigned int tmp;
for(i=0;i<12;i++)
{
Lcd_Write_Command(0x80+i,1) ; //定位
Lcd_Write_Data((IN[0+i])); //写显示数据
HAL_Delay(1); //延时10ms
}
for(i=0;i<11;i++)
{
Lcd_Write_Command(0xc0+i,1) ; //定位
Lcd_Write_Data(UN[0+i]); //写显示数据
HAL_Delay(1); //延时10ms
}
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Lcd_Write_Command(0x80+12,1);//Lcd_Write_Command(0x92,1);
Lcd_Write_Data(ADC_ConvertedValue[0]/1000+0x30);
Lcd_Write_Command(0x80+13,1);
Lcd_Write_Data((ADC_ConvertedValue[0]%1000)/100+0x30);
Lcd_Write_Command(0x80+14,1);
Lcd_Write_Data((ADC_ConvertedValue[0]%100)/10+0x30);
Lcd_Write_Command(0x80+15,1);
Lcd_Write_Data(ADC_ConvertedValue[0]%10+0x30);
tmp=(unsigned int)(ADC_ConvertedValue[0]3.31000/4095);
Lcd_Write_Command(0xc0+11,1);
Lcd_Write_Data(tmp/1000+0x30);
Lcd_Write_Command(0xc0+13,1);
Lcd_Write_Data((tmp%1000)/100+0x30);
Lcd_Write_Command(0xc0+12,1);
Lcd_Write_Data(0x2e);
Lcd_Write_Command(0xc0+14,1);
Lcd_Write_Data((tmp%100)/10+0x30);
Lcd_Write_Command(0xc0+15,1);
Lcd_Write_Data(tmp%10+0x30);
}
/* USER CODE END 3 */
}
2.1602显示字符代码
unsigned char IN[]={0x20,0x20,0x20,0x20,0x44,0x69,0x67,0x69,
0x74,0x61,0x6c,0x3a};
unsigned char UN[]={0x20,0x20,0x20,0x20,0x41,0x6e,0x61,0x6c,
0x6f,0x67,0x3a,0x20};
//uint8_t num[10] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //0-9
/* USER CODE END 2 */
/* Infinite loop /
/ USER CODE BEGIN WHILE */
unsigned char i;
unsigned int tmp;
for(i=0;i<12;i++)
{
Lcd_Write_Command(0x80+i,1) ; //定位
Lcd_Write_Data((IN[0+i])); //写显示数据
HAL_Delay(1); //延时10ms
}
for(i=0;i<11;i++)
{
Lcd_Write_Command(0xc0+i,1) ; //定位
Lcd_Write_Data(UN[0+i]); //写显示数据
HAL_Delay(1); //延时10ms
}
3.1602初始化函数
void Lcd_Init( void ) //初始化
{
Lcd_Write_Command( 0x38,1); //显示模式设置
Lcd_Write_Command( 0x01,1); //显示清屏
Lcd_Write_Command( 0x06,1); //显示光标移动设置
Lcd_Write_Command( 0x0C,1); //显示开、光标不显示
}