串口发送传感温度
1.使用ADC数模转换,计算出内置温度传感器的值
2.使用串口助手显示开发板传送上来的温度数据
实验思路:
使用ADC并进行4次数据的采集,最后求出平均值,利用规则公式计算出对应的温度,
将得到的浮点数转化成字符串利用串口发送,(1.可以使用整除,求余运算之后加上0x30进行转化,不过该方法精度较低 2.使用Sprintf函数将浮点型数拼接成字符串,这应该是特别好的方法),串口发送时是分一个字符一个字符的发送,使用strlen函数求取字符串的长度。
重点:如果使用的粤嵌开发板记得如下语句,否则拿到的温度值将为负数
实现代码:
#include <ioCC2530.h>
#include "exboard.h"
#include "string.h"
#include "stdio.h"
float getTemperature(void); //函数声明
void initUART0(void);
void UartTX_Send_String(char *Data,int len);
uint value;
void delay(int i);
void main(void)
{
char *data;
float temp;
initUART0();
while(1)
{
temp=getTemperature();
sprintf(data,"%f摄氏度 %d电压值\n",temp,value); //字符串拼接函数,在头文件stdio.h中
UartTX_Send_String(data,strlen(data));
delay(100);
}
}
//软件延时函数
void delay(int i)
{
int j;
for(;i>0;i--)
for(j=0;j<10000;j++);
}
float getTemperature(void)
{
char i;
float va;
uint AdcValue;
AdcValue=0;
TR0=0x01;//将内置温度传感器与ADC连接,粤嵌开发版的有这个需求
ATEST=0x01;
for(i=0;i<4;i++)//求取四次的平均值
{
ADCCON3|=0x3E;
ADCCON1|=0x40; //使用1.25v内部电压,12位分辨率,AD源为片内温度
//传感器开启单通道ADC
while(!(ADCCON1&0x80)); //等待AD转换完成
value=ADCL>>2; //AdcValue被赋值为4次AD值之和
value|=(((uint)ADCH)<<6);
AdcValue+=value;
}
value=AdcValue>>2; //累加除以4,得到平均值
va=(float)value*0.0629-303.3; //根据AD值,计算出实际的温度
return va;
}
//串口通信初始化函数
void initUART0(void)
{
CLKCONCMD&=~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD&=~0x47; //设置系统主时钟频率为32MHZ
PERCFG=0x00; //位置1 P0口
P0SEL=0x3C; //P0作为串口
P2DIR&=~0x0C; //P0优先作为UART0
U0CSR|=0x80; //串口设置为UART方式
U0GCR|=9;
U0BAUD|=59; //波特率设为19200
UTX0IF=1; //UART0 TX中断标志初始置位1
U0CSR|=0x40; //允许接收
IEN0|=0x84; //开总中断,接收中断
}
//串口通信发送程序
void UartTX_Send_String(char *Data,int len)
{
uint j;
for(j=0;j<len;j++)//每次发送一个字符
{
U0DBUF=*Data++;
while(UTX0IF==0);//发送标志
UTX0IF=0;
}
}
实验现象:串口助手接收
串口助手下载地址链接:https://pan.baidu.com/s/1OLWEsXeW6bvpmMpiGBOSbA
提取码:vze7
复制这段内容后打开百度网盘手机App,操作更方便哦