ZigBee-CC2530单片机 - 实现外部电压值的测量

该博客介绍了如何使用ZigBee CC2530单片机通过ADC模块测量外部电压。程序包括了ADC初始化、定时器中断服务、串口通信及数据显示。通过定时器T1每0.2秒获取一次ADC转换结果,转换后的电压值以0.01V的分辨率显示,并通过UART0发送到串口。
摘要由CSDN通过智能技术生成

ZigBee-CC2530单片机 - 实现外部电压值的测量

程序源码

/* 包含头文件 */
#include "ioCC2530.h"
#include <string.h>
#define LED1 P1_0     // P1_0定义为P1_0  led灯端口
#define uint16 unsigned short
#define uint32 unsigned long
#define uint unsigned int

unsigned int flag,counter=0; //统计溢出次数
unsigned char s[8];//定义一个数组大小为8

void InitLED()
{
	P1SEL&=~0X01;          //P1_0设置为普通的IO口 1111 1110
	P1DIR |= 0x01;   			//配置P1_0的方向为输出
	LED1=0;
}

void adc_Init(void)
{
	APCFG  |=1;
	P0SEL  |= 0x01;	
	P0DIR  &= ~0x01;	
}
/************************************************************
* 名称       get_adc
* 功能       读取ADC通道0电压值
* 入口参数   无
* 出口参数   16位电压值,分辨率为10mV
***************获取ADC通道0电压值************************/
uint16 get_adc(void)
{
	uint32 value;
	ADCIF = 0;   //清ADC 中断标志
	//采用基准电压avdd5:3.3V,通道0,启动AD转化
	ADCCON3 = (0x80 | 0x10 | 0x00);
	while ( !ADCIF )
	{
		;  //等待AD转化结束
	}
	value = ADCH;
	value = value<< 8;
	value |= ADCL;
	// AD值转化成电压值
	// 0 表示 0V ,32768 表示 3.3V
	// 电压值 = (value*3.3)/32768 (V)
	value = (value * 330);
	value = value >> 15;   // 除以32768
	// 返回分辨率为0.01V的电压值
	return (uint16)value;
}
/**********串口通信初始化************************/
void initUART0(void)
{
	PERCFG = 0x00;	
	P0SEL = 0x3c;	
	U0CSR |= 0x80;
	U0BAUD = 216;
	U0GCR = 10;
	U0UCR |= 0x80;
	UTX0IF = 0;  // 清零UART0 TX中断标志
	EA = 1;   //使能全局中断
}

/*************************************************
* 函数名称:inittTimer1
* 功    能:初始化定时器T1控制状态寄存器
******************定时器初始化*****************************/
void inittTimer1()
{
	CLKCONCMD &= 0x80;   //时钟速度设置为32MHz
	T1CTL = 0x0E; // 配置128分频,模比较计数工作模式,并开始运行
	T1CCTL0 |= 0x04;  //设定timer1通道0比较模式
	T1CC0L =50000 & 0xFF;    // 把50000的低8位写入T1CC0L
	T1CC0H = ((50000 & 0xFF00) >> 8); //把50000的高8位写入T1CC0H
	
	T1IF=0;           //清除timer1中断标志(同IRCON &= ~0x02)
	T1STAT &= ~0x01;  //清除通道0中断标志
	
	TIMIF &= ~0x40;  //不产生定时器1的溢出中断
	//定时器1的通道0的中断使能T1CCTL0.IM默认使能
	IEN1 |= 0x02;    //使能定时器1的中断
	EA = 1;        //使能全局中断
}
/***********************************************************
* 函数名称:UART0SendByte
* 功    能:UART0发送一个字节
* 入口参数:c
* 出口参数:无
* 返 回 值:无
************************************************************/
void UART0SendByte(unsigned char c)
{
	U0DBUF = c;		// 将要发送的1字节数据写入U0DBUF
	while (!UTX0IF) ;  // 等待TX中断标志,即U0DBUF就绪
	UTX0IF = 0;       // 清零TX中断标志
}

/**************************************************************
* 函数名称:UART0SendString
* 功    能:UART0发送一个字符串
* 入口参数:*str
* 出口参数:无
* 返 回 值:无
**********************************************************/
void UART0SendString(unsigned char *str)
{
	while(*str != '\0')
	{
		UART0SendByte(*str++);   // 发送一字节
	}
}

/**************获取电压值并处理数据******************/
void Get_val()
{
	uint16 sensor_val;
	sensor_val=get_adc();
	s[0]=sensor_val/100+'0';
	s[1]='.';
	s[2]=sensor_val/10%10+'0';
	s[3]=sensor_val%10+'0';
	s[4]='V';
	s[5]='\n';
	s[6]='\0';
}
/******************************************
* 功    能:定时器T1中断服务子程序
************************************/
#pragma vector = T1_VECTOR //中断服务子程序
__interrupt void T1_ISR(void)
{
	EA = 0;   //禁止全局中断
	counter++;
	T1STAT &= ~0x01;  //清除通道0中断标志
	EA = 1;   //使能全局中断
}
/******************************************
* 函数名称:main
* 功    能:main函数入口
* 入口参数:无
* 出口参数:无
* 返 回 值:无
**************************************************/
void main(void)
{
	InitLED();
	inittTimer1();  //初始化Timer1
	initUART0();  // UART0初始化
        adc_Init(); // ADC初始化
	while(1)
	{
		if(counter>=15)     //定时器每0.2S溢出中断计次
		   {
			counter=0;       //清标志位
			LED1 = 1;    //指示灯点亮
			Get_val();
			UART0SendString("光照传感器电压值  ");
			UART0SendString(s); 
			LED1 = 0;    //指示灯熄灭
		    }
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WW......

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值