Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198533
  • 博文数量: 16
  • 博客积分: 371
  • 博客等级: 二等列兵
  • 技术积分: 170
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-09 21:56
文章分类

全部博文(16)

文章存档

2015年(4)

2012年(3)

2011年(9)

分类: 嵌入式

2012-06-03 15:36:55

本节是通过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

点击(此处)折叠或打开

  1. #include "ioCC2530.h"
  2. #include "initUART_Timer.h"
  3. #include "stdio.h"

  4. float AvgTemp;

  5. /****************************************************************
  6. 温度传感器初始化函数
  7. ****************************************************************/
  8. void initTempSensor(void){
  9.    DISABLE_ALL_INTERRUPTS();//关闭所有中断
  10.    CLKCONCMD = 0x28; //时器计数时钟设定为1M Hz, 系统时钟设定为32 MHz
  11.    while(CLKCONSTA & 0x40); //等晶振稳定
  12.    APCFG=0x01; //将P0.0口设置为模拟输入
  13. }

  14. /****************************************************************
  15. 读取温度传感器AD值函数
  16. ****************************************************************/
  17. float getTemperature(void){
  18.   short int i;
  19.   int AdcValue;
  20.   int value;

  21.   AdcValue = 0;
  22.   for( i = 0; i < 4; i++ )
  23.   {
  24.     ADCCON3 = 0x70;
  25.     ADCCON1 |= 0x30;
  26.     ADCCON1 |= 0x40; //开启单通道ADC
  27.     while(!(ADCCON1 & 0x80)); //等待AD转换完成
  28.     value = ADCL >> 2; //ADCL寄存器低2位无效
  29.     value |= ADCH << 6;
  30.     AdcValue += value; //AdcValue被赋值为4次AD值之和
  31.   }
  32.      value = AdcValue >> 2; //累加除以4,得到平均值
  33.      return ADC14_TO_CELSIUS(value); //根据AD值,计算出实际的温度
  34. }

  35. /****************************************************************
  36. 主函数
  37. ****************************************************************/
  38. void main(void)
  39. {
  40.      char i;
  41.         char TempValue[10];
  42.         
  43.      InitUART0(); //初始化串口
  44.      initTempSensor(); //初始化ADC
  45.         while(1)
  46.         {
  47.           AvgTemp = 0;
  48.           for(i = 0 ; i < 64 ; i++)
  49.           {
  50.             AvgTemp += getTemperature();
  51.             AvgTemp /= 2; //每次累加后除2.
  52.           }
  53.              sprintf(TempValue, (char *)"%dC ", AvgTemp);
  54.              UartTX_Send_String(TempValue,4);
  55.             for(i = 0; i < 1000; i++)
  56.              {
  57.                Delay(50000);
  58.              }
  59.         }
  60. }


initUART_Timer.h

点击(此处)折叠或打开

  1. #include <ioCC2530.h>

  2. #define ADC14_TO_CELSIUS(ADC_VALUE) ( ((ADC_VALUE) >> 4) - 335)

  3. /****************************
  4. T3初始化
  5. ****************************/
  6. void InitT3(void)
  7. {
  8.   T3CCTL0 = 0X44; // T3CCTL0 (0xCC),CH0 中断使能,CH0 比较模式
  9.   T3CC0 = 0xFA; // T3CC0设置为250
  10.   T3CTL |= 0x9A; // 启动T3计数器,计数时钟为16分频。使用MODULO模式
  11.   IEN1 |= 0X08;
  12.   IEN0 |= 0X80; //开总中断,开T3中断
  13. }
  14. /*****************************************
  15. 串口初始化函数:初始化串口 UART0
  16. *****************************************/
  17. void InitUART0(void)
  18. {
  19.      PERCFG = 0x00; //位置1 P0口
  20.      P0SEL = 0x3c; //P0用作串口
  21.      
  22.      P2DIR &= ~0XC0; //P0优先作为UART0
  23.         U0CSR |= 0x80; //串口设置为UART方式
  24.         U0GCR |= 9;
  25.         U0BAUD |= 59; //波特率设为19200

  26.      UTX0IF = 1; //UART0 TX中断标志初始置位1
  27.         U0CSR |= 0X40; //允许接收
  28.         IEN0 |= 0x84; //开总中断,接收中断

  29. }

  30. /****************************************************************
  31.    串口发送字符串函数
  32. ****************************************************************/
  33. void UartTX_Send_String(char *Data,int len)
  34. {
  35.   int j;
  36.   for(j=0;j<len;j++)
  37.   {
  38.     U0DBUF = *Data++;
  39.     while(UTX0IF == 0);
  40.     UTX0IF = 0;
  41.   }
  42.      U0DBUF = 0x0A; // 换行
  43.     while(UTX0IF == 0);
  44.       UTX0IF = 0;
  45. }


  46. /****************************************************************
  47.   延时函数
  48. ****************************************************************/
  49. void Delay(int n)
  50. {
  51.      int i;
  52.      for(i=0;i<n;i++);
  53.      for(i=0;i<n;i++);
  54.      for(i=0;i<n;i++);
  55.      for(i=0;i<n;i++);
  56.      for(i=0;i<n;i++);
  57. }








阅读(7182) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~