一、實驗目的
將采集的內部溫度傳感器信息通過串口發送到上位機
二、實驗過程
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--); }

