MQ-135与STM32在TFTLCD上显示数据

自己从一个拿到模块丝毫不知道怎么操作的小白,到现在加班到十点的码畜,一切都因自己水平差,再加把劲吧!

废话少说,开始干起来吧:

耗材:正点原子精英版STM32F103ZET6*1;MQ-135模块一个;三根杜邦线(我用的是原子哥送的那种四联排线);TFTLCD1.3寸屏幕。

  • 连线:
  • 开发板的5V-------mq135的vcc;
    |开发板------------MQ135 |
    |5V------------------Vcc|
    |GND---------------GND |
    | GPIO口(我用PA1)—Aout |
    说明:ADC能与之复用用的GPIO口关系如下表。我选择PA1,因此可以看出我的选了ADC1和通道1.(记住这两个参数,在后面adc_Init()函数里会用到)

MQ-135与STM32在TFTLCD上显示数据_第1张图片
*附上实物连接图:
白线两端是MQ135的Vcc和开发板的5V;黑线两端都是地;红线两端是MQ135的AO端和你所倾向的GPIO口。
(之所以出这么保姆级别的教程,是因为我知道大量的人线都不会连,当初我就是,太惨了。哭唧唧)


接线结束:
讲一下重点吧:
1.正点原子的AD采集程序中:

  • stm32f10x_adc.c标准文件里有这个函数:
u16 Get_Adc(u8 ch) ;
*  我想说很明显它想说明ch是u8数据
* 但是我们看他的实例里面的采集AD数据代码:
adcx=Get_Adc_Average(ADC_Channel_1,10);
*其中点开ADC_Channel_1;发现它的宏定义如下:
#define ADC_Channel_1 (uint8_t)0x01
*到这儿我的机器便一直死机,但是将(u8 ch)改成(uint8_t ch)检测成功了

a.如图为采集ad函数。查看里面形参的定理
MQ-135与STM32在TFTLCD上显示数据_第2张图片
b.发现数据类型uint8_t
在这里插入图片描述

c.将get_adc的形参改成这样:
MQ-135与STM32在TFTLCD上显示数据_第3张图片

你可知道,这一点我用了四个小时才判断出来。把ad的寄存器学了一遍。直至最后才开始怀疑这里。基础不牢啊!!
2.
上代码:
main函数:

#include "delay.h"
#include "sys.h"
#include "tftlcd.h" 	 
#include "mq135.h"
#include "stdio.h"
int main(void)
{	 
	u8 t=0;			    
	u16 adcx;		
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	LCD_Init();			   		//初始化LCD  
	LCD_Clear(MAGENTA);
	Adc_Init();
	POINT_COLOR = RED;
	BACK_COLOR = WHITE;
	LCD_ShowString(0, 100, 240, 32, 32, "adc");
	LCD_ShowString(0, 140, 240, 24, 24, "vol");
	POINT_COLOR = WHITE;
	BACK_COLOR = BLUE;		 
 	while(1)
	{	
		if(t%10==0)			//每100ms读取一次
		{	
			adcx=Get_Adc(ADC_Channel_1);			
			LCD_ShowNum(0,200,adcx,4,16);		
		}				   
	 	delay_ms(100);
		t++;
		delay_ms(1000);
	}
}



MQ135程序:

#include "mq135.h"
#include "stm32f10x_adc.h"
 #include "delay.h"
//////////////////////////////////////////////////////////////////////////////////	 
///////////////////////////////////////////////////////////////// 
	   
		   
//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~3																	   
void  Adc_Init(void)
{ 	
	ADC_InitTypeDef ADC_InitStructure; 
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1	, ENABLE );	  //使能ADC1通道时钟
 

	RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M

	//PB0 作为模拟通道输入引脚                         
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;		//模拟输入引脚
	GPIO_Init(GPIOA, &GPIO_InitStructure);	

	ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值

	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	//ADC工作模式:ADC1和ADC2工作在独立模式
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;	//模数转换工作在单通道模式
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;	//模数转换工作在单次转换模式
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//转换由软件而不是外部触发启动
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	//ADC数据右对齐
	ADC_InitStructure.ADC_NbrOfChannel = 1;	//顺序进行规则转换的ADC通道的数目
	ADC_Init(ADC1, &ADC_InitStructure);	//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   

  
	ADC_Cmd(ADC1, ENABLE);	//使能指定的ADC1
	
	ADC_ResetCalibration(ADC1);	//使能复位校准  
	 
	while(ADC_GetResetCalibrationStatus(ADC1));	//等待复位校准结束
	
	ADC_StartCalibration(ADC1);	 //开启AD校准
 
	while(ADC_GetCalibrationStatus(ADC1));	 //等待校准结束
 
//	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//使能指定的ADC1的软件转换启动功能

}				  
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(uint8_t ch)   
{
  	//设置指定ADC的规则组通道,一个序列,采样时间
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );	//ADC1,ADC通道1,采样时间为239.5周期	  			    
  
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//使能指定的ADC1的软件转换启动功能	
	 
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

	return ADC_GetConversionValue(ADC1);	//返回最近一次ADC1规则组的转换结果
}




mq135头文件:

#include "sys.h"
void  Adc_Init(void);
u16 Get_Adc(u8 ch);

tftlcd.c:

自己去下载你那个型号尺寸的代码原封不动的放进你的点儿C(mq135.c/spi.c/tftlcd.c)目录下.头文件一样,放在这个目录下。

完事儿了。
效果图;
MQ-135与STM32在TFTLCD上显示数据_第4张图片
假装你看得见那个数据吧。。。。。


我来补充两句:

  • 本代码已经尽力的缩减额外的东西。目的是你能够完成mq135连线,gpio从模块处取得数据。并传输给lcd显示屏。
  • 理论上说。应该是通过dma在传感器和显示屏上传输的。所以我为你打开了门。别骄傲。
  • 去PDF教程上看一下AD的那几个寄存器
  • 学着用stlink在线对程序打断点,打开MDK的peripherals-》ad>ad1
    去看一下那些在pdf中枯燥的寄存器们,怎么动态的在变化。
  • 再去打开view-打开堆栈窗口,去看看你的ad接收值是怎么变化的。

  • 最后,希望你们别像我一样,到了大四才买单片机,到了5月才做毕业设计,到最后去一个初创公司上班。我曾流过无数次的泪水,也用‘’苔花如米小,也学牡丹开‘’来安慰自己。我眼高手低,我前后端通通学。我却一事不精,做了四年的搬运工,缝补匠。一事无成!
  • 如果你愿意听我说,去找个工作吧,实习兼职都行,比你自命清高的自学强太多了。

你可能感兴趣的:(嵌入式)