liujianbo688 发表于 2013-4-10 10:48:55

CC2530 18b20

/********从这里开始添加DS18B20的程序********/



uint8 sensor_data_value;
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=teml;
sensor_data_value=temh;
}

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

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

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;
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
   }


}
页: [1]
查看完整版本: CC2530 18b20