1. Propósito experimental
Enviar la información del sensor de temperatura interna recopilada a la máquina superior a través del puerto serie
2. Proceso experimental
1, configuración de registro
ADCCON1(0XB4) ADC Control Register 1 |
BIT7: EOC ADC finaliza la posición del logotipo 0: la conversión de anuncios se realiza 1: la conversión de anuncios se completa |
bit6: st comienza manualmente la conversión de anuncios 0: Cerrar 1: Inicie la conversión del anuncio (necesita bit5: bit4 = 11) |
|
BIT5: Método de inicio de conversión de anuncios BIT4 00: disparador externo 01: Convertir la velocidad completa, no es necesario activar 10: se activa el canal T1 11: disparador manual |
|
bit3: bit2 bit de control del generador de números aleatorios de 16 bits 00: Modo normal (13x abierto) 01: Abra el reloj LFSR una vez (13x abierto) 10: Reserva 11: |
|
ADCC0N2(0XB5) secuencia Registro de control de conversión de anuncios 2 |
bit7: bit6 sref seleccione el voltaje de referencia de conversión de anuncios 00: Voltaje de referencia interno (1.25V) 01: Voltaje de referencia externo Ain7 Entrada 10: Voltaje de potencia de simulación 11: Voltaje de referencia externo Ain6-Ain7 Entrada diferencial |
bit5: bit4 establecer la resolución de conversión de anuncios 00: 64DEC, 7 dígitos son válidos 01: 128DEC, 9 bit Efectivo, 10: 256DEC, 10 bits efectivo 11: 512DEC, 12 bits válido |
|
BIT3:BIT2:BIT1:BIT0 Establezca el último canal de conversión de AD. Si el ADC se está ejecutando en el momento, comenzará inmediatamente después de completar la conversión de la secuencia de AD. 0000:AIN0 0001:AIN1 0010:AIN2 0011:AIN3 0100:AIN4 0101:AIN5 0110:AIN6 0111:AIN7 1000: Ain0-Ain1 diferencial 1001: Ain2-Ain3 Diferencial 1010: Ain4-Ain5 Diferencial 1011: Ain6-Ain7 Diferencial 1100:GND 1101: Reserva 1110: Sensor de temperatura 1111: 1/3 Voltaje de la fuente de alimentación de simulación |
|
ADCCON3(0XB5) Registro de control de conversión de anuncios de un solo canal 3 |
bit7: bit6 sref seleccione un solo canal AD Seleccione Voltaje de referencia 00: Voltaje de referencia interno (1.25V) 01: Voltaje de referencia externo Ain7 Entrada 10: Voltaje de potencia de simulación 11: Voltaje de referencia externo Ain6-Ain7 Entrada diferencial |
bit5: bit4 establece una resolución de conversión de anuncios de un solo canal 00: 64DEC, 7 dígitos son válidos 01: 128DEC, 9 bits efectivo, 10: 256DEC, 10 dígitos son válidos 11: 512DEC, 12 bits válido |
|
BIT3:BIT2:BIT1:BIT0 Establezca la conversión de anuncios en el canal final. Si el ADC se está ejecutando en el momento, comenzará inmediatamente después de completar la conversión de la secuencia del anuncio. 0000:AIN0 0001:AIN1 0010:AIN2 0011:AIN3 0100:AIN4 0101:AIN5 0110:AIN6 0111:AIN7 1000: diferencial Ain0-Ain1 1001: Ain2-Ain3 Diferencial 1010: Ain4-Ain5 Diferencial 1011: Ain6-Ain7 Diferencial 1100:GND 1101: Reserva 1110: Pasajero de temperatura 1111: 1/3 Voltaje de la fuente de alimentación de simulación |
|
TR0(0x624B) | bit0: conjunto 1 significa conectar el sensor de temperatura con ADC |
ATEST(0x61BD) | bit0: el lugar 1 indica que el sensor de temperatura está habilitado |
2, código fuente
adc.h
#ifndef ADC_H_ #define ADC_H_ #include <ioCC2540.h> #define uint unsigned int #define uchar unsigned char void AdcInit(void);//sensor de temperatura interna uint GetAdcValue(void);//Obtenga un único valor de anuncio de conversión uint TempDeal(uint TempAdValue);//El valor AD del sensor de temperatura se convierte en valor de temperatura, y se expande 100 veces void ChanceValueToString(uint Data ,uchar *Buff);//Convierta el valor numérico en una cadena #endif
#include "adc.h" void AdcInit(void)//sensor de temperatura interna { ADCCON1 = 0x33;//conversión de inicio de software ADCCON3 = 0x3e;//voltaje de referencia interna, resolución de 12 bits, seleccione la entrada del sensor de temperatura TR0 = 0x01; ATEST = 0x01; // ADCCON1 |= 0x40;//conversión de inicio de software } uint GetAdcValue(void) { uint AdValue=0; ADCCON1 |= 0x40; while(!(ADCCON1 & 0x80)); AdValue = ADCL >>4; AdValue |= ADCH <<4; return AdValue; } uint TempDeal(uint TempAdValue)//El valor AD del sensor de temperatura se convierte en el valor de temperatura y la expansión de 100 veces { float Tempruture; Tempruture = (TempAdValue-1367.5)/4.5+2.5; TempAdValue = (uint)(Tempruture*100); return TempAdValue; } void ChanceValueToString(uint Data ,uchar *Buff)//Convierta el valor numérico en una cadena { 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);//Establezca el reloj del sistema 32MHz #endif
#include "sysclk.h" void SysClkSet_32M(void)//Establecer el reloj del sistema 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);//Enviar datos void Uart0_SendString(uchar *Buff);//enviar una cadena #endif
#include"usart0.h" void UartInit(void) { P2DIR &= ~0xc0;//Ubicación de respaldo 1 PERCFG &= ~0x01;//set Uart0 alta prioridad P0SEL |= 0x3c;//2 3 4 5 como periférico U0CSR = 0xc0; U0GCR = 11; //Establecer la tasa de baudios, consulte la tabla correspondiente en la documentación china CC2530 U0BAUD = 216; EA=1; URX0IE=1;//Recibir interrupción URX0IF-Receive El logotipo de interrupción bit Utx0if-send la posición del símbolo } void Uart0_SendByte(uchar Byte)//enviar un personaje { U0DBUF=Byte; while(!UTX0IF); UTX0IF=0; } void Uart0_SendString(uchar *Buff)//Enviar una cadena de caracteres { uchar *p; p=Buff; while(*p != 0) { Uart0_SendByte(*p); p++; } } #pragma vector = URX0_VECTOR //Vector de interrupción __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();//Establecer el reloj del sistema 32MHz UartInit(); //115200 while(1) { AdcInit(); //Inicializar ADC ChanceValueToString(TempDeal(GetAdcValue()),TempDis);//Obtenga el valor de temperatura actual y reemplácelo en una cadena Uart0_SendString(TempDis);//Valor de temperatura de impresión Delay(1000); } } void Delay(uint n) { uint i,j; for(i=n;i>0;i--) for(j=5000;j>0;j--); }
reimpreso: https://www.cnblogs.com/bluemountain-haggendazs/p/4298381.html