STM32内部AD采样程序--运行通过(测量电压范围0~33V)(运行通过的ARM
stm32 ADC多通道采样例程(HAL库)
Stm32 基于HAL库ADC多通道采样例程1、用cubemx建立工程,cubemx 5.3.0版本,芯片型号:stm32f103zet6(1)开启外部高速时钟HSE,配置系统时钟为72M注意:ADC1时钟配置为9MHz(2)配置串口1,设置好波特率并开启串口中断2、启用ADC1 通道1,3,4,5,6注意要先设置好通道数量才能配置,各自ADC通道的参数。
Rank 是转换顺序,我们按1,2,3,4,5的顺序分别对应ADC1通道0,1,4,5,6。
多通道采样要开启扫描工作模式,在这里我们还有开启连续转换方式,连续转换是在ADC转换按照约定的转换顺序全部通道完成一次转换后,又自动启动下一次转换。
3、启用ADC转换DMA传输,多通道转换时要启用ADC的DMA传输,才能在相应的通道转换完成后,DMA自动去获取转换值。
中断方式没法在多通道采样时使用,因为在多通道扫描模式下,只有在最后一个通道转换结束时才会产生中断请求。
而ADC数据寄存器是共用的,这时候进入中断取值只能得到一个通道的数值。
4、到此,基础配置和ADC通道配置已经完成,接着我们设置工程名称和保存路径等就可以了,一般工程名和保存路径最好不要有中文,不然可能会出现一些意想不到的问题,在测试的过程中就遇到工程名或者保存路径中都用英文但是词组名称之间用空格隔开,在打开生成的工程文件后,向新建的分类文件夹中添加自己写的xxx.c文件,就导致keil软件卡死,不知道是keil软件还是cubemx的问题。
5、设置好工程名称和路径后就可以生成代码了,生成代码后我们选择打开工程。
接着我们开始编写代码(1)首先我们要修改main函数的一个错误,就是在初始化时要把MX_DMA_Init()函数放在MX_ADC1_Init()函数之前执行,cubemx生成代码时MX_DMA_Init()是在ADC初始化函数之后。
如果在后面则转换时打印输出的ADC值,大多数都为0,具体原因就不知道是怎么回事了,应该是cubemx这个版本还不太稳定。
STM32多通道ADC采集详解(DMA模式和非DMA模式)
STM32多通道ADC采集详解(DMA模式和非DMA模式)在非DMA模式下,ADC采集的数据是通过CPU直接读取的,采集效率相对较低,但是编程相对简单。
首先,需要初始化ADC模块的工作模式(单通道、多通道等)和采样时间。
然后,使能ADC模块,并配置所需的通道和采样时间。
接着,设置采样序列,指定要采集的通道和相应的排列顺序。
在采集数据时,首先需要设置ADC转换模式和采样时间,然后开始转换,并等待转换完成。
转换完成后,通过读取ADC_DR寄存器可以获取转换结果。
如果需要采集多个通道的数据,可以通过设置ADCSQR中的SQx位来启动下一次转换。
在DMA模式下,ADC采集的数据是通过DMA控制器传输到指定的内存区域,采集效率较高,适合数据量较大的应用场景。
与非DMA模式相比,DMA模式下的配置需要额外设置DMA控制器的工作模式(单次传输、循环传输等)和传输数据的目的地地址。
在采集数据前,需要设置DMA传输的目的地地址,并使能DMA传输。
在开启ADC转换后,DMA控制器会根据设置的目的地地址来自动传输数据,无需CPU干预。
采集完成后,CPU可以通过检查DMA传输完成标志位来判断数据是否已传输完毕。
总结:
使用非DMA模式的ADC采集相对简单而容易上手,适用于数据量较小且对实时性要求不高的应用场景。
DMA模式下的ADC采集效率更高,适用于数据量较大且对实时性要求较高的应用场景。
无论是DMA模式还是非DMA模式,都需要根据具体的应用需求来选择合适的模式。
在使用DMA模式时,还需要注意合理设置DMA传输的目的地地址和传输模式,以充分发挥DMA的优势。
STM32单片机的ADC多通道采样
如果设计电路图的话,可以参考这种思路。
我的收获
1引脚初始化的时候需要注意
每一个ADC通道都对应一个GPIO引脚,看图中的ADC123_IN10,表示
这个引脚(PC0)可以配置为ADC1的通道10,或者是ADC2的通道10,或
者是ADC3的通道10,这个地方非常重要,涉及到后面ADC初始化时函数
STM32单片机的ADC多通道采样
一单通道采样
参考资料:
《STM32库开发实战指南》
原理性质的东西还是少讲,因为上面那本书里面讲解的很详细了,直接来
看硬件电路图
这里使用的是3362电位器(10K),即用STM32来测量PB0和GND两
端的电压,这样的电路设计比较简单也容易理解,但是存在一定的弊端,下
的调用。
比如当我们使能ADC时,我们调用的函数是
ADC_Cmd();1
如果我们使用的是ADC1,那幺上面函数的写法就应该是
ADC_Cmd(ADC1,ENABLE);1
相应的如果是ADC2,那幺上面函数的写法就是
ADC_Cmd(ADC2,ENABLE);1
另外需要注意的是,我们这里的ADC使用了DMA,所以如果你使用的
是ADC1,那幺对应DMA就应该是DMA1的通道1
如果使用的是ADC2或者是ADC3就需要自己去查找手册,看看对应的
是哪个DMA的那个通道。
在后面上传的程序中可以看到DMA初始化的时候有这幺一条语句
DMA_Init(DMA1_Channel1);1
这就是初始化DMA1的通道1
相应的
DMA_Cmd(DMA1_Channel1,ENABLE);1
就是使能DMA1的通道1
STM32中AD采样的三种方法分析
STM32中AD采样的三种⽅法分析 在进⾏STM32F中AD采样的学习中,我们知道AD采样的⽅法有多种,按照逻辑程序处理有三种⽅式,⼀种是查询模式,⼀种是中断处理模式,⼀种是DMA模式。
三种⽅法按照处理复杂⽅法DMA模式处理模式效率最⾼,其次是中断处理模式,最差是查询模式,相信很多学者在学习AD采样程序时,很多例程采⽤DMA模式,在这⾥我针对三种程序进⾏分别分析。
1、AD采样查询模式 在AD采样查询模式中,我们需要注意的是IO⼝的初始化配置,这⾥我采⽤PA2作为模拟采集的引脚(AIN2)和串⼝3作为打印输出。
具体如下:建⽴⼀个USART3.C和USART3.H⽂件,其程序为: #include "usart3.h" #include "stdarg.h" u8 SendBuff[SENDBUFF_SIZE]; void USART3_Config(void) { //定义结构体 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; //开启外部时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE ); // USART3 GPIO config GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOAtiNG; GPIO_Init(GPIOB, &GPIO_InitStructure); //USART3 mode config USART_ART_BaudRate = 115200; USART_ART_WordLength = USART_WordLength_8b; USART_ART_StopBits = USART_StopBits_1; USART_ART_Parity = USART_Parity_No; USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART3, &USART_InitStructure); USART_Cmd(USART3, ENABLE); } 其次建⽴⼀个ADC.C和⼀个ADC.H⽂件,其中ADC.C中程序为: void ADC1_Init(void) { ADC1_GPIO_Config(); ADC1_Mode_Config(); } static void ADC1_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; //开启外部时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA,ENABLE); //配置PA2引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //配置为模拟输⼊ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //调⽤库函数 GPIO_Init(GPIOA, &GPIO_InitStructure); } static void ADC1_Mode_Config(void) { //ADC1_ configuration ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独⽴ADC模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; //禁⽌扫描模式 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //开启连续转换模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不使⽤外部触发转换 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //采集数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; //要转换的通道数⽬1 ADC_Init(ADC1,&ADC_InitStructure); //配置ADC时钟,为PCLK2的8分频,即9Mhz RCC_ADCCLKConfig(RCC_PCLK2_Div8); //配置ADC1的通道2位55.5个采集周期 ADC_RegularChannelConfig(ADC1,ADC_Channel_2, 1, ADC_SampleTime_55Cycles5); ADC_Cmd(ADC1,ENABLE); //复位校准寄存器 ADC_ResetCalibration(ADC1); //等待校准寄存器复位完成 while(ADC_GetResetCalibrationStatus(ADC1)); //ADC校准 ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); //由于没有使⽤外部触发,所以使⽤软件触发ADC转换 ADC_SoftwareStartConvCmd(ADC1,ENABLE); } 然后在主函数main中其程序代码如下: int main(void) { USART3_Config(); ADC1_Init(); printf("输⼊ADC值"); while(1) { ADC_ConvertedValue = ADC_GetConversionValue(ADC1); ADC_ConvertedValueLocal =(float)ADC_ConvertedValue/4096*3.3; //读取ADC转换的值 printf("\r\n the current AD value = 0x%04X \r\n",ADC_ConvertedValue); printf("\r\n the current AD value = %f V \r\n",ADC_ConvertedValueLocal); Delay(0xFFFFEE); } } 这样采⽤查询的⽅法即可以采集ADC的电压值,⼀个值为16进制转换的值,⼀个是转换计算的值。
STM32 ADC采样时间、采样周期、采样频率计算方法
STM32 ADC 采样时间、采样周期、采样频率计算
方法
ADC 转换就是输入模拟的信号量,单片机转换成数字量。
读取数字量必须等转换完成后,完成一个通道的读取叫做采样周期。
采样周期一般来说=转换时间+读取时间。
而转换时间=采样时间+12.5 个时钟周期。
采样时间是你通过寄存器告诉STM32 采样模拟量的时间,设置越长越精确
一STM32 ADC 采样频率的确定
1. :先看一些资料,确定一下ADC 的时钟:
(1),由时钟控制器提供的ADCCLK 时钟和PCLK2(APB2 时钟)同步。
CLK
控制器为ADC 时钟提供一个专用的可编程预分频器。
(2) 一般情况下在程序中将PCLK2 时钟设为与系统时钟相同
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);。
stm32内部AD采样程序
* Input : None* Output : None* Return : None*******************************************************************************/ void RCC_Configuration(void){ /* RCC system reset(for debug purpose) */RCC_DeInit();/* Enable HSE */RCC_HSEConfig(RCC_HSE_ON);/* Wait till HSE is ready */HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS){/* HCLK = SYSCLK */RCC_HCLKConfig(RCC_SYSCLK_Div1);/* PCLK2 = HCLK */RCC_PCLK2Config(RCC_HCLK_Div1);/* PCLK1 = HCLK/2 */RCC_PCLK1Config(RCC_HCLK_Div2);/* ADCCLK = PCLK2/4 */RCC_ADCCLKConfig(RCC_PCLK2_Div8);/* Flash 2 wait state */FLASH_SetLatency(FLASH_Latency_2);/* Enable Prefetch Buffer */FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/* PLLCLK = 8MHz * 9 = 56 MHz */RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/* Enable PLL */RCC_PLLCmd(ENABLE);/* Wait till PLL is ready */while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)}/* Select PLL as system clock source */RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/* Wait till PLL is used as system clock source */while(RCC_GetSYSCLKSource() != 0x08){}}/* Enable peripheral clocks --------------------------------------------------*/ /* Enable DMA clock */RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);/* Enable ADC1 and GPIOC clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);/* Enable USART1 and GPIOA clock */* Input : None* Output : None* Return : None*******************************************************************************/ void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;/* Configure (ADC Channel13) as analog input -------------------------*/= GPIO_Pin_3;= GPIO_Mode_AIN;GPIO_Init(GPIOC, &GPIO_InitStructure);as Output push-pull= GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;= GPIO_Speed_50MHz;= GPIO_Mode_Out_PP;GPIO_Init(GPIOF, &GPIO_InitStructure);}#ifdef DEBUG/******************************************************************************** Function Name : assert_failed* Description : Reports the name of the source file and the source line number * where the assert error has occurred.* Input : - file: pointer to the source file name* - line: assert error line source number* Output : None* Return : None*******************************************************************************/ void assert_failed(u8* file, u32 line){/* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* Infinite loop */while (1){}}#endif/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/ 参考文献:网络。
STM32三个ADC同步规则采样
STM32三个ADC同步规则采样同步采样⼀般应⽤于交流信号中,是指多个ADC的采集时刻完全同步。
在电⼒测量领域,经常会遇到需要同步采样的情况,⽐如同步采样电压电流信号,计算其相位差。
阻抗分析时,也需要对输⼊输出信号进⾏同步采集,分析其相位差和幅度,计算阻抗。
1.Mode选择为三重同步规则模式。
2.使能DMA连续请求。
3.外部触发源选择TIM2触发事件。
配置完成后,打开ADC2和ADC3的配置,可以看到,Mode已经⾃动配置为三重同步规则模式,且外部触发源也已经隐藏⽆法选择,因为三重同步规则模式下,三个ADC必须使⽤同⼀个外部触发源。
同时ADC2和ADC3的DMA也不需要配置,使⽤同⼀个DMA。
ADC2配置如下:ADC配置完成后,打开TIM2定时器,⽤于触发ADC采样。
TIM2时钟选择内部时钟(84MHz),选择触发事件为Update Event,⽤于触发ADC。
配置其分频系数和计数周期如下,则ADC的采样率为84MHz÷(83+1) ÷(199+1)=5000Hz。
uint8_t DMA_Flag = 0;void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){DMA_Flag = 1;}HAL_ADC_Start(&hadc1);HAL_ADC_Start(&hadc2);HAL_ADC_Start(&hadc3);//启动ADCHAL_ADCEx_MultiModeStart_DMA(&hadc1,(uint32_t*)adcbuf1,300);//启动同步规则模式及DMA,3个ADC,每次采样100个点*3 HAL_TIM_Base_Start(&htim2);//启动TIM2,⽤于触发ADC采样/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){if(DMA_Flag == 1)//AD转换完成标准{DMA_Flag = 0;HAL_TIM_Base_Stop(&htim2);HAL_ADCEx_MultiModeStop_DMA(&hadc1);HAL_ADC_Stop(&hadc1);HAL_ADC_Stop(&hadc2);HAL_ADC_Stop(&hadc3);//停⽌采样for(uint8_t i=0;i<100;i++)< span="">{sprintf(str,"$,%d,%d,%d",adcbuf1[i][0],adcbuf1[i][1],adcbuf1[i][2]);HAL_UART_Transmit(&huart1,(uint8_t*)str,strlen(str),100);//串⼝发送到上位机}HAL_ADC_Start(&hadc1);HAL_ADC_Start(&hadc2);HAL_ADC_Start(&hadc3);HAL_ADCEx_MultiModeStart_DMA(&hadc1,(uint32_t*)adcbuf1,300);HAL_TIM_Base_Start(&htim2);//重新启动采样}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */。
stm32adc采样频率计算
stm32adc采样频率计算1.前言本文将介绍如何计算S TM32微控制器中的AD C(模拟数字转换器)的采样频率。
我们将从基本原理开始,解释如何通过配置寄存器来实现所需的采样频率。
2.采样频率的定义在开始计算之前,让我们先明确什么是采样频率。
采样频率是指在模拟信号转换为数字信号时,获取模拟信号的速率。
它决定了系统对信号的精细程度和频率响应。
3. ST M32微控制器中的AD C模块S T M32微控制器通过其内置的AD C模块实现模拟信号的转换。
该模块可以设置为不同的采样频率,以满足不同应用的需求。
4. AD C采样频率的计算为了计算所需的A DC采样频率,我们需要考虑以下几个因素:4.1时钟频率A D C模块的时钟频率决定了其工作速度。
在S TM32微控制器中,时钟频率可以通过配置RC C(R es et an dC lo ck C on tr ol)寄存器来设置。
4.2A D C分辨率A D C模块的分辨率表示可以转换的模拟信号范围。
在S TM32微控制器中,分辨率可以通过配置AD C的C R寄存器来设置。
4.3A D C转换时间A D C转换时间表示进行一次模拟信号转换所需的时间。
它可以通过配置A DC的S MP R(Sam p le ti me)寄存器来设置。
4.4定时器的使用为了实现所需的采样频率,我们可以使用定时器来触发AD C的转换。
定时器的时钟频率、预分频因子和自动重装载寄存器的设置将影响AD C的采样频率。
5. AD C采样频率的计算公式根据以上因素,我们可以使用以下公式计算A DC的采样频率:采样频率=A DC时钟频率/(转换时间+12.5个A DC时钟周期)其中,转换时间表示A DC进行一次转换所需的时间(以秒为单位)。
6.示例为了更好地理解A DC采样频率的计算过程,我们来看一个示例。
假设:-A DC时钟频率为10M H z-转换时间为1u s根据以上假设和公式,我们可以计算出采样频率:采样频率=10M Hz/(1u s+12.5*(1/10M Hz))=800kH z因此,在这个示例中,A DC的采样频率为800kH z。
STM32的ADC的采样周期确定
我们可对其进行设置例如:
RCC_ADCCLKConfig(RCห้องสมุดไป่ตู้_PCLK2_Div4);
另外还有ADC时钟使能设置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|
RCC_APB2Periph_ADC2 |
RCC_APB2Periph_GPIOC,ENABLE);
1.:先看一些资料,确定一下ADC的时钟:
(1)、由时钟控制器提供的ADCCLK时钟和PCLK2(APB2时
钟)同步。CLK控制器为ADC时钟提供一个专用的可编程预分频器。
(2)、一般情况下在程序中将PCLK2时钟设为与系统时钟相同
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
每个通道可以以
不同的时间采样。
总转换时间如下计算:
TCONV =采样时间+ 12.5个周期
例如:
当ADCCLK=36MHz和239.5周期的采样时间
TCONV = 239.5 + 12.5 = 252周期= 7μs
若你采样的是1KHz的正弦波信号,采样了10000个点,则其中就有
70个周期。
STM32 ADC采样频率的确定
STM32的ADC的采样周期确定
采样频率的确定
1.首先确定ADC的时钟,这里需要看你的RCC的设置。在采用固
件库的基础上,设定ADC的采样频率相对来说是很容易的。
(1)由时钟控制器提供的ADCCLK时钟和PCLK2(APB2时钟)
同步。CLK控制器为ADC时钟提供一个专用的可编程预分频器。
stm32无刷电机驱动电流采样原理
无刷直流电机(BLDC)驱动技术在现代电子设备和工业应用中具有重要的地位,而STM32作为一款广泛应用于嵌入式系统的微控制器,其对于无刷电机驱动技术的支持更是备受青睐。
在无刷电机驱动技术中,电流采样原理是至关重要的环节,对于控制电机的性能和稳定性具有重要的影响。
本文将从深度和广度的角度,详细探讨STM32无刷电机驱动电流采样原理的相关知识。
一、STM32无刷电机驱动电流采样原理1. 电流采样原理概述在无刷电机的控制中,电流采样是一项至关重要的技术。
通过对电流进行精确的采样和测量,可以实现对电机的精准控制,提高系统的效率和性能。
而STM32作为一款强大的嵌入式控制器,其内置了丰富的模拟数字转换(ADC)模块,可以用于对电流进行准确的采样和测量。
2. STM32电流采样模块在STM32的电机驱动控制中,通常会采用采样电流值,通过数据处理和反馈控制实现对电机的精准控制。
STM32的ADC模块可以实现对电流信号的准确采样,并将采样值转换为数字信号,通过软件处理实现对电机的控制。
3. 电流采样原理详解在电流采样中,通常会将电流信号经过电流传感器进行采样,转换为电压信号。
然后通过ADC模块对这一电压信号进行采样和转换,得到数字化的电流数值。
这一数值可以用于计算电机的实时电流,并据此实现对电机的精确控制。
二、如何在STM32中实现无刷电机的精准电流采样1. 选择合适的电流传感器在实现无刷电机的精准电流采样时,首先需要选择合适的电流传感器。
常用的电流传感器包括霍尔效应传感器、霍尔电流传感器和磁阻电流传感器等,需要根据具体的应用场景和电机参数进行选择。
2. 配置STM32的ADC模块在实现精准电流采样时,需要对STM32的ADC模块进行详细的配置。
包括采样频率、分辨率、参考电压和数据对齐方式等,以确保电流信号的准确采样和转换。
3. 数据处理和反馈控制在得到电流的数字化数值后,需要通过软件算法进行数据处理和反馈控制。
stm32adc内部电压转换公式
stm32adc内部电压转换公式
STM32微控制器的内部参考电压为VREFINT,通常为1.2V。
在使用STM32的ADC时,可以利用VREFINT来进行内部电压转换。
转换公式如下所示:
VDDA = 实际供电电压。
VREFINT_CAL = 3.3V (STM32F1xx系列) 或 3.0V
(STM32F2xx/F4xx系列) 或 2.4V (STM32L1xx系列)。
对于STM32F1xx系列:
VREFINT = VREFINT_CAL / ADC_ConvertedValue.
实际电压值 = VREFINT 4096 / VDDA.
对于STM32F2xx/F4xx系列:
VREFINT = VREFINT_CAL / ADC_ConvertedValue.
实际电压值 = VREFINT VDDA / 4096。
对于STM32L1xx系列:
VREFINT = VREFINT_CAL / ADC_ConvertedValue.
实际电压值 = VREFINT VDDA / 4095。
在这些公式中,VDDA是实际供电电压,VREFINT_CAL是STM32
内部提供的参考电压值,ADC_ConvertedValue是ADC转换后的数值,一般为12位的数值(0-4095)。
通过这些公式,可以将ADC转换后
的数值转换为实际的电压数值,从而进行精确的电压测量。
需要注意的是,不同系列的STM32微控制器可能会有略微不同
的公式和参数,因此在具体使用时需要参考对应的数据手册或参考
手册来获取准确的转换公式。
stm32 ADC多通道采样例程(HAL库)
Stm32 基于HAL库ADC多通道采样例程1、用cubemx建立工程,cubemx 5.3.0版本,芯片型号:stm32f103zet6(1)开启外部高速时钟HSE,配置系统时钟为72M注意:ADC1时钟配置为9MHz(2)配置串口1,设置好波特率并开启串口中断2、启用ADC1 通道1,3,4,5,6注意要先设置好通道数量才能配置,各自ADC通道的参数。
Rank 是转换顺序,我们按1,2,3,4,5的顺序分别对应ADC1通道0,1,4,5,6。
多通道采样要开启扫描工作模式,在这里我们还有开启连续转换方式,连续转换是在ADC转换按照约定的转换顺序全部通道完成一次转换后,又自动启动下一次转换。
3、启用ADC转换DMA传输,多通道转换时要启用ADC的DMA传输,才能在相应的通道转换完成后,DMA自动去获取转换值。
中断方式没法在多通道采样时使用,因为在多通道扫描模式下,只有在最后一个通道转换结束时才会产生中断请求。
而ADC数据寄存器是共用的,这时候进入中断取值只能得到一个通道的数值。
4、到此,基础配置和ADC通道配置已经完成,接着我们设置工程名称和保存路径等就可以了,一般工程名和保存路径最好不要有中文,不然可能会出现一些意想不到的问题,在测试的过程中就遇到工程名或者保存路径中都用英文但是词组名称之间用空格隔开,在打开生成的工程文件后,向新建的分类文件夹中添加自己写的xxx.c文件,就导致keil软件卡死,不知道是keil软件还是cubemx的问题。
5、设置好工程名称和路径后就可以生成代码了,生成代码后我们选择打开工程。
接着我们开始编写代码(1)首先我们要修改main函数的一个错误,就是在初始化时要把MX_DMA_Init()函数放在MX_ADC1_Init()函数之前执行,cubemx生成代码时MX_DMA_Init()是在ADC初始化函数之后。
如果在后面则转换时打印输出的ADC值,大多数都为0,具体原因就不知道是怎么回事了,应该是cubemx这个版本还不太稳定。
STM32之ADC(内部基准电压,参考电压)
STM32之ADC(内部基准电压,参考电压)
转 STM32内部参照电压VREFIN的使⽤ https:///uncle_guo/article/details/50625660
每个STM32芯⽚都有⼀个内部的参照电压,相当于⼀个标准电压测量点,在芯⽚内部连接到ADC1的通道17。
根据数据⼿册中的数据,这个参照电压的典型值是1.20V,最⼩值是1.16V,最⼤值是1.24V。
这个电压基本不随外部供电电压的变化⽽变化。
不少⼈把这个参照电压与ADC的参考电压混淆。
ADC的参考电压都是通过Vref+提供的。
100脚以上的型号,Vref+引到了⽚外,引脚名称为Vref+;64脚和⼩于64脚的型号,Vref+在芯⽚内部与VCC信号线相连,没有引到⽚外,这样AD的参考电压就是VCC上的电压。
在ADC的外部参考电压波动,或因为Vref+在芯⽚内部与VCC相连⽽VCC变化的情况下,如果对于ADC测量的准确性要求不⾼时,可以使⽤这个内部参照电压得到ADC测量的电压值。
具体⽅法是在测量某个通道的电压值之前,先读出参照电压的ADC测量数值,记为ADrefint;再读出要测量通道的ADC转换数值,记为ADchx;则要测量的电压为:
Vchx = Vrefint * (ADchx/ADrefint)
其中Vrefint为参照电压=1.20V(STM32F107)。
如何⽤VDDA作为ADC参考电压,当测量信号电压超过这个范围可以⽤精密电阻分压或者放⼤器分压,或者选择合适的外部电压基准芯⽚。
STM32AD采样电压计算公式
STM32AD采样电压计算公式
在使⽤STM32的ADC进⾏检测电压时必须回涉及到电压值的计算,为了更⾼效率的获取电压,现在有以下三种⽅法:
你得到的结果是你当前AD引脚上的电压值相对于3.3V和4096转换成的数字.
假如你得到的AD结果是ADC_DR这个变量,他们存在以下关系:
ADC_DR/当前电压值 = 4096/3300毫伏如果你反过程想得到当前电压值,可以如下计算:
unsigned long Voltage;
Voltage = ADC_DR;
//---假设你得到的AD结果存放到ADC_DR这个变量中;
Voltage = (Voltage * 3300)/4096; //----你就得到了正确的电压结果,单位是mV
⼀般出于效率,我会们⾃⼰进⾏约分:
Voltage = (Voltage * 825)/1024; //----你就得到了正确的电压结果,单位是mV
⽽再进⼀步,效率会更⾼:
Voltage = (Voltage * 825)>>10; //----你就得到了正确的电压结果,单位是mV。
stm32 adc分贝算法
stm32 adc分贝算法STM32是一款广泛应用于嵌入式系统开发的微控制器系列,其中的ADC模块(模数转换器)可以用于将模拟信号转换为数字信号。
本文将针对STM32 ADC分贝算法进行讨论。
分贝(dB)是一种用于表示信号强度或功率比的单位。
在音频领域中,分贝通常用于表示声音的音量大小。
在STM32 ADC中,分贝算法可以用来测量模拟信号的强度,并将其转换为分贝值。
我们需要了解ADC的基本原理。
ADC通过对模拟信号进行采样和量化,将其转换为数字信号。
在STM32中,ADC的输入范围通常是0到Vref(参考电压)之间。
为了将ADC的输出值转换为分贝值,我们需要知道参考电压对应的分贝值。
常见的声音级别参考值是0分贝(dB)对应于最小可听到的声音,而100分贝(dB)对应于非常大的声音。
根据声音的级别和电压的关系,我们可以将参考电压(Vref)与0分贝和100分贝之间的线性关系联系起来。
假设我们将参考电压(Vref)设置为1V,我们可以将0分贝对应的电压值定义为V0,100分贝对应的电压值定义为V100。
然后,我们可以通过以下公式将ADC输出值转换为分贝值:dB = 20 * log10(Vadc / V0)其中,Vadc是ADC的输出值。
在实际应用中,我们可以通过实验测量来确定V0和V100的电压值。
首先,我们需要测量一个已知分贝级别(例如,60分贝)对应的声音电压值(例如,V60)。
然后,我们可以使用以下公式来计算V0和V100的电压值:V0 = V60 / (10 ^ (60/20))V100 = V0 * (10 ^ (100/20))通过测量和计算,我们可以得到V0和V100的电压值,并根据上述公式将ADC输出值转换为分贝值。
需要注意的是,ADC的精度和分辨率会影响分贝算法的准确性。
较高的ADC分辨率可以提供更准确的电压测量结果,从而得到更准确的分贝值。
在使用STM32的ADC进行分贝测量时,我们需要首先配置ADC的参数,包括参考电压(Vref)、采样率和分辨率等。
STM32ADC采样时间、采样周期、采样频率计算方法
STM32ADC采样时间、采样周期、采样频率计算方法
STM32 ADC 采样时间、采样周期、采样频率计算
方法
ADC 转换就是输入模拟的信号量,单片机转换成数字量。
读取数字量必须等转换完成后,完成一个通道的读取叫做采样周期。
采样周期一般来说=转换时间+读取时间。
而转换时间=采样时间+12.5 个时钟周期。
采样时间是你通过寄存器告诉STM32 采样模拟量的时间,设置越长越精确
一STM32 ADC 采样频率的确定
1. :先看一些资料,确定一下ADC 的时钟:
(1),由时钟控制器提供的ADCCLK 时钟和PCLK2(APB2 时钟)同步。
CLK 控制器为ADC 时钟提供一个专用的可编程预分频器。
(2) 一般情况下在程序中将PCLK2 时钟设为与系统时钟相同
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);。
stm32adc采样原理
stm32adc采样原理
STM32ADC采样原理主要涉及STM32芯片内部ADC模块的工作原理和采样过程中需要注意的一些细节问题。
STM32ADC采用的是逐次逼近式ADC转换技术,其采样速度快、噪声小、精度高、易于使用等优点,被广泛应用于各种控制系统中。
在STM32ADC采样过程中,需要注意的问题有:采样时序的控制、采样精度的控制、采样通道的选择、参考电压的设置等。
采样时序的控制主要包括采样开始时间、采样持续时间、采样间隔时间等方面的控制。
采样精度的控制则涉及到ADC的分辨率、采样率、转换时间等方面的控制。
采样通道的选择则需要根据具体应用的需要来选择不同的采样通道。
参考电压的设置则需要根据实际电路中的电压范围来进行设置,一般情况下选择内部参考电压或外部参考电压均可。
在STM32ADC采样过程中,需要注意的其他问题还包括ADC的校准、DMA的使用、中断的处理等方面。
ADC的校准是确保ADC精度的关键步骤,DMA的使用可以提高采样效率,中断的处理则可以提高系统的响应速度。
总之,STM32ADC采样原理是掌握STM32芯片内部ADC模块工作原理和采样过程中需要注意的一些细节问题的基础,对于掌握STM32的控制系统设计和开发具有重要意义。
- 1 -。
stm32adc的工作原理
stm32adc的工作原理
STM32ADC是一种基于STM32微控制器的模拟数字转换器,它的工作原理是将模拟信号转换为数字信号,以便于微控制器进行处理和分析。
在STM32ADC中,模拟信号通过采样和保持电路进行采样,然后经过模数转换器进行转换,最终输出数字信号。
在STM32ADC中,采样和保持电路的作用是将模拟信号进行采样,并将采样值保持在一个电容器中,以便于后续的转换。
采样和保持电路通常由一个开关和一个电容器组成,当开关关闭时,电容器会被充电,当开关打开时,电容器中的电压将被保持不变,以便于进行转换。
模数转换器是STM32ADC中最重要的部分,它的作用是将模拟信号转换为数字信号。
在STM32ADC中,模数转换器通常由一个比较器、一个计数器和一个数字到模拟转换器组成。
比较器的作用是将采样值与一个参考电压进行比较,计数器的作用是记录比较器输出的脉冲数,数字到模拟转换器的作用是将计数器的输出转换为数字信号。
在STM32ADC中,还有一些其他的部分,如参考电压源、时钟源和控制逻辑等。
参考电压源提供了一个稳定的参考电压,时钟源提供了一个稳定的时钟信号,控制逻辑则负责控制整个转换过程。
总的来说,STM32ADC的工作原理是将模拟信号转换为数字信号,
以便于微控制器进行处理和分析。
在转换过程中,采样和保持电路进行采样,模数转换器进行转换,参考电压源提供参考电压,时钟源提供时钟信号,控制逻辑控制整个转换过程。
通过这些部分的协同工作,STM32ADC能够实现高精度、高速度的模拟数字转换,为微控制器的应用提供了强大的支持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/******************************************************************************* * File Name : main.c* Author : Wuhan R&D Center, Embest* Date First Issued : 08/08/2008* Description : Main program body******************************************************************************** //* Includes ------------------------------------------------------------------*/ #include "stm32f10x_lib.h"#include"stdio.h"/* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ //#define ADC1_DR_Address ((u32)0x4001244C)float AD_value=0.0;u8 adc_1[6]={0};//用来存放经ADC转换后的电压值的每一位数值。
/* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ ADC_InitTypeDef ADC_InitStructure;//DMA_InitTypeDef DMA_InitStructure;//vu16 ADC_ConvertedValue;ErrorStatus HSEStartUpStatus;/* Private function prototypes -----------------------------------------------*/ void RCC_Configuration(void);void GPIO_Configuration(void);void SysTick_Configuration(void);#define LED1ON GPIO_SetBits(GPIOF,GPIO_Pin_0)#define LED1OFF GPIO_ResetBits(GPIOF,GPIO_Pin_0) //片选cs#define LED2ON GPIO_SetBits(GPIOF,GPIO_Pin_1)#define LED2OFF GPIO_ResetBits(GPIOF,GPIO_Pin_1)//复位rest#define LED3ON GPIO_SetBits(GPIOF,GPIO_Pin_2)#define LED3OFF GPIO_ResetBits(GPIOF,GPIO_Pin_2)//数据sdata#define LED4ON GPIO_SetBits(GPIOF,GPIO_Pin_3)#define LED4OFF GPIO_ResetBits(GPIOF,GPIO_Pin_3)//时钟sclk unsigned char Ver='A'; //驱动版本,默认为A版本,一共4个版本unsigned char zifu[]={/*-- 文字: --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: ! --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00,/*-- 文字: " --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x28,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: # --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x28,0x28,0xFC,0x28,0x50,0xFC,0x50,0x50,0x00,0x00,/*-- 文字: $ --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x20,0x78,0xA8,0xA0,0x60,0x30,0x28,0xA8,0xF0,0x20,0x00,/*-- 文字: % --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x48,0xA8,0xB0,0x50,0x28,0x34,0x54,0x48,0x00,0x00,/*-- 文字: & --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x20,0x50,0x50,0x78,0xA8,0xA8,0x90,0x6C,0x00,0x00,/*-- 文字: ' --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: ( --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x04,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x04,0x00,/*-- 文字: ) --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x40,0x20,0x10,0x10,0x10,0x10,0x10,0x10,0x20,0x40,0x00,/*-- 文字: * --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x20,0xA8,0x70,0x70,0xA8,0x20,0x00,0x00,0x00,/*-- 文字: + --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x20,0x20,0x20,0xF8,0x20,0x20,0x20,0x00,0x00,0x00,/*-- 文字: , --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x80,/*-- 文字: - --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: . --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,/*-- 文字: / --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x08,0x10,0x10,0x10,0x20,0x20,0x40,0x40,0x40,0x80,0x00,/*-- 文字: 0 --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00,/*-- 文字: 1 --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,/*-- 文字: 2 --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x70,0x88,0x88,0x10,0x20,0x40,0x80,0xF8,0x00,0x00,/*-- 文字: 3 --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x70,0x88,0x08,0x30,0x08,0x08,0x88,0x70,0x00,0x00,/*-- 文字: 4 --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x10,0x30,0x50,0x50,0x90,0x78,0x10,0x18,0x00,0x00,/*-- 文字: 5 --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xF8,0x80,0x80,0xF0,0x08,0x08,0x88,0x70,0x00,0x00,/*-- 文字: 6 --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x70,0x90,0x80,0xF0,0x88,0x88,0x88,0x70,0x00,0x00,/*-- 文字: 7 --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xF8,0x90,0x10,0x20,0x20,0x20,0x20,0x20,0x00,0x00,/*-- 文字: 8 --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x88,0x70,0x00,0x00, /*-- 文字: 9 --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x70,0x88,0x88,0x88,0x78,0x08,0x48,0x70,0x00,0x00,/*-- 文字: : --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x20,0x00,0x00,/*-- 文字: ; --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x20,0x00,/*-- 文字: < --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x00,0x00,/*-- 文字: = --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,/*-- 文字: > --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x40,0x20,0x10,0x08,0x04,0x08,0x10,0x20,0x40,0x00,0x00,/*-- 文字: ? --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x70,0x88,0x88,0x10,0x20,0x20,0x00,0x20,0x00,0x00,/*-- 文字: @ --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x70,0x88,0x98,0xA8,0xA8,0xB8,0x80,0x78,0x00,0x00,/*-- 文字: A --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x20,0x20,0x30,0x50,0x50,0x78,0x48,0xCC,0x00,0x00,/*-- 文字: B --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xF0,0x48,0x48,0x70,0x48,0x48,0x48,0xF0,0x00,0x00,/*-- 文字: C --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x78,0x88,0x80,0x80,0x80,0x80,0x88,0x70,0x00,0x00,/*-- 文字: D --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0x48,0xF0,0x00,0x00,/*-- 文字: E --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xF8,0x48,0x50,0x70,0x50,0x40,0x48,0xF8,0x00,0x00,/*-- 文字: F --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xF8,0x48,0x50,0x70,0x50,0x40,0x40,0xE0,0x00,0x00,/*-- 文字: G --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x38,0x48,0x80,0x80,0x9C,0x88,0x48,0x30,0x00,0x00,/*-- 文字: H --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xCC,0x48,0x48,0x78,0x48,0x48,0x48,0xCC,0x00,0x00,/*-- 文字: I --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00,/*-- 文字: J --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0xE0,0x00,/*-- 文字: K --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xEC,0x48,0x50,0x60,0x50,0x50,0x48,0xEC,0x00,0x00,/*-- 文字: L --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0x44,0xFC,0x00,0x00,/*-- 文字: M --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xD8,0xD8,0xD8,0xD8,0xA8,0xA8,0xA8,0xA8,0x00,0x00,/*-- 文字: N --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xDC,0x48,0x68,0x68,0x58,0x58,0x48,0xE8,0x00,0x00,/*-- 文字: O --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00,/*-- 文字: P --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xF0,0x48,0x48,0x70,0x40,0x40,0x40,0xE0,0x00,0x00,/*-- 文字: Q --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x70,0x88,0x88,0x88,0x88,0xE8,0x98,0x70,0x18,0x00,/*-- 文字: R --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xF0,0x48,0x48,0x70,0x50,0x48,0x48,0xEC,0x00,0x00,/*-- 文字: S --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x78,0x88,0x80,0x60,0x10,0x08,0x88,0xF0,0x00,0x00,/*-- 文字: T --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xF8,0xA8,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00,/*-- 文字: U --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xCC,0x48,0x48,0x48,0x48,0x48,0x48,0x30,0x00,0x00,/*-- 文字: V --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xCC,0x48,0x48,0x50,0x50,0x30,0x20,0x20,0x00,0x00,/*-- 文字: W --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xA8,0xA8,0xA8,0x70,0x50,0x50,0x50,0x50,0x00,0x00,/*-- 文字: X --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xD8,0x50,0x50,0x20,0x20,0x50,0x50,0xD8,0x00,0x00,/*-- 文字: Y --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xD8,0x50,0x50,0x20,0x20,0x20,0x20,0x70,0x00,0x00,/*-- 文字: Z --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xF8,0x90,0x10,0x20,0x20,0x40,0x48,0xF8,0x00,0x00,/*-- 文字: [ --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00,/*-- 文字: \ --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x40,0x40,0x40,0x20,0x20,0x10,0x10,0x10,0x08,0x00,0x00,/*-- 文字: ] --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00,/*-- 文字: ^ --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x20,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: _ --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,/*-- 文字: ` --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*-- 文字: a --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x38,0x48,0x3C,0x00,0x00,/*-- 文字: b --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xC0,0x40,0x40,0x70,0x48,0x48,0x48,0x70,0x00,0x00,/*-- 文字: c --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x40,0x40,0x38,0x00,0x00,/*-- 文字: d --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x18,0x08,0x08,0x38,0x48,0x48,0x48,0x3C,0x00,0x00, /*-- 文字: e --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x78,0x40,0x38,0x00,0x00,/*-- 文字: f --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x1C,0x20,0x20,0x78,0x20,0x20,0x20,0x78,0x00,0x00,/*-- 文字: g --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0x3C,0x48,0x30,0x40,0x78,0x44,0x38,/*-- 文字: h --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xC0,0x40,0x40,0x70,0x48,0x48,0x48,0xEC,0x00,0x00,/*-- 文字: i --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x70,0x00,0x00,/*-- 文字: j --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x10,0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0xE0,/*-- 文字: k --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xC0,0x40,0x40,0x5C,0x50,0x70,0x48,0xEC,0x00,0x00,/*-- 文字: l --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00,/*-- 文字: m --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0xF0,0xA8,0xA8,0xA8,0xA8,0x00,0x00,/*-- 文字: n --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0xF0,0x48,0x48,0x48,0xEC,0x00,0x00,/*-- 文字: o --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x48,0x48,0x30,0x00,0x00,/*-- 文字: p --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0xF0,0x48,0x48,0x48,0x70,0x40,0xE0,/*-- 文字: q --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x48,0x48,0x38,0x08,0x1C,/*-- 文字: r --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0xD8,0x60,0x40,0x40,0xE0,0x00,0x00,/*-- 文字: s --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0x78,0x40,0x30,0x08,0x78,0x00,0x00,/*-- 文字: t --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x20,0x20,0x70,0x20,0x20,0x20,0x18,0x00,0x00,/*-- 文字: u --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0xD8,0x48,0x48,0x48,0x3C,0x00,0x00,/*-- 文字: v --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0xEC,0x48,0x50,0x30,0x20,0x00,0x00,/*-- 文字: w --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x70,0x50,0x50,0x00,0x00,/*-- 文字: x --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0xD8,0x50,0x20,0x50,0xD8,0x00,0x00,/*-- 文字: y --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0xEC,0x48,0x50,0x30,0x20,0x20,0xC0,/*-- 文字: z --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x00,0x00,0x00,0x00,0x78,0x10,0x20,0x20,0x78,0x00,0x00,/*-- 文字: { --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x18,0x10,0x10,0x10,0x20,0x10,0x10,0x10,0x10,0x18,0x00,/*-- 文字: | --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,/*-- 文字: } --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x00,0x60,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0x60,0x00,/*-- 文字: ~ --*//*-- 宋体9; 此字体下对应的点阵为:宽x高=6x12 --*//*-- 宽度不是8的倍数,现调整为:宽度x高度=8x12 --*/0x40,0xA4,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, };unsigned char hanzi[]={/*---------------雨----------------*/0x00,0x4F,0xFE,0x4,0x7,0xFC,0x66,0x45,0x54,0x44,0x46,0x64,0x55,0x44,0x44,0x45, 0xC0,0x00,/*---------------亭----------------*/0x04,0x07,0xFC,0x00,0x01,0xF8,0x10,0x8F,0xFE,0x80,0x23,0xF8,0x04,0x00,0x40,0x1C, 0x00,0x00,/*---------------电----------------*/0x04,0x00,0x44,0x7F,0xE4,0x44,0x7F,0xC4,0x44,0x44,0x47,0xFC,0x44,0x00,0x42,0x03, 0xE0,0x00,/*---------------子----------------*/0x7F,0xC0,0x08,0x01,0x00,0x60,0x04,0x4F,0xFE,0x04,0x00,0x40,0x04,0x00,0x40,0x1C, 0x00,0x00,/*---------------我----------------*/0x0A,0x8F,0x24,0x12,0x0F,0xFE,0x12,0x01,0x64,0x3A,0x8D,0x10,0x13,0x21,0xCA,0x70, 0x60,0x00,/*---------------是----------------*/0x1F,0x81,0x08,0x1F,0x81,0x08,0x1F,0x80,0x00,0xFF,0xE2,0x40,0x37,0xC4,0xC0,0x87, 0xE0,0x00,/*---------------企----------------*/0x04,0x00,0x60,0x09,0x01,0x08,0x24,0x6C,0x40,0x17,0x81,0x40,0x14,0x01,0x40,0xFF, 0xE0,0x00,/*---------------鹅----------------*/0x30,0x8D,0xBC,0x52,0x4F,0xB4,0x52,0xC7,0x60,0xDB,0xE5,0x02,0x6B,0xE4,0xA2,0xC6, 0xC0,0x00,/*---------------我----------------*/0x0A,0x8F,0x24,0x12,0x0F,0xFE,0x12,0x01,0x64,0x3A,0x8D,0x10,0x13,0x21,0xCA,0x70, 0x60,0x00,/*---------------怕----------------*/0x21,0x02,0x20,0x27,0xEB,0x42,0xAC,0x2A,0x42,0x27,0xE2,0x42,0x24,0x22,0x42,0x27, 0xE0,0x00,/*---------------谁----------------*/0x45,0x02,0x48,0x0F,0xE0,0xC8,0xD7,0xE4,0x48,0x44,0x84,0x7E,0x54,0x86,0x7E,0x04, 0x00,0x00,/*-------------------------------*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,};void delayms(unsigned int ii)//1ms延时函数{unsigned int i,x;for (x=0;x<ii;x++){for (i=0;i<100;i++);}}void send(unsigned char value, unsigned char cd) //写8位数据 {unsigned char i,dt;LED1OFF;LED4OFF;if(cd == 0)LED3OFF;elseLED3ON;LED4ON;dt=value;for(i=0;i<8;i++){LED4OFF;if(dt&0x80)LED3ON;elseLED3OFF;dt=dt<<1;LED4ON;}LED1ON;//cs=1;}void readdata() //读数据{unsigned char i,j;unsigned char ch[6];send(0x09, 0); // 读数据LED1OFF;//cs=0;LED4OFF;//sclk=0;for (i=0;i<6;i++){ch[i]=0;for (j=0;j<8;j++){LED4ON;//sclk=1;if (!(GPIO_ReadOutputDataBit(GPIOF,GPIO_Pin_2)))//sdata==0){ch[i]=ch[i]|(1<<(7-j));}LED4OFF;//sclk=0;}}switch(ch[0]){case 255:Ver='A';break;case 127:Ver='B';break;case 0:if(ch[1]+ch[2]+ch[3]==0){Ver='D';}else{Ver='C';}break;}LED1ON;//cs=1;}void LCD_Initialize() //LCD初始化{unsigned char i;LED2ON;//rest=1;LED1ON;//cs=1;LED3OFF;//sdata=0;LED4ON;//sclk=1;LED2OFF;//rest=0;delayms(50);LED2ON;//rest=1;delayms(50);send(0x00, 0); // NOPdelayms(5);send(0x01, 0); // LCD Software Resetdelayms(5);send(0xC6, 0); // Initial Escapesend(0xB9, 0); // Refresh setsend(0x00, 1);readdata(); //读出数据send(0xB5, 0); // Gamma Curve Setsend(0x01, 1);send(0xbd, 0); //common driver output select//很重要的 if(Ver=='D'){send(0x04, 1);}else{send(0x00, 1);}send(0xBE, 0); // Power Controlsend(0x03, 1);send(0x11, 0); // Sleep outsend(0xBA, 0); // Power Controlsend(0x7F, 1);send(0x03, 1);send(0x36, 0); // 扫描方式if (Ver=='A'){send(0x00|0x08,1); //RGB}else{send(0x00,1); //RGB}send(0xB7, 0); // Temperature gradient setfor(i=0; i<14; i++){send(0, 1);}send(0x29, 0); //display ONsend(0x03, 0); // Booster Voltage ONdelayms(20); // Booster Voltage stabilisieren lassen send(0x20, 0); //display inversion OFFsend(0x25, 0); // Write contrastswitch(Ver) //对比度设置{case 'A':send(70, 1); //对比度设置break;case 'B':send(67, 1); //对比度设置break;case 'C'://send(74, 1);send(66, 1);// send(64, 1); //对比度设置break;case 'D': //对比度设置send(39, 1);break;}}//************************//颜色模式设置:color=1为4096色模式// :color=0为256色模式//************************void LCD_ColorSet(unsigned char Color){if (Color==1) {send(0x3a, 0); //interface pixel formatsend(0x03, 1); //0x03 为4096色,0x02为256色}else{send(0x3a, 0); //interface pixel formatsend(0x02, 1); //0x03 为4096色,0x02为256色send(0x2d, 0); //调色板设置if (Ver=='B'||Ver=='C'){//redsend(~0x00, 1);send(~0x02, 1);send(~0x03, 1);send(~0x04, 1);send(~0x05, 1);send(~0x06, 1);send(~0x08, 1);send(~0x0f, 1);//greensend(~0x00, 1);send(~0x02, 1);send(~0x03, 1);send(~0x04, 1);send(~0x05, 1);send(~0x06, 1);send(~0x08, 1);send(~0x0f, 1);//bluesend(~0x00, 1);send(~0x03, 1);send(~0x06, 1);send(~0x0f, 1);}else{//redsend(0x00, 1);send(0x02, 1);send(0x03, 1);send(0x04, 1);send(0x05, 1);send(0x06, 1);send(0x08, 1);send(0x0f, 1);//greensend(0x00, 1);send(0x02, 1);send(0x03, 1);send(0x04, 1);send(0x05, 1);send(0x06, 1);send(0x08, 1);send(0x0f, 1);//bluesend(0x00, 1);send(0x03, 1);send(0x06, 1);send(0x0f, 1);}}}void addset(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2) //坐标设置 4个参数依次为开始X,开始Y,结束x,结束Y{send(0x2a,0 );//column address setsend(x1,1 );send(x2,1 );send(0x2B,0 );//page address setsend(y1,1 );send(y2,1 );send(0x2C,0 );//memory write}//************************//清屏:color=1为4096色模式清屏// :color=0为256色模式清屏//************************void LCD_Clear(unsigned int value,unsigned char Color){unsigned char x, y;addset(0,0,97,66);if (Color==1){for(y = 0; y < 67; y ++){for(x = 0; x < 49;x ++){ send(value>>4,1);send(((value&0x0f)<<4)|(value>>8),1);send(value,1);}}}else{for(y = 0; y < 67; y ++){for(x = 0; x < 98; x ++){send(value,1);}}}}//在指定位置显示一个字符(8*12大小)//dcolor为内容颜色,gbcolor为背静颜色void showzifu(unsigned char x,unsigned char y,unsigned char value,unsigned char dcolor,unsigned char bgcolor){unsigned char i,j;unsigned char *temp=zifu;addset(x,y,x+7,y+11); //设置区域temp+=(value-32)*12;for(j=0;j<12;j++){for(i=0;i<8;i++){if((*temp&(1<<(7-i)))!=0){send(dcolor,1);}else{send(bgcolor,1);}}temp++;}}//在指定位置显示一个字符串(8*12大小)//dcolor为内容颜色,gbcolor为背静颜色void showzifustr(unsigned char x,unsigned char y,unsigned char *str,unsigned char dcolor,unsigned char bgcolor){unsigned char x1,y1;x1=x;y1=y;while(*str!='\0'){showzifu(x1,y1,*str,dcolor,bgcolor);x1+=7;str++;}}//在指定位置显示一个汉字(12*12大小)//dcolor为内容颜色,gbcolor为背静颜色void showhanzi(unsigned char x,unsigned char y,unsigned char value,unsigned char dcolor,unsigned char bgcolor){unsigned char i,j;unsigned char *temp=hanzi;addset(x,y,x+11,y+11); //设置区域temp+=value*18;for(j=0;j<18;j++){for(i=0;i<8;i++){if((*temp&(1<<(7-i)))!=0){send(dcolor,1);}else{send(bgcolor,1);}}temp++;}}void showdian(unsigned char x,unsigned char y,unsigned char dcolor,unsigned char bgcolor){addset(x,y,x+1,y+1); //设置区域send(dcolor,1);send(bgcolor,1);}void delay_1ms(unsigned int ii)//1ms延时函数{unsigned int i,x;for (x=0;x<ii;x++){for (i=0;i<12000;i++);//当i=12000时,就实现了1ms的延时。