本节是通过AD采集外部传感器的值转化为温度数据的,先上取样电路图:

温敏电阻和光敏电阻取样电路
左边为温敏电阻,通过R9接到IO口上,右边为光敏电阻,通过R12接到IO口上。
硬件部分就这些,还可以自己根据需要扩展,下面介绍软件部分:
需要用到的寄存器:
ADCCON1(0xB4)–ADC控制1
ADCCON2(0xB5)–ADC控制2
ADCCON3(0xB6)–ADC控制3
APCFG=0x01; //将P0.0口设置为模拟输入,也就是将取样电路的输出接到P0.0上
ADCCON1 |= 0x30; //选择ADC启动模式为手动
ADCCON1 |= 0x40;
while(!(ADCCON1&0x80)); //等待ADC转化结束
ADCCON3 = 0x30; //用AIN7引脚上电压作为外部参考电压,选择512位抽取率,选择通道AIN0
vlaue = ADCL >>2; //低两位舍去
value = ADCH <<6;
以上就是有关AD寄存器的操作了,下面详细介绍程序:
ADTEST.c
点击(此处)折叠或打开
- #include "ioCC2530.h"
- #include "initUART_Timer.h"
- #include "stdio.h"
- float AvgTemp;
- /****************************************************************
- 温度传感器初始化函数
- ****************************************************************/
- void initTempSensor(void){
- DISABLE_ALL_INTERRUPTS();//关闭所有中断
- CLKCONCMD = 0x28; //时器计数时钟设定为1M Hz, 系统时钟设定为32 MHz
- while(CLKCONSTA & 0x40); //等晶振稳定
- APCFG=0x01; //将P0.0口设置为模拟输入
- }
- /****************************************************************
- 读取温度传感器AD值函数
- ****************************************************************/
- float getTemperature(void){
- short int i;
- int AdcValue;
- int value;
- AdcValue = 0;
- for( i = 0; i < 4; i++ )
- {
- ADCCON3 = 0x70;
- ADCCON1 |= 0x30;
- ADCCON1 |= 0x40; //开启单通道ADC
- while(!(ADCCON1 & 0x80)); //等待AD转换完成
- value = ADCL >> 2; //ADCL寄存器低2位无效
- value |= ADCH << 6;
- AdcValue += value; //AdcValue被赋值为4次AD值之和
- }
- value = AdcValue >> 2; //累加除以4,得到平均值
- return ADC14_TO_CELSIUS(value); //根据AD值,计算出实际的温度
- }
- /****************************************************************
- 主函数
- ****************************************************************/
- void main(void)
- {
- char i;
- char TempValue[10];
-
- InitUART0(); //初始化串口
- initTempSensor(); //初始化ADC
- while(1)
- {
- AvgTemp = 0;
- for(i = 0 ; i < 64 ; i++)
- {
- AvgTemp += getTemperature();
- AvgTemp /= 2; //每次累加后除2.
- }
- sprintf(TempValue, (char *)"%dC ", AvgTemp);
- UartTX_Send_String(TempValue,4);
- for(i = 0; i < 1000; i++)
- {
- Delay(50000);
- }
- }
- }
initUART_Timer.h
点击(此处)折叠或打开
- #include <ioCC2530.h>
- #define ADC14_TO_CELSIUS(ADC_VALUE) ( ((ADC_VALUE) >> 4) - 335)
- /****************************
- T3初始化
- ****************************/
- void InitT3(void)
- {
- T3CCTL0 = 0X44; // T3CCTL0 (0xCC),CH0 中断使能,CH0 比较模式
- T3CC0 = 0xFA; // T3CC0设置为250
- T3CTL |= 0x9A; // 启动T3计数器,计数时钟为16分频。使用MODULO模式
- IEN1 |= 0X08;
- IEN0 |= 0X80; //开总中断,开T3中断
- }
- /*****************************************
- 串口初始化函数:初始化串口 UART0
- *****************************************/
- void InitUART0(void)
- {
- PERCFG = 0x00; //位置1 P0口
- P0SEL = 0x3c; //P0用作串口
-
- P2DIR &= ~0XC0; //P0优先作为UART0
- U0CSR |= 0x80; //串口设置为UART方式
- U0GCR |= 9;
- U0BAUD |= 59; //波特率设为19200
- UTX0IF = 1; //UART0 TX中断标志初始置位1
- U0CSR |= 0X40; //允许接收
- IEN0 |= 0x84; //开总中断,接收中断
- }
- /****************************************************************
- 串口发送字符串函数
- ****************************************************************/
- void UartTX_Send_String(char *Data,int len)
- {
- int j;
- for(j=0;j<len;j++)
- {
- U0DBUF = *Data++;
- while(UTX0IF == 0);
- UTX0IF = 0;
- }
- U0DBUF = 0x0A; // 换行
- while(UTX0IF == 0);
- UTX0IF = 0;
- }
- /****************************************************************
- 延时函数
- ****************************************************************/
- void Delay(int n)
- {
- int i;
- for(i=0;i<n;i++);
- for(i=0;i<n;i++);
- for(i=0;i<n;i++);
- for(i=0;i<n;i++);
- for(i=0;i<n;i++);
- }