注意:1、ADC_TempSensorVrefintCmd(ENABLE); //开启内部温度传感器
2、ADC读出来的是电压值,要按公式来转换T(℃) ={(V25-Vsense) /Avg_Slope}+25
V25=Vsense 在 25 度时的数值(典型值为: 1.43)。
Avg_Slope=温度与 Vsense 曲线的平均斜率(单位为 mv/℃或 uv/℃)(典型值为
4.3Mv/℃)。
temp=((1.43-temp)/0.0043)+25;//uv
temp=temp*100;//100倍变为mv
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "rtc.h"
#include "adc.h"
#include "tlc549.h"
void myCpuTemInit(void);
u16 myCpuTemHandler(u8 ch);
u16 Cpu_tem(u8 ch,u8 time);
int main(void)
{
u16 cpu_val=0;
float temp=0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
KEY_Init();
LCD_Init();
myCpuTemInit();
LCD_ShowString(30,140,200,16,16,"TEMPERATE: 00.00C");
while(1)
{
cpu_val=Cpu_tem(ADC_Channel_16,10);//通道16,计算次数10
//LCD_ShowxNum(156,130,cpu_val,3,16,0);//寄存器的值只有8位,2^8=255最大值为3位
temp=cpu_val*(float)(3.3)/4095;//检测到的电压值
temp=((1.43-temp)/0.0043)+25;//4.3mv=0.0043V
temp=temp*100;//为了方便显示
//LCD_ShowxNum(156,130,temp,6,16,0);//寄存器的值只有8位,2^8=255最大值为3位
LCD_ShowxNum(30+11*8,140,temp/100,2,16,0); //显示整数部分
LCD_ShowxNum(30+14*8,140,((u16)temp)%100,2,16, 0x80); //显示小数部分
LED0=!LED0;
delay_ms(250);
}
}
// ADC1 的通道 1(PA1)来读取外部电压值显示在TFT上面
void myCpuTemInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStruct;
//1) 开启 PA 口时钟和 ADC1 时钟,设置 PA1 为模拟输入。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//使能ADC时钟
//2) 复位 ADC1,同时设置 ADC1 分频因子
ADC_DeInit(ADC1);
//ADC最大转换频率为1MHz,对应的最大转换时间就是1us
// ADC 的转换时间公式=Tcovn=采样时间+12.5个周期
// ADCCLK=14Mhz 的时候,设置 1.5 个周期的采样时间,则得到: Tcovn=1.5+12.5=14 个周
//期=1us。
//APB2对应的时钟频率是72MHz,分频因子要确保 ADC1 的时钟(ADCCLK)不超过14Mhz。
//6分频之后72/6=12Mhz,所以ADC的频率是12Mhz
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
//3) 初始化 ADC1 参数, 设置 ADC1 的工作模式以及规则序列的相关信息。
ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;//ADC 工作模式:独立模式
ADC_InitStruct.ADC_ScanConvMode=DISABLE;//AD 单通道模式
ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;//AD 单次转换模式
ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//转换由软件而不是外部触发启动
ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;//ADC 数据右对齐ADC_DataAlign_Right,左对齐会咋样?ADC_DataAlign_Left
ADC_InitStruct.ADC_NbrOfChannel=1;//顺序进行规则转换的 ADC 通道的数目 1
ADC_Init(ADC1, &ADC_InitStruct);
ADC_TempSensorVrefintCmd(ENABLE); //开启内部温度传感器
//4) 使能 ADC 并校准。
//执行复位校准和 AD 校准,注意这两步是必须的!不校准将导致结果很不准确。
ADC_Cmd(ADC1,ENABLE);//使能 ADC
ADC_ResetCalibration(ADC1);//复位校准
ADC_StartCalibration(ADC1);//AD 校准
//记住,每次进行校准之后要等待校准结束。 这里是通过获取校准状态来判断是否校准是否结束
//一旦校准结束, CAL位被硬件复位 校准状态复位完成的返回值是0,
while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准完成 为0时退出while
while(ADC_GetCalibrationStatus(ADC1));//等待AD 校准完成
//LCD_ShowString(60,130,200,16,16,"ADC_CH0_VAL:");//ADC采样值
//LCD_ShowString(60,150,200,16,16,"ADC_CH0_VOL:0.000V"); //电压值
}
//返回 ADC 值
//ch:通道值 0~3
u16 myCpuTemHandler(u8 ch)
{
//5) 设置规则通道1的参数
//ADC1的通道1,Rank:规则顺序中的第一个转换1,ADC_SampleTime:采样周期
ADC_RegularChannelConfig(ADC1, ch, 1,ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能指定的 ADC1 的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC1);//获取转换 ADC 转换结果数据,16位里面含有12位,右对齐,高位对齐
}
//return: ADC平均值
//ch:通道16, time:采集次数
u16 Cpu_tem(u8 ch,u8 time)
{
u8 i=0;
u16 adc_value=0;
for(i=0;i


