目录

ZIGBEE-AD-转换-片内温度学习总结

目录

ZIGBEE AD 转换 片内温度学习总结

/*

本程序讲解AD控制(片内温度计)

主讲  王加辉

*/

#include

#include"stdio.h"

#define uchar  unsigned char

#define uint   unsigned int

void init_UART0(void)/初始化串口/

{

P0SEL|=0X3C;/这里我们是选择P0_2,P0_3,P0_4,P0_5最为串口通信的I/O口/

P2DIR&=~0XC0;/在这里我们设置串口0的优先级大于串口1,也就是设置使用串口0/

PERCFG=0X00;/PERCFG是接口控制寄存器,这里我们选择串口0位置1,就是选择P0-2和P0-3为串口通信接口/

U0CSR|=0X80;/选择串口的工作方式,我们选择为异步通信/

U0GCR|=11;/结合U0BAUD设置波特率为115200,请各位查找手册/

U0BAUD|=216;

UTX0IF=0;/UTX0IF为串口0发送中断标志位,我们将其置零/

}

float recieve_AD(void)/AD转换,读取片内温度计实时电压/

{

uint value=0;/无符号整型变量,用来储存AD转换值/

ADCCON1|=0X30;/选择AD转换启动的方式为手动启动/

ADCCON3=0X3E;/设置AD转换的信息源为片内温度传感器、选择内部参考电压为1.25V,设置单通道AD转换的分辨率为512dec,12位,此处要对照AD寄存器手册查看/

ADCCON1|=0X40;/手动启动AD转换/

while(!(ADCCON1&0X80));/等待AD一次转换完成/

value=ADCL»4;/*CC2530的AD转换数据是由高到低存储的,ADCL低4位无效,所以我们要向右移动去掉无效四位,

这我也是在CC2430学校视频上看到的,暂时我不能给出确切解释,有懂得请补充一下,谢谢*/

value|=(uint)ADCH«4;/视频上解释高位数据向左移动4位是为了和低位对应,然后相加,我无法做出准确解释,我找到相关资料再做补充解释/

return value*0.06229-303.3-4;/温度的计算公式为:温度=((测量电压-某一电压)/温度系数)-温度的误差值/

}

void init_tempurature()/初始化温度传感器/

{

IEN0=IEN1=IEN2=0;/因为AD转换会产生中断,所以此处我们先关掉所用中断,对于AD中断的使用大家可以参考手册,查看其中断源/

CLKCONCMD&=~0X40;/设置时钟频率,在前面的串口通信中我们也曾讲过/

while(CLKCONSTA&0X40);

CLKCONCMD&=~0X47;

TR0=0X01;/这里我让AD和温度传感器相连/

ATEST=0X01;/启动温度传感器/

}

void data_UART0(char *character,int length)/串口数据输出函数/

{

int i;

for(i=0;i<length;i++)

{

U0DBUF=*character++;

while(UTX0IF==0);/每次发送数据完成后串口发送中断位硬件自动置一/

UTX0IF=0;/这里我们要软件将其置一/

}

U0DBUF=0X0A;/这句是在串口中输出一个换行,大家可以试试/

while(UTX0IF==0);

UTX0IF=0;

}

/告诉大家一个在串口通信中将数字转换成字符输出的简单方法,就是在数字后面加0x30,大家可以尝试/

void delay_ms(int ti)/延迟函数/

{

int x,y;

for(x=0;x<ti;x++)

for(y=0;y<526;y++);

}

void main()

{

int turn=0;

float ADTEMP=0;

char temp[6]={0};

init_tempurature();//初始化温度传感器

init_UART0();//初始化串口通信

while(1)

{

for(turn=0;turn<60;turn++)/累计60次的温度/

ADTEMP+=recieve_AD();

ADTEMP=ADTEMP/60;/求60次温度的平均值/

temp[0]=(uchar)(ADTEMP)/10+48;/将温度的数值存入数组temp中/

temp[1]=(uchar)(ADTEMP)%10+48;

temp[2]='.';

temp[3]=(uchar)(ADTEMP*10)%10+48;

temp[4]=(uchar)(ADTEMP*100)%10+48;

data_UART0(temp,5);//串口输出温度值

delay_ms(2000);//控制每次输出的时间间隔

}

}

/zigbee cc2530的AD控制(片内温度计)就讲到这里,祝大家学的愉快/