0
点赞
收藏
分享

微信扫一扫

CC2530基础实验之采集模拟量传感器值

林塬 2022-01-26 阅读 77


#include<iocc2530.h>
#include<stdio.h>
int a ;

#define LED P1_0
#define uInt32 unsigned long
#define uInt16 unsigned short

int flag = 0; //定时器溢出次数
char output[8]; //定义的数据处理数组

//


void init_LED() //初始化LED
{
P1SEL = 0x00;
P1DIR = 0x01;
P1= 0;
}
void init_UART0()
{
PERCFG = 0x00; //串口0位置1
P0SEL = 0x0c; //0_2 0_3设置特殊端口
U0CSR |=0X80; //0100 0000 0x80 串口通信的语言这里使用USART

U0BAUD =59 ;
U0GCR=10 ; //波特率57600

U0UCR |=0x80; //流控制禁止
U0CSR |=0x40; //允许接受数据
UTX0IF = 0; //接受标志位
URX0IF = 0; //发送标志位

URX0IE=1; //使能中断
EA=1; //中断总开关

}

void init_Timer1()
{
CLKCONCMD &= ~0X40;
while(CLKCONSTA & 0X40);
CLKCONCMD &= ~0X47;

T1CTL = 0X05;
IEN1 |= 0X02;
EA = 1;
}

void SendString(char *str) //发送字符串
{
while(1)
{
if(*str == '\0')
break;
U0DBUF = *str++;
while(!UTX0IF);
UTX0IF = 0;
}
}

void init_ADC()
{
APCFG |=1; //模拟IO口使能
P0SEL |= 0X01; //片上外设
P0DIR &= ~0X01; //设置输入模式
}

uInt16 get_ADC() //ADC处理函数
{
init_ADC();
ADCCON3 = 0X90; //AVDD5引脚;9位分辨率
ADCIF = 0; //ADC中断标志位
ADCCON3 = (0x80 | 0x10 | 0x00);//采用基准电压 acdd5: 3.3v,通道0, 启动 AD 转换
while(!ADCIF);

uInt32 value;

value = ADCH;
value = value << 8;
value |= ADCL;
value = value*330; //电压值 = (value * 3.3) / 32768
value = value >>15; // value * 330 是为了后面处理数据所以多乘 100

return value; //返回一个短整形value值
}

void get_GZ() //光照处理函数
{
uInt16 GZ_value;
GZ_value = get_ADC();
output[0] = GZ_value/100+0x30;
output[1] = 0x2e;
output[2] = GZ_value/10%10+0x30;
output[3] = GZ_value%10+0x30;

output[4] = 0x0d;
output[5] = 0x0a;

}

#pragma vector = T1_VECTOR
__interrupt void T1_f()
{
EA=0;
flag++;
if(flag>=30) //溢出时间:0.5s
{
flag = 0;
LED=~LED;
get_GZ(); //调用光照处理函数


SendString(output);
}

T1IF = 0; //清空T1溢出中断标志位
EA=1;
}

void main()
{
init_LED();
init_UART0();
init_Timer1();
while(1);
}



举报

相关推荐

0 条评论