找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2459|回复: 0
打印 上一主题 下一主题
收起左侧

基于CC2530的温湿度ADC源程序

[复制链接]
跳转到指定楼层
楼主
ID:261999 发表于 2018-1-1 15:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. /*

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

  3. 主讲  王加辉

  4. */

  5. #include<iocc2530.h>

  6. #include"stdio.h"

  7. #define uchar  unsigned char

  8. #define uint   unsigned int

  9. void init_UART0(void)/*初始化串口*/

  10. {

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

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

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

  14.    

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

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

  17.    U0BAUD|=216;

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

  19. }


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

  21. {

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

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

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

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

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

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

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

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

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

  31. }


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

  33. {

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

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

  36.     while(CLKCONSTA&0X40);

  37.     CLKCONCMD&=~0X47;

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

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

  40. }


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

  42. {

  43.     int i;

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

  45.     {

  46.        U0DBUF=*character++;

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

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

  49.     }

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

  51.     while(UTX0IF==0);

  52.     UTX0IF=0;

  53. }

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

  55. void delay_ms(int ti)/*延迟函数*/

  56. {

  57.    int x,y;

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

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

  60. }

  61. void main()

  62. {

  63.    int turn=0;

  64.    float ADTEMP=0;

  65.    char temp[6]={0};

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

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

  68.    while(1)

  69.    {

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

  71.           ADTEMP+=recieve_AD();

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

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

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

  75.        temp[2]='.';

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

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

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

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

  80.    }

  81. }

  82. /*zigbee cc2530的AD控制(片内温度计)祝大家学的愉快*/


复制代码

所有资料51hei提供下载:
cc2530温湿度.doc (19.5 KB, 下载次数: 13)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表