STM32内部温度传感器实验——串口 delphi上位机

发布者:RadiantRiver最新更新时间:2016-08-21 来源: eefocus关键字:STM32  温度传感器  串口  delphi上位机 手机看文章 扫描二维码
随时随地手机看文章
家里气温15度  我对着芯片使劲哈气  把他哈到了 20度

  STM32内部温度传感器实验——串口 delphi上位机 - liuyunqian@yeah - 嵌入式学习

下位机关键代码 
int main(void)
{
double v,temp,Value;

/* System clocks configuration ---------------------------------------------*/
RCC_Configuration();

/* GPIO configuration ------------------------------------------------------*/
GPIO_Configuration();

/* USARTx configured as follow:
- BaudRate = 9600 baud  
- Word Length = 8 Bits
- One Stop Bit
- No parity
- Hardware flow control disabled (RTS and CTS signals)
- Receive and transmit enabled
*/
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_Init(USART1, &USART_InitStructure);
/* Enable USART1 */
USART_Cmd(USART1, ENABLE);

/* DMA1 channel1 configuration ----------------------------------------------*/
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 1;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);

/* Enable DMA1 channel 1 */
DMA_Cmd(DMA1_Channel1, ENABLE);

/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);

/* ADC1 regular channel 14 configuration */ 
//################改为 Channel 10(电位器)###### 内部温度传感器 改为 Channel 16 ###################
ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_55Cycles5);
//内部温度传感器  添加这一句 
/* Enable the temperature sensor and vref internal channel */
ADC_TempSensorVrefintCmd(ENABLE);

/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);

/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);

/* Enable ADC1 reset calibaration register */   //使用之前一定要校准
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));

/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));

/* Start ADC1 Software Conversion */ 
ADC_SoftwareStartConvCmd(ADC1, ENABLE);

while (1)
{


//printf("The ADC1 Converted Value is %d \r\n",ADCConvertedValue);
//v=    ADCConvertedValue*3.30/4096;
//printf("The Voltage is %f \r\n",v );


Value=ADC_Filter();
//printf("The ADC_Filter Value is %d \r\n",(int)Value);

temp=(1.42 - Value*3.3/4096)*1000/4.35 + 25;
//printf("The Temperature is %f \r\n",temp );
printf("%s%c%c%c%c%c%s","#**",(int)Value/256,(int)Value%256,'&',(int)((temp-(int)temp)*100),(int)temp,"**%");

for(v=0;v<5000;v++);for(v=0;v<5000;v++);for(v=0;v<5000;v++);
}
}
-------------------------------------------------------------------
上位机关键代码
procedure TMainForm.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
//iq  :Integer;
p  :Pchar;

begin
viewstring:=' ';

move(buffer^,pchar(@rbuf)^,bufferlength);


p := StrPos(pchar(@rbuf), '#**');




//if (p <> nil) and   (p[9]='*') and ( p[10]='*') and (p[11]='%') then  //
if (p <> nil) and (p[5]='&') and  (p[8]='*') and ( p[9]='*') and (p[10]='%') then
begin


{
printf("%s%c%c%c%c%c%s",
"#**",
(int)Value/256,(int)Value%256,
'&',
(int)((temp-(int)temp)*100),(int)temp,
"**%");
}

Value     :=Ord(p[3])*256 + Ord(p[4])  ; //Ord()  字符-->ASCII码

//Temp:=   Float( Ord(p[7]) ) +Float( Ord(p[6]) ) /Float(100.0) ;
Temp:=(1.42 - (Value)*3.3/4096)*1000/4.35 + 25;

viewstring:='The ADC_Filter Value is:';
viewstring:=viewstring+IntToStr(Value);
viewstring:=viewstring+'   '+'The Temperature is:';
viewstring:=viewstring+FloatToStr(Temp);

memo1.lines.add(viewstring);
memo1.lines.add(' ');

RzLEDDisplay.Caption := inttostr(Value)+' ';
Temp:=int(Temp*1000)/1000;
RzLEDDisplay1.Caption := floattostr(Temp);

end;
end;
关键字:STM32  温度传感器  串口  delphi上位机 引用地址:STM32内部温度传感器实验——串口 delphi上位机

上一篇:STM32 产品唯一身份标识寄存器(96位) 闪存容量寄存器
下一篇:STM32 内部温度传感器

推荐阅读最新更新时间:2024-03-16 15:06

STM32影子寄存器的作用
这表示在物理上这个寄存器对应2个寄存器:一个是我们可以可以写入或读出的寄存器,称为预装载寄存器,另一个是我们看不见的、无法真正对其读写操作的,但在使用中真正起作用的寄存器,称为影子寄存器. 数据手册介绍预装载寄存器的内容可以随时传送到影子寄存器,即两者是连通的(permanently),或者在每一次更新事件(UEV)时才把预装载寄存器的内容传送到影子寄存器。 原文如下: The auto-reload register is preloaded. Writing to or reading from the auto-reload register accesses the preload register. The conten
[单片机]
【STM32CubeMX】10,STM32之FSMC 之TFTLCD,移植,显示变量
1,学了这章之后,主要掌握了怎么移植标准库的函数 2,对.c .h文件的#include文件的修改 3,在LCD中,最关键的是读写命令地址的书写 4,LCD的初始化可以看给的参考例程 5,变量的显示sprintf函数https://baike.baidu.com/item/sprintf/9703430?fr=aladdin http://www.openedv.com/posts/list/61386.htm 6, 在stm32 例子的 c语言 程序中看到这样一句 *(__IO uint16_t *) (((uint32_t)0x60020000) ) 7,fsm
[单片机]
【STM32CubeMX】10,<font color='red'>STM32</font>之FSMC 之TFTLCD,移植,显示变量
STM32系列第26篇--电容触摸屏
触摸屏分类: 电阻式:定位准确,单点触摸 电容感应式:电容感应式:支持多点触摸,价格偏贵。工业应用最广泛 红外线式:价格低廉,但其外框易碎,容易产生光干扰,曲面情况下失真 表面声波式:解决各种缺点,但是屏幕表面如果有水滴和尘土会使触摸屏变的迟钝 注:触摸屏本质上与液晶是分离的,触摸屏负责的是检测触摸点,液晶屏负责的是显示。区别开来;电容触摸屏一般都需要一个驱动IC来检测电容触摸,且一般是通过IIC接口输出触摸数据的。 常见的驱动IC: GT9147:采用17*10的驱动结构(10个感应通道,17个驱动通道) OTT2001A:采用13*8的驱动结构(8个感应通道,13个驱动通道) 注:它们与MCU连接通过4根线:
[单片机]
<font color='red'>STM32</font>系列第26篇--电容触摸屏
跟我学51单片机(三):单片机串口通信实例
上讲介绍并应用了单片机内部定时器和中断,并给出了实例。这一讲将介绍单片机上的串口通信。通过该讲,读者可以掌握单片机上串口的工作原理和如何通过程序来对串口进行设置,并根据所给出的实例实现与PC 机通信。   一、原理简介   51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。   与之前一样,首先我们来了解单片机串口相关的寄存器。   SBUF 寄存器:
[单片机]
跟我学51单片机(三):单片机<font color='red'>串口</font>通信实例
一种导致STM32重新上电后不工作的原因
【使用环境】 编译器:KEIL5.20 硬件:STM32F429 软件:FreeRTOS 【问题描述】 编译后烧录运行正常,重新上电无反应 【问题分析】 1. 在任务中使用了非系统延时 --非系统延时导致系统阻塞, 详看 2. 外设驱动初始化问题 --有些外设在重新上电后初始化失败,导致错误或是卡在此处 如MPU6050就需要在初始化前加入一定延时,不然再次初始化会失败 如GT811触摸芯片复位准备时长需要50ms 3. 配置为外部中断的GPIO悬空导致 --由于该引脚为悬空状态,且该引脚配置为中断模式,在上电时无法确定该引脚的电平状态,导致初始化瞬间产生一个边沿跳变,而进入中断,此时系统还未初始化完毕,导致中断服务程
[单片机]
用8位单片机实现串口-以太网转换器
    摘要: 用8位单片机8031和ISA总线网卡,实现RS485串行设备与以太网的连接,以传送控制信令和数据文件。程序设计采用C51语言,便于移植和调试。     关键词: 以太网 串行通讯 单片机 C51 单片机或微控制器(MCU)(也称为嵌入式系统)已经在各个领域得到了广泛的应用。目前绝大多数系统都是以MCU为核心,与监测、伺服、指示设备配合实现一定的功能。以太网是当今最受欢迎的局域网之一,现已成为社会重要的基础信息设施,是信息流通的重要渠道。如果嵌入式系统能够连接到Internet,则可以方便、低廉地将信息传送到世界上的任何一个地方。 将嵌入式系统与Internet相连的主要困难在于:Inter
[网络通信]
stm32专题二十六:高级定时器介绍
高级定时器 STM32F103有 2 个高级定时器 TIM1 和 TIM8,高级定时器的功能主要有定时、输入捕获、输出比较、互补输出等。 高级定时器简介: 计数器16bit,上 / 下 / 两边 计数,TIM1和TIM8,还有一个重复计数器RCR,独有; 有4个GPIO,其中通道1 ~ 3还有互补输出GPIO; 时钟来自PCLK2,为72M,可实现1~65536分频; 高级定时器和通用定时器的引脚分布: 高级定时器结构框图(分成6个部分): 一、时钟源: 内部时钟(CK_INT); 外部时钟模式1:外部输入引脚; 外部时钟模式2:外部触发输入ETR; 内部触发输入(ITRx):使用一
[单片机]
<font color='red'>stm32</font>专题二十六:高级定时器介绍
基于STM32的USB枚举过程学习笔记
之前使用ST官方的库以及网络的资料,完成了使用USB HID类进行STM32和PC机的通讯。由于其他原因并没有深入的分析,虽然实现了功能,但是关于USB设备的枚举,以及具体的通讯方式都没有清晰的概念,所以现在回头重新学习USB相关知识。主要参考资料是《圈圈教你玩USB》、USB枚举过程图解,ST官方的USB HID例程。 一,USB数据包 1. USB数据包分类 USB总线上的数据传输以包为基本的单位。USB协议规定了四种包:令牌包、数据包、握手包、特殊包。不同的包通过包中的8位PID域区分。 令牌包 令牌包用于启动 一次USB传输,USB的数据传输必须由主机发起。令牌包有四种: 输出令牌包
[单片机]
基于<font color='red'>STM32</font>的USB枚举过程学习笔记
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved