我是靠谱客的博主 独特煎饼,最近开发中收集的这篇文章主要介绍ZigBee-CC2530单片机 - 实现外部电压值的测量,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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 != '')
	{
		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]='';
}
/******************************************
* 功    能:定时器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;    //指示灯熄灭
		    }
	}
}

最后

以上就是独特煎饼为你收集整理的ZigBee-CC2530单片机 - 实现外部电压值的测量的全部内容,希望文章能够帮你解决ZigBee-CC2530单片机 - 实现外部电压值的测量所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部