一、实验目的
将采集的内部温度传感器信息通过串口发送到上位机
二、实验过程
1、寄存器配置
ADCCON1(0XB4) ADC控制寄存器1 |
BIT7:EOC ADC结束标志位 0:AD转换进行中 1:AD转换完成 |
BIT6:ST 手动启动AD转换 0:关闭 1:启动AD转换(需要BIT5:BIT4=11) |
|
BIT5:BIT4 AD转换启动方式 00:外部触发 01:全速转换,不需要触发 10:T1通道比较触发 11:手动触发 |
|
BIT3:BIT2 16位随机数发生器控制位 00:普通模式(13x打开) 01:开启LFSR时钟一次(13x打开) 10:保留位 11:关 |
|
ADCC0N2(0XB5) 序列AD转换控制寄存器2 |
BIT7:BIT6 SREF 选择AD转换参考电压 00:内部参考电压(1.25V) 01:外部参考电压AIN7输入 10:模拟电源电压 11:外部参考电压AIN6-AIN7差分输入 |
BIT5:BIT4 设置AD转化分辨率 00:64dec,7位有效 01:128dec,9位有效、 10:256dec,10位有效 11:512dec,12位有效 |
|
BIT3:BIT2:BIT1:BIT0 设置AD转换最末通道,如果置位时ADC正在运行,则在完成序列AD转换后立刻开始,否则置位后AD转换,转换完成后自动清0。 0000:AIN0 0001:AIN1 0010:AIN2 0011:AIN3 0100:AIN4 0101:AIN5 0110:AIN6 0111:AIN7 1000:AIN0-AIN1差分 1001:AIN2-AIN3差分 1010:AIN4-AIN5差分 1011:AIN6-AIN7差分 1100:GND 1101:保留 1110:温度传感器 1111:1/3模拟电源电压 |
|
ADCCON3(0XB5) 单通道AD转换控制寄存器3 |
BIT7:BIT6 SREF 选择单通道AD选择参考电压 00:内部参考电压(1.25V) 01:外部参考电压AIN7输入 10:模拟电源电压 11:外部参考电压AIN6-AIN7差分输入 |
BIT5:BIT4 设置单通道AD转换分辨率 00:64dec,7位有效 01:128dec,9位有效、 10:256dec,10位有效 11:512dec,12位有效 |
|
BIT3:BIT2:BIT1:BIT0 设置AD转换最末通道,如果置位时ADC正在运行,则在完成序列AD转换后立刻开始,否则置位后AD转换,转换完成后自动清0。 0000:AIN0 0001:AIN1 0010:AIN2 0011:AIN3 0100:AIN4 0101:AIN5 0110:AIN6 0111:AIN7 1000:AIN0-AIN1差分 1001:AIN2-AIN3差分 1010:AIN4-AIN5差分 1011:AIN6-AIN7差分 1100:GND 1101:保留 1110:温度传器 1111:1/3模拟电源电压 |
|
TR0(0x624B) | BIT0:置1表示将温度传感器与ADC连接起来 |
ATEST(0x61BD) | BIT0:置1表示将温度传感器启用 |
2、源码
adc.h
#ifndef ADC_H_
#define ADC_H_ #include <ioCC2540.h> #define uint unsigned int
#define uchar unsigned char void AdcInit(void);//内部温度传感器 uint GetAdcValue(void);//得到单次转换的AD值 uint TempDeal(uint TempAdValue);//将温度传感器的Ad值转换成温度值,扩大100倍 void ChanceValueToString(uint Data ,uchar *Buff);//将数值转换为字符串 #endif
#include "adc.h" void AdcInit(void)//内部温度传感器
{
ADCCON1 = 0x33;//软件启动转换
ADCCON3 = 0x3e;//内部参考电压,12位分辨率,选择温度传感器输入
TR0 = 0x01;
ATEST = 0x01;
// ADCCON1 |= 0x40;//软件启动转换
} uint GetAdcValue(void)
{
uint AdValue=0; ADCCON1 |= 0x40;
while(!(ADCCON1 & 0x80));
AdValue = ADCL >>4;
AdValue |= ADCH <<4; return AdValue;
} uint TempDeal(uint TempAdValue)//将温度传感器的Ad值转换成温度值,扩大100倍
{
float Tempruture;
Tempruture = (TempAdValue-1367.5)/4.5+2.5;
TempAdValue = (uint)(Tempruture*100);
return TempAdValue;
} void ChanceValueToString(uint Data ,uchar *Buff)//将数值转换为字符串
{
Buff[0] = (Data/10000)+0x30;
Buff[1] = ((Data/1000)%10)+0x30;
Buff[2] = ((Data/100)%10)+0x30;
Buff[3] = '.';
Buff[4] = ((Data/10)%10)+0x30;
Buff[5] = (Data%10)+0x30;
Buff[6] = '\n';
Buff[7] = '\0';
}
sysclock
#ifndef SYSCLK_H_
#define SYSCLK_H_ #include<ioCC2540.h> void SysClkSet_32M(void);//设置系统时钟为32MHz #endif
#include "sysclk.h" void SysClkSet_32M(void)//设置系统时钟为32MHz
{
CLKCONCMD &= ~0x40;
while(CLKCONSTA & 0x40);
CLKCONCMD &= ~0x47;
}
usart0
#ifndef USART0_H_
#define USART0_H_ #include<ioCC2540.h> #define uint unsigned int
#define uchar unsigned char void UartInit(void);//115200 void Uart0_SendByte(uchar Byte);//发送一个数据 void Uart0_SendString(uchar *Buff);//发送一个字符串 #endif
#include"usart0.h" void UartInit(void)
{
P2DIR &= ~0xc0;//备用位置1
PERCFG &= ~0x01;//设置UART0高优先级
P0SEL |= 0x3c;//2 3 4 5作为外设
U0CSR = 0xc0;
U0GCR = 11; //设置波特率,可参考CC2530中文文档中的相应表格
U0BAUD = 216;
EA=1;
URX0IE=1;//接收中断 URX0IF--接收中断标志位 UTX0IF--发送完成标志位
} void Uart0_SendByte(uchar Byte)//发送一个字符
{
U0DBUF=Byte;
while(!UTX0IF);
UTX0IF=0;
} void Uart0_SendString(uchar *Buff)//发送一串字符
{
uchar *p;
p=Buff;
while(*p != 0)
{
Uart0_SendByte(*p);
p++;
}
} #pragma vector = URX0_VECTOR //中断向量
__interrupt void Uart0RxInt(void)
{
URX0IF=0;
Uart0_SendByte(U0DBUF);
}
mian
#include<ioCC2540.h>
#include"sysclk.h"
#include"usart0.h"
#include"adc.h" #define uint unsigned int
#define uchar unsigned char
void Delay(uint n);
uchar TempDis[8]; void main()
{
SysClkSet_32M();//设置系统时钟为32MHz
UartInit(); //115200 while(1)
{
AdcInit(); //初始化ADC
ChanceValueToString(TempDeal(GetAdcValue()),TempDis);//获取当前温度值并将其装换成字符串
Uart0_SendString(TempDis);//打印温度值
Delay(1000);
}
} void Delay(uint n)
{
uint i,j;
for(i=n;i>0;i--)
for(j=5000;j>0;j--);
}