/********从这里开始添加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
}
}
一周热门 更多>