zoukankan      html  css  js  c++  java
  • CC2530ADC应用

    ADC单通道外部电压采集

    需要设置一个上机位命令控制字符。

    系统时钟初始化——32MHZ晶振

    串口0函数初始化——设置串口对应引脚,波特率,清楚中断标志

    串口0接收中断响应函数——U0DBUF将控制命令字从缓冲区取出

    串口0单字节发送函数——将要发送的1字节数据写入U0DBUF

    ADC函数初始化——设置模拟IO口的使用

    ADC电压采集函数——设置电压选择AVDD5引脚,256抽取率,通道0

     1 #include "ioCC2530.h"
     2 
     3 #define D3  P1_0
     4 #define D4  P1_1
     5 #define D5  P1_3
     6 #define D6  P1_4
     7 
     8 unsigned char UR0_Command;      //上位机命令控制字
     9 
    10 /*====================初始化系统时钟函数======================*/
    11 void Init_Clock_32MHz()
    12 {
    13   CLKCONCMD &= ~0x40;       //选择系统时钟源为32MHZ晶振
    14   while(CLKCONSTA & 0x40);  //等待晶振稳定
    15   CLKCONCMD &= ~0x47;       //设置系统主时钟频率为32MHZ
    16 }
    17 
    18 /*======================初始化串口0函数=======================*/
    19 void Init_Uart0()
    20 {
    21   //端口相关的配置
    22   PERCFG = 0x00;        //串口0的引脚映射到位置1,即P0_2和P0_3
    23   P0SEL = 0x0C;         //将P0_2和P0_3端口设置成外设功能
    24   //波特率相关的配置
    25   U0BAUD = 59;          //32MHz的系统时钟产生9600BPS的波特率
    26   U0GCR = 8;            //16MHz---9; 32MHz---8
    27   //串口属性相关的配置
    28   U0UCR |= 0x80;        //禁止流控,8位数据,清除缓冲器
    29   U0CSR |= 0xC0;        //选择UART模式,使能接收器
    30   //串口中断相关的配置
    31   UTX0IF = 0;           //清除TX发送中断标志
    32   URX0IF = 0;           //清除RX接收中断标志
    33   URX0IE = 1;           //使能URAT0的接收中断
    34   EA = 1;               //使能总中断
    35 }
    36 
    37 /*===================串口0接收中断服务函数=====================*/
    38 #pragma vector = URX0_VECTOR
    39 __interrupt void UR0_RecvInt()
    40 {
    41   UR0_Command = U0DBUF; //将控制命令字从缓冲区取出
    42 }
    43 
    44 /*=====================串口0单字节发送函数=====================*/
    45 void UR0_Send_Byte(unsigned char dat)
    46 {
    47   U0DBUF = dat;         //将要发送的1字节数据写入U0DBUF
    48   while(!UTX0IF);       //等待TX中断标志,即数据发送完成
    49   UTX0IF = 0;           //清除TX中断标志,准备下一次发送
    50 }
    51 
    52 /*=======================ADC初始化函数========================*/
    53 void Init_ADC1()
    54 {
    55   APCFG |= 0x01;      //P0_0作为模拟I/O使用
    56 }
    57 
    58 /*====================ADC电压采样函数========================*/
    59 void Get_ADC1_Data()
    60 {
    61   D6 = 1;
    62   ADCIF = 0;
    63   //参考电压选择AVDD5引脚,256抽取率,通道0
    64   ADCCON3 = (0x80 | 0x20 | 0x00);
    65   while(!ADCIF);      //等待ADC转换完成,
    66   UR0_Send_Byte(ADCH);
    67   UR0_Send_Byte(ADCL); 
    68   D6 = 0;
    69 }
    70 
    71 /*======================端口初始化函数========================*/
    72 void Init_Port()
    73 {
    74   //初始化LED灯的I/O端口
    75   P1SEL &= ~0x1b;    //P1_0、P1_1、P1_3和P1_4作为通用I/O端口
    76   P1DIR |= 0x1b;    //P1_0、P1_1、P1_3和P1_4端口输出
    77   //关闭所有的LED灯
    78   D3 = 0;          
    79   D4 = 0;          
    80   D5 = 0;           
    81   D6 = 0; 
    82 }
    83 
    84 /*==========================主函数============================*/
    85 void main()
    86 {
    87   Init_Clock_32MHz();
    88   Init_Uart0();
    89   Init_ADC1();
    90   Init_Port();
    91   while(1)
    92   {
    93     if(UR0_Command == 0xa6)
    94     {
    95       UR0_Command = 0x00;
    96       Get_ADC1_Data();
    97     }
    98   }
    99 }
    View Code

    电压值换算函数

     1 void Data_to_Volt()
     2 {
     3   unsigned char buf[32];
     4   
     5   Result_adc = ADCH;
     6   Result_adc = Result_adc << 8;
     7   Result_adc |= ADCL;
     8   Result_adc = Result_adc >> 4;     //将ADC采样结果的21位取出
     9   //对于12位的ADC采样结果,去除一个符号位,分辨率为:3300 / 2048 = 1.6mv
    10   Result_volt = Result_adc * 1.6;   //计算实际的电压值,结果为整数
    11   //将电压值转换结果组合成字符串形式
    12   sprintf(buf, "电压值是: %d.%dV
    ", Result_volt/1000, Result_volt%1000);
    13   UR0_Send_String(buf);
    14   
    15 }

    可利用电压值换算函数实现光照亮度自动控制灯光

     1 void Auto_Control_LED()
     2 {
     3   Get_ADC1_Data();
     4   Data_to_Volt();
     5   if(Result_volt > 2000)
     6   {
     7     D6 = 0;
     8     D5 = 0;
     9     D4 = 0;
    10   } 
    11   else if(Result_volt > 1500)
    12   {
    13     D6 = 1;
    14     D5 = 0;
    15     D4 = 0;
    16   }
    17   else if(Result_volt > 1000)
    18   {
    19     D6 = 1;
    20     D5 = 1;
    21     D4 = 0;
    22   }
    23   else
    24   {
    25     D6 = 1;
    26     D5 = 1;
    27     D4 = 1;
    28   }
    29 }

    利用光敏传感器,利用ADC采集数据,再将采集到的数据通过if条件实现不同的灯光变化。

  • 相关阅读:
    20180530
    vue路由配置出错,导致页面跳转会有闪屏问题
    20180528
    vuecli+ivew项目搭建
    centos6安装mysql
    华为云服务ESC
    centos6安装nginx
    国产操作系统aarch64编译filebeat
    Python常见问题
    Git
  • 原文地址:https://www.cnblogs.com/yuling520/p/12728181.html
Copyright © 2011-2022 走看看