zigbee cc2530 AD 转换温度 学习总结

/*
本程序讲解AD控制(片内温度计)
主讲  王加辉
*/
#include<iocc2530.h>
#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控制(片内温度计)就讲到这里,祝大家学的愉快*/
  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值