【嵌入式系统实验】实验九 ADC实验

本文章参考网页https://blog.csdn.net/FML7169/article/details/94044285

1. 实验环境

(1)Keil uVision5
(2)STM32F407ZGT6

2. 实验内容

在开发板的LCD上画出电压的波形。
注意:
(1)波形反映的是电压的波动,比例可以自己决定,但要波动看上去比较明显;
(2)开始的时候波形是向右延伸,而满屏后应该让图形滚动起来。

3. 实验代码

【lcd.h】

void GUI_Init(void);//添加一个图形界面初始化的函数定义

【lcd.c】

//图形界面显示
 void GUI_Init()
{
    
       
    u16 x,y;
	  BACK_COLOR=BLACK;
	  //画虚线方格
		for(x=25;x<401;x=x+25)//画列,从第25个像素开始
			for(y=25;y<226;y=y+5)
				LCD_Fast_DrawPoint(x,y,GRAY);
		for(y=25;y<226;y=y+25)//画行
			for(x=25;x<401;x=x+5)
				LCD_Fast_DrawPoint(x,y,GRAY);
		//画坐标轴
		POINT_COLOR=YELLOW; //颜色为黄色
		LCD_DrawLine(25,25,400,25);//横上
		LCD_DrawLine(400,25,400,225);//竖右
		LCD_DrawLine(25,25,25,225); //竖左
		LCD_DrawLine(25,225,400,225);//横下
		POINT_COLOR=BLUE;//蓝色
		LCD_ShowString(0,15,40,16,12,"Volt");
		LCD_ShowString(400,225,50,16,12,"Time");		
		LCD_ShowString(0,150,40,16,12,"3V");
		LCD_ShowString(30,600,200,16,16,"Author:3170602001");	
	    LCD_ShowString(30,620,200,16,16,"Explorer STM32F4");	
		LCD_ShowString(30,640,200,16,16,"ADC TEST");	
		LCD_ShowString(30,660,200,16,16,"ATOM@ALIENTEK");
		LCD_ShowString(30,680,200,16,16,"2020/9/15");
		LCD_ShowString(30,700,200,16,16,"ADC1_CH5_VAL:");	      
	    LCD_ShowString(30,720,200,16,16,"ADC1_CH5_VOL:0.000V");	//先在固定位置显示小数点 

}

【main.c】

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "adc.h"

u16 adcx;//通道转换值
float temp;//暂存值
u16 value[17];//通道转换值数组
u16 count=0;//数组计数
//动态刷新
void ShowWave()
{
    
    
	  u16 x,y;//定义变量
		LCD_Fill(25,25,400,225,BLACK);//网格区域填充黑色 
		//画虚线方格
		for(x=25;x<401;x=x+25)//画列,从第25个像素开始
			for(y=25;y<226;y=y+5)
				LCD_Fast_DrawPoint(x,y,GRAY);
		for(y=25;y<226;y=y+25)//画行
			for(x=25;x<401;x=x+5)
				LCD_Fast_DrawPoint(x,y,GRAY);
		//画坐标轴
		POINT_COLOR=YELLOW; //颜色为黄色
		LCD_DrawLine(25,25,400,25);//横上
		LCD_DrawLine(400,25,400,225);//竖右
		LCD_DrawLine(25,25,25,225); //竖左
		LCD_DrawLine(25,225,400,225);//横下
}
//实现数组元素左移
void ValueMove()
{
    
    
	u8 i;//循环变量
	for(i=0;i<count-1;i++)
		value[i]=value[i+1];//左移
	count--;
}
void DrawWave()//显示波形
{
    
    
		u8 j;//循环变量
		POINT_COLOR=RED;//红色画笔
	  for(j=1;j<count;j++)//循环
		  LCD_DrawLine((j-1)*25+25,250-value[j-1],j*25+25,250-value[j]);//从[j-1]到[j]画线
}
int main(void)
{
    
     

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);    //初始化延时函数
	uart_init(115200);	//初始化串口波特率为115200
	LED_Init();					//初始化LED 
 	LCD_Init();         //初始化LCD接口
	Adc_Init();         //初始化ADC
	LCD_Clear(BLACK);		//清屏函数
	GUI_Init();         //图形界面初始化  
	while(1)
	{
    
     
    LED0=!LED0;//判断程序是否正常
		adcx=Get_Adc_Average(ADC_Channel_5,20);//获取通道5的转换值
		POINT_COLOR=BLUE;//设置字体为蓝色     
		LCD_ShowxNum(134,700,adcx,4,16,0);    //显示ADCC采样后的原始值
		temp=(float)adcx*(3.3/4096);          //获取计算后的带小数的实际电压值,比如3.1111
		adcx=temp;                            //赋值整数部分给adcx变量,因为adcx为u16整形
		LCD_ShowxNum(134,720,adcx,1,16,0);    //显示电压值的整数部分,3.1111的话,这里就是显示3
		temp-=adcx;                           //把已经显示的整数部分去掉,留下小数部分,比如3.1111-3=0.1111
		temp*=1000;                           //小数部分乘以1000,例如:0.1111就转换为111.1,相当于保留三位小数。
		LCD_ShowxNum(150,720,temp,3,16,0X80); //显示小数部分(前面转换为了整形显示),这里显示的就是111.
		delay_ms(250);
		value[count]=temp*3;										//记录通道值
		count++;															//计数递增
		if(count==17)  
		{
    
    			
			ValueMove();//实现数组元素左移
		}			

		ShowWave();//动态刷新	
		DrawWave();//显示波形
	}
}

4.注意事项

(1)使用清屏函数后不要立即画图
(2)实现图像滚动的方法:动态刷新

猜你喜欢

转载自blog.csdn.net/qq_41315788/article/details/108753699