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条件实现不同的灯光变化。

原文地址:https://www.cnblogs.com/yuling520/p/12728181.html