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 }
电压值换算函数
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\r\n", 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条件实现不同的灯光变化。