当前位置: 首页 > news >正文

福清市建设局监督站网站济南市住房城乡建设网站

福清市建设局监督站网站,济南市住房城乡建设网站,企业网站设计wordpress,安卓开发环境目录 1. ADC简介 2. 逐次逼近型ADC#xff08;ADC0809#xff09; 3. ADC框图#xff08;STM32#xff09; 4. ADC基本结构 5. 输入通道 6. 转换模式 6.1 单次转换 6.1.1 非扫描模式 6.1.2 扫描模式 6.2 连续转换 6.2.1 非扫描模式 6.2.2 扫描模式… 目录 1.  ADC简介 2.  逐次逼近型ADCADC0809 3.  ADC框图STM32 4.  ADC基本结构 5.  输入通道 6.  转换模式 6.1  单次转换 6.1.1  非扫描模式 6.1.2  扫描模式 6.2  连续转换 6.2.1  非扫描模式 6.2.2  扫描模式 7.  触发控制 8.  转换时间 9.  代码编写 9.1  引脚使能 9.2  预分频器配置 9.3  ADC配置介绍 9.4  ADC相关配置 9.4.1  开启时钟 9.4.2  规组通道配置 9.4.3  ADC初始化 9.4.4  ADC使能 9.4.5  ADC校准 9.5  获取AD转换的值 10.  完整代码 1.  ADC简介 ADC全称是Analog-to-Digital Converter模拟-数字转换器一般我们把模拟信号(Analog signal) 用A来进行简写数字信号(digital signal) 用D来表示。主要用于将连续传输的模拟信号转换为数字信号便于数字系统如中央处理器CPU、微控制器MCU等对传输信息进行快速处理和分析。 模拟信号是指用连续变化的物理量所表达的信息如温度、湿度、压力、电压、电流等。ADC模块所采集的模拟信号是连续变化的电压或电流信号其数值在一定范围内连续变化如下所示 在单片机的使用中我们可以通过ADC的转换将引脚上连续变化的模拟电压转换为内存中存储的数字变量建立模拟电路到数字电路的桥梁。 ADC采样的实现方式主要有两种外接采样芯片和控制核心内部的采样模块。许多MCU和DSP内部集成了ADC模块。例如STM32F103C8T6具备一个12位的ADC1us的转换时间其电压输出范围在0~3.3V转换结果范围0~4095即2^12-1其ADC资源有ADC1、ADC210个外部输入通道。 2.  逐次逼近型ADCADC0809 我们先来了解一下ADC0809的工作原理。 首先是通道选择开关通过通道选择开关选择IN0~IN7其中的一路输入到这个点进行转换 然后是地址锁存和译码这里你想要选择哪一路需要将通道号放到ADDA、ADDB、ADDC这三个脚上然后通过ALE给出锁存信号对应的通道选择开关就会自动拨好了 比较器是一个电压比较器他可以判断两个输入信号电压的大小关系其中通道选择开关输入的是待测的电压另一端是DAC数模转换器的电压 这里待测电压是未知的但是DAC所出的电压是我们通过数模转换来的其编码是已知的我们通过比较器进行比较当待测电压大于DAC所示电压我们就调大DAC的值如果待测电压小于DAC所示电压我们就调小DAC的值直到待测电压等于DAC所示电压这样DAC的输入数据就是待测电压的数据我们就可以知道待测电压的编码类似于二分法。 得出待测电压的编码通过三态锁存缓冲器进行输出8位就有8根线12位就有12根 3.  ADC框图STM32 STM32F1系列其芯片内部有多达18个通道可测量16个外部和2个内部信号源 通道检测数据进入搭配模拟多路开关模拟多路开关将数据输出的“模拟至数字转换器”这里的作用类似于上面介绍的逐次逼近ADC将转换数据传至数据寄存器取出结果 对于这里我们可以将注入通道或者规则通道比作饭店上菜的菜单注入通道的通道相当于菜单上的菜菜单上有菜有数据厨房做菜注入通道寄存器接受数据菜单上有多少菜做多少从上往下一道一道做数据逐次注入 规则通道有16个通道也就是菜单上能写16个但是规则通道数据寄存器只有一个所以每当有新菜就会将之前的菜划掉只能保存最后一个数据这里就需要搭配DMA来使用作用就是当接收到一个数据之后将这个数据挪到其他地方去防止被覆盖 这里相当于ADC0809的START信号开始转换信号对于STM32的ADC触发ADC开始转换的信号又两种软件触发和硬件触发。 软件触发就是在程序中手动调用一条代码就可以启动转换。 硬件触发如下由于ADC需要经过一个固定时间转换一次因此我们需要通过定时器进行控制时间但是若是实时采集数据会频繁进入定时器频繁进入中断而中断又有优先级若是多处地方需要频繁进入中断这将会导致程序卡死不过对于这种需要频繁进入中断并且中断之进行简单的操作一般会有硬件的支持 这里需要注意一点ADC最大范围14MHz如果分频系数选择2或者4分频最大分别是36MHz和18MHz超范围了因此只能选择6或者8分频 4.  ADC基本结构 5.  输入通道 6.  转换模式 6.1  单次转换 6.1.1  非扫描模式 只有第一个序列1的位置有效在其中选择转换的通道例如选择通道2这样ADC就会对通道2进行模数转换过一会转换完成将其放到数据寄存器里将EOC标志位置1表示转换完成 6.1.2  扫描模式 其与非扫描模式不同的是非扫描模式只使用了序列1而扫描模式将下面序列使用了起来在结构体初始化时需要初始化通道数目 6.2  连续转换 6.2.1  非扫描模式 这个和单次转换非扫描模式有些类似但是不同的是这个在转换结束后不需要停止可以直接进行下一次转换不需要多次触发 6.2.2  扫描模式 这个就是在单次转换扫描模式基础上使其连续触发 7.  触发控制 ADC1和ADC2用于规则通道的外部触发 触发源类型EXTSEL[2:0]TIM1_CC1事件来自片上定时器的内部信号000TIM1_CC2事件001TIM1_CC3事件010TIM2_CC2事件011TIM3_TRGO事件100TIM4_CC4事件101EXTI线11/TIM8_TRGO事件外部引脚/来自片上定时器的内部信号110SWSTART软件控制位111 8.  转换时间 ADC转换步骤采样、保持、量化、编码 STM32的ADC的总转换时间为 采样时间12.5个ADC周期 例如 当ADCCLK14MHz采样时间为1.5个ADC周期 1.512.514个ADC周期1us 9.  代码编写 9.1  引脚使能 首先初始化GPIO口 void AD_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure); //将PA0引脚初始化为模拟输入} 9.2  预分频器配置 然后是RCC预分频器的配置找到stm32f10x_rcc.h找到 void RCC_ADCCLKConfig(uint32_t RCC_PCLK2); 其可以对APB2的72MHz时钟选择2、4、6、8分频输入到ADCCLK /** defgroup ADC_clock_source * {*/#define RCC_PCLK2_Div2 ((uint32_t)0x00000000) #define RCC_PCLK2_Div4 ((uint32_t)0x00004000) #define RCC_PCLK2_Div6 ((uint32_t)0x00008000) #define RCC_PCLK2_Div8 ((uint32_t)0x0000C000) #define IS_RCC_ADCCLK(ADCCLK) (((ADCCLK) RCC_PCLK2_Div2) || ((ADCCLK) RCC_PCLK2_Div4) || \((ADCCLK) RCC_PCLK2_Div6) || ((ADCCLK) RCC_PCLK2_Div8)) 例如设置成6分频 /*设置ADC时钟*/RCC_ADCCLKConfig(RCC_PCLK2_Div6); //选择时钟6分频ADCCLK 72MHz / 6 12MHz 9.3  ADC配置介绍 ADC相关配置存放在stm32f10x_adc相关文件内 /** defgroup ADC_Exported_Functions* {*/void ADC_DeInit(ADC_TypeDef* ADCx); void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct); void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct); void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState); void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState); void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState); void ADC_ResetCalibration(ADC_TypeDef* ADCx); FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx); void ADC_StartCalibration(ADC_TypeDef* ADCx); FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx); void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx); void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number); void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx); uint32_t ADC_GetDualModeConversionValue(void); void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv); void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx); void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length); void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset); uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel); void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog); void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold); void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel); void ADC_TempSensorVrefintCmd(FunctionalState NewState); FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG); ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT); void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT); 方便后续需要使用我们简单介绍一下 DeInit恢复缺省配置恢复默认初始状态Init初始化StructInit结构体初始化 void ADC_DeInit(ADC_TypeDef* ADCx); void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct); void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct); 用于给ADC上电 void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState); 用于开启DMA输出信号如果使用DMA转运数据需要调用这个 void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState); 用于中断输出控制 void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState); 复位校准获取复位校准状态 void ADC_ResetCalibration(ADC_TypeDef* ADCx); FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx); 开始校准获取开始校准状态 void ADC_StartCalibration(ADC_TypeDef* ADCx); FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx); ADC软件开始转换控制这个就是用于软件触发的函数 void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState); ADC获取软件开始转换状态 FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx); 用于间断模式控制第一个函数表示每隔几个通道间断一次第二个函数表示启用间断模式 void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number); void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState); 用于ADC规则组通道配置配置选定的ADC常规通道、其在序列器中的对应等级及其采样时间 void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime); ADCx: 其中x可以是1、2或3以选择ADC外设。 ADC_Channel: 要配置的ADC通道。 此参数可以是以下值之一arg ADC_Channel_0: ADC Channel0 selectedarg ADC_Channel_1: ADC Channel1 selectedarg ADC_Channel_2: ADC Channel2 selectedarg ADC_Channel_3: ADC Channel3 selectedarg ADC_Channel_4: ADC Channel4 selectedarg ADC_Channel_5: ADC Channel5 selectedarg ADC_Channel_6: ADC Channel6 selectedarg ADC_Channel_7: ADC Channel7 selectedarg ADC_Channel_8: ADC Channel8 selectedarg ADC_Channel_9: ADC Channel9 selectedarg ADC_Channel_10: ADC Channel10 selectedarg ADC_Channel_11: ADC Channel11 selectedarg ADC_Channel_12: ADC Channel12 selectedarg ADC_Channel_13: ADC Channel13 selectedarg ADC_Channel_14: ADC Channel14 selectedarg ADC_Channel_15: ADC Channel15 selectedarg ADC_Channel_16: ADC Channel16 selectedarg ADC_Channel_17: ADC Channel17 selected Rank: 在常规组序列器中的等级。该参数必须在1到16之间。 ADC_SampleTime: 要为所选通道设置的采样时间值。 此参数可以是以下值之一arg ADC_SampleTime_1Cycles5: 采样时间等于1.5个周期arg ADC_SampleTime_7Cycles5: 采样时间等于7.5个周期arg ADC_SampleTime_13Cycles5: 采样时间等于13.5个周期arg ADC_SampleTime_28Cycles5: 采样时间等于28.5个周期arg ADC_SampleTime_41Cycles5: 采样时间等于41.5个周期arg ADC_SampleTime_55Cycles5: 采样时间等于55.5个周期arg ADC_SampleTime_71Cycles5: 采样时间等于71.5个周期arg ADC_SampleTime_239Cycles5: 采样时间等于239.5个周期 获取AD转换的数据寄存器读取转换结果 uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx); 双ADC读取转换结果的函数 uint32_t ADC_GetDualModeConversionValue(void); 9.4  ADC相关配置 9.4.1  开启时钟 /*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //开启ADC1的时钟 9.4.2  规组通道配置 /*规则组通道配置*/ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //规则组序列1的位置配置为通道0 9.4.3  ADC初始化 /*ADC初始化*/ADC_InitTypeDef ADC_InitStructure; //定义结构体变量ADC_InitStructure.ADC_Mode ADC_Mode_Independent; //模式选择独立模式即单独使用ADC1ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; //数据对齐选择右对齐ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; //外部触发使用软件触发不需要外部触发ADC_InitStructure.ADC_ContinuousConvMode DISABLE; //连续转换失能每转换一次规则组序列后停止ADC_InitStructure.ADC_ScanConvMode DISABLE; //扫描模式失能只转换规则组的序列1这一个位置ADC_InitStructure.ADC_NbrOfChannel 1; //通道数为1仅在扫描模式下才需要指定大于1的数在非扫描模式下只能是1ADC_Init(ADC1, ADC_InitStructure); //将结构体变量交给ADC_Init配置ADC1 ADC_InitTypeDef相关参数介绍 typedef struct {uint32_t ADC_Mode; /*! 配置ADC以独立模式或双模工作。此参数可以是 ref ADC_mode 的值。 */FunctionalState ADC_ScanConvMode; /*! 指定转换是否在扫描多通道或单通道模式下进行。此参数可以设置为 ENABLE 或 DISABLE。 */FunctionalState ADC_ContinuousConvMode; /*! 指定转换是连续模式还是单次模式进行。此参数可以设置为 ENABLE 或 DISABLE。 */uint32_t ADC_ExternalTrigConv; /*! 定义用于启动常规通道的模拟到数字转换的外部触发。此参数可以是 ref ADC_external_trigger_sources_for_regular_channels_conversion 的值。 */uint32_t ADC_DataAlign; /*! 指定ADC数据对齐方式是左对齐还是右对齐。此参数可以是 ref ADC_data_align 的值。 */uint8_t ADC_NbrOfChannel; /*! 指定将通过序列器转换的ADC通道数量用于常规通道组。此参数的范围必须在1到16之间。 */ } ADC_InitTypeDef;9.4.4  ADC使能 /*ADC使能*/ADC_Cmd(ADC1, ENABLE); //使能ADC1ADC开始运行 9.4.5  ADC校准 /*ADC校准*/ADC_ResetCalibration(ADC1); //固定流程内部有电路会自动执行校准while (ADC_GetResetCalibrationStatus(ADC1) SET);ADC_StartCalibration(ADC1);while (ADC_GetCalibrationStatus(ADC1) SET); 9.5  获取AD转换的值 我们配置的是单次转换非扫描模式因此根据下图编写获取AD转换的值的代码 uint16_t AD_GetValue(void) {ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件触发AD转换一次while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) RESET); //等待EOC标志位即等待AD转换结束return ADC_GetConversionValue(ADC1); //读数据寄存器得到AD转换的结果 } 10.  完整代码 AD.c代码 #include stm32f10x.h // Device header/*** 函 数AD初始化* 参 数无* 返 回 值无*/ void AD_Init(void) {/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //开启ADC1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*设置ADC时钟*/RCC_ADCCLKConfig(RCC_PCLK2_Div6); //选择时钟6分频ADCCLK 72MHz / 6 12MHz/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure); //将PA0引脚初始化为模拟输入/*规则组通道配置*/ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //规则组序列1的位置配置为通道0/*ADC初始化*/ADC_InitTypeDef ADC_InitStructure; //定义结构体变量ADC_InitStructure.ADC_Mode ADC_Mode_Independent; //模式选择独立模式即单独使用ADC1ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; //数据对齐选择右对齐ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; //外部触发使用软件触发不需要外部触发ADC_InitStructure.ADC_ContinuousConvMode DISABLE; //连续转换失能每转换一次规则组序列后停止ADC_InitStructure.ADC_ScanConvMode DISABLE; //扫描模式失能只转换规则组的序列1这一个位置ADC_InitStructure.ADC_NbrOfChannel 1; //通道数为1仅在扫描模式下才需要指定大于1的数在非扫描模式下只能是1ADC_Init(ADC1, ADC_InitStructure); //将结构体变量交给ADC_Init配置ADC1/*ADC使能*/ADC_Cmd(ADC1, ENABLE); //使能ADC1ADC开始运行/*ADC校准*/ADC_ResetCalibration(ADC1); //固定流程内部有电路会自动执行校准while (ADC_GetResetCalibrationStatus(ADC1) SET);ADC_StartCalibration(ADC1);while (ADC_GetCalibrationStatus(ADC1) SET); }/*** 函 数获取AD转换的值* 参 数无* 返 回 值AD转换的值范围0~4095*/ uint16_t AD_GetValue(void) {ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件触发AD转换一次while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) RESET); //等待EOC标志位即等待AD转换结束return ADC_GetConversionValue(ADC1); //读数据寄存器得到AD转换的结果 }AD.h代码 #ifndef __AD_H #define __AD_Hvoid AD_Init(void); uint16_t AD_GetValue(void);#endif主函数代码 #include stm32f10x.h // Device header #include Delay.h #include OLED.h #include AD.huint16_t ADValue; //定义AD值变量 float Voltage; //定义电压变量int main(void) {/*模块初始化*/OLED_Init(); //OLED初始化AD_Init(); //AD初始化/*显示静态字符串*/OLED_ShowString(1, 1, ADValue:);OLED_ShowString(2, 1, Voltage:0.00V);while (1){ADValue AD_GetValue(); //获取AD转换的值Voltage (float)ADValue / 4095 * 3.3; //将AD值线性变换到0~3.3的范围表示电压OLED_ShowNum(1, 9, ADValue, 4); //显示AD值OLED_ShowNum(2, 9, Voltage, 1); //显示电压值的整数部分OLED_ShowNum(2, 11, (uint16_t)(Voltage * 100) % 100, 2); //显示电压值的小数部分Delay_ms(100); //延时100ms手动增加一些转换的间隔时间} }STM32学习笔记_时光の尘的博客-CSDN博客
http://www.w-s-a.com/news/995863/

相关文章:

  • 网站做系统叫什么软件吗注册域名需要实名认证吗
  • jsp网站开发教学视频ui设计风格
  • 注册网站建设开发怎么自己做导航网站
  • 设计做网站品牌咖啡主题网页界面设计
  • 个人网站制作总体设计宿迁房价2023年最新房价
  • 服装网站建设进度及实施过程马鞍山网站设计制作
  • 郑州网站优化顾问济宁网站制作
  • 网站开发简单吗网站引导页分为三个板块设计风格
  • 湖南做网站 在线磐石网络百度一下百度搜索
  • 现在建网站多少钱推广营销费
  • 联想企业网站建设的思路西安网站建设阳建
  • 网站内容 内链网站建设电话销售工作总结
  • 系统网站开发知名的摄影网站有哪些
  • 网站拍照的幕布扬中网站建设价位
  • 网站ie兼容性差西安小程序开发的公司
  • 上海网站建设培训app网站开发成本
  • 个人网站icp外贸网站开发 河南
  • 遵义建设网站无锡市规划建设局网站
  • 海外留学网站建设方案门户网站的发布特点
  • 网站建设不赚钱net112企业建站系统
  • 网站建设团队管理模板贵州省住房和城乡建设部网站
  • 曲沃网站建设网上学编程的有哪些比较好的网站
  • 厦门网站建设慕枫学做网站需要多久
  • 爱奇艺做任务领vip网站设计广告图片
  • 中科汇联网站建设手册上海公司名称注册查询网
  • 网站建设电子商务课总结和体会关于做网站书籍
  • 仪征网站建设公司哪家好简单网页制作素材图片
  • 甘肃第九建设集团公司网站潍坊个人做网站
  • 如何做后台网站的教程网站建设 关于我们
  • 极速网站建设哪家好连云港百度推广网站建设