/****************************************************************************
* 文 件 名: main.c
* 作 者: Andy
* 修 订: 2013-01-09
* 版 本: 1.0
* 描 述: ADC把芯片温度通过串口发给电脑,部分芯片误差较大需校准
* 手摸芯片温度有明显变化
****************************************************************************/
#include <stdio.h>
#include <string.h>
#include "UartTimer.h"
/****************************************************************************
* 名 称: InitSensor()
* 功 能: 温度传感器初始化函数
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitSensor(void)
{
DISABLE_ALL_INTERRUPTS(); //关闭所有中断
InitClock(); //设置系统主时钟为 32M
TR0=0x01; //设置为1来连接温度传感器到SOC_ADC
ATEST=0x01; //使能温度传感
}
/****************************************************************************
* 名 称: GetTemperature()
* 功 能: 获取温度传感器 AD 值
* 入口参数: 无
* 出口参数: 通过计算返回实际的温度值
****************************************************************************/
float GetTemperature(void)
{
uint value;
ADCCON3 = (0x3E); //选择1.25V为参考电压;14位分辨率;对片内温度传感器采样
ADCCON1 |= 0x30; //选择ADC的启动模式为手动
ADCCON1 |= 0x40; //启动AD转化
while(!(ADCCON1 & 0x80)); //等待 AD 转换完成
value = ADCL >> 4; //ADCL 寄存器低 2 位无效,由于他只有12位有效,ADCL寄存器低4位无效。网络上很多代码这里都是右移两位,那是不对的
value |= (((uint)ADCH) << 4);
return (value-1367.5)/4.5-5; //根据 AD 值,计算出实际的温度,芯片手册有错,温度系数应该是4.5 /℃
//进行温度校正,这里减去5℃(不同芯片根据具体情况校正)
}
/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
char i;
float AvgTemp;
char strTemp[6];
InitUART(); //初始化串口
InitSensor(); //初始化 ADC
while(1)
{
AvgTemp = GetTemperature();
for (i=0; i<63; i++)
{
AvgTemp += GetTemperature();
AvgTemp = AvgTemp/2; //每次累加后除 2
}
memset(strTemp, 0, 6);
sprintf(strTemp,"%.02f", AvgTemp);//将浮点数转成字符串
UartSendString(strTemp, 5); //通过串口发给电脑显示芯片温度
DelayMS(1000); //延时
}
}
ADC.zip_cc2530
版权申诉
193 浏览量
2022-09-20
09:57:12
上传
评论
收藏 45KB ZIP 举报
刘良运
- 粉丝: 68
- 资源: 1万+
评论0