CC2540开发板学习笔记(六)——AD控制(自带温度计)

一、实验目的

     将采集的内部温度传感器信息通过串口发送到上位机

二、实验过程

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--);
}

image

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值