搜索
bottom↓
回复: 0

CC2530 18b20

[复制链接]

出0入0汤圆

发表于 2013-4-10 10:48:55 | 显示全部楼层 |阅读模式
/********从这里开始添加DS18B20的程序********/



uint8 sensor_data_value[2];
uint8 flag;

void Delay_nus(uint16 s)
{
while (s--)
{
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
    asm("NOP");
}
}

/************初始化18B20****************/
void init_1820(void)
{
SET_OUT;
SET_DQ;//输出1

CL_DQ;
halMcuWaitUs(550);//拉低一段时间
//Delay_nus(550);//拉低一段时间
SET_DQ;//释放

SET_IN;//输入

halMcuWaitUs(40); //释放总线后等待15-60us
while(IN_DQ) {;}//等待回复

//Delay_nus(240);//回复的低电平在60到240us
halMcuWaitUs(200);
SET_OUT;
SET_DQ;//回到初始DQ=1;
}

////////////////////
void write_1820(uint8 x)
{
uint8 m;
SET_OUT;            //#define SET_OUT P0DIR|=0x01
for(m=0;m<8;m++)
{  SET_DQ;
     Delay_nus(1);
     CL_DQ;          //拉低
     if(x&(1<<m))    //写数据,从低位开始
     SET_DQ;         //要在15us把数据放在写的数据(0或1)送到总线上
     else
     CL_DQ;
     halMcuWaitUs(40);//拉高15—60us

     SET_DQ;
     halMcuWaitUs(3);//延时3us,两个写时序间至少需要1us的恢复期
}
SET_DQ;
}
////////////////////

uint8 read_1820(void)
{
uint8 temp,k,n;
temp=0;
for(n=0;n<8;n++)
{   SET_OUT;
    SET_DQ;
    Delay_nus(1);
    CL_DQ;
    Delay_nus(1); //延时1us

    SET_DQ;            //此处有疑问0000000000000000000000000000
    SET_IN;
    halMcuWaitUs(6);//至少延时6us

    k=IN_DQ;         //读数据,从低位开始
    if(k)
    temp|=(1<<n);
    else
    temp&=~(1<<n);
    //Delay_nus(60); //60~120us
    halMcuWaitUs(50);
    SET_OUT;

}
return (temp);
}

////////////////////////////////

void read_data(void)
{
uint8 temh,teml;

init_1820(); //复位18b20
write_1820(0xcc);     // 发出转换命令 搜索器件
write_1820(0x44);     //启动
halMcuWaitUs(500);  //I/O 线就必须至少保持 500ms 高电平

init_1820();
write_1820(0xcc);
write_1820(0xbe);     //读取暂存器和 CRC 字节

teml=read_1820(); //读数据
temh=read_1820();

sensor_data_value[0]=teml;
sensor_data_value[1]=temh;
}

////////////处理数据部分/////////////////
unsigned int  DataChange(void)
{

uint8 temh,teml,n,h;
uint8 mid=1;
uint16 num=0;
uint8 decnum=0;
read_data();
teml=sensor_data_value[0];
temh=sensor_data_value[1];

num= temh;//将两个字节整合到一个unsigned int中
num<<=8;
num |= teml;


//num=num*0.0625*100;
/*
for(n=0;n<7;n++)
{   mid=1;
    if(num&0x01)
    {

      for(h=0;h<n;h++)
      {
        mid=mid*2;
      }
     decnum=decnum+mid;
    }
    num>>=1;
}
*/
//teml=teml*0.0625*100;
//decnum=decnum*0.0625*100;
return(num);//返回值
}

//---------------------------END-----------------------------------------------------

/*********************************************************************
* 函数名称:initTempSensor
* 功    能:对本实验所用到的一些组件进行初始化
* 入口参数:无
  * 出口参数:无
* 返 回 值:无
********************************************************************/
void initTempSensor(void)
{
  HAL_DISABLE_INTERRUPTS(); // 禁止所有中断

  HAL_BOARD_INIT();  // 设置主时钟源使用32MHz 晶体振荡器
  P0_0=~P0_0;

  /* 初始化LCD并显示相关信息*/
  HalLcdInit();

  HalLcdWriteString("The temperature is :",HAL_LCD_LINE_1);
  HalLcdWriteString("637--lab",HAL_LCD_LINE_6);

  halMcuWaitMs(100);
}


/*********************************************************************
* 函数名称:main
* 功    能:main函数入口
* 入口参数:无
* 出口参数:无
* 返 回 值:无
********************************************************************/
void main(void)
{
  char lcdBuffer[50];
  unsigned int temperature;
  float xiaoshu=0.0;
  unsigned int num,num1;


    initTempSensor();
    init_1820();

  Delay_nus(100);   //延时1us


  while(1)
  {
    temperature = DataChange(); // 获取温度值
     //temperature/= 100;
    xiaoshu=0.0;
    if(temperature&0x01)
    xiaoshu=xiaoshu+0.0625;
    if(temperature&0x02)
    xiaoshu=xiaoshu+0.125;
    if(temperature&0x04)
    xiaoshu=xiaoshu+0.25;
    if(temperature&0x08)
    xiaoshu=xiaoshu+0.5;
    xiaoshu=xiaoshu*1000;
    num=xiaoshu;
    num1=(temperature&0x0f);
    temperature=temperature>>4;
    temperature=temperature-1;
    sprintf(lcdBuffer, "%d.%d C", temperature,num);
    //  sprintf((char *)lcdBuffer, "%dC", temperature);
    HalLcdWriteString(lcdBuffer, HAL_LCD_LINE_3);

    halMcuWaitMs(2000);//延时等待大约0.5S
   }


}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 18:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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