2252|0

3

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

51单片机的1820测温程序 [复制链接]


#include                

code unsigned char seg7code[]={0x03,0x9f,0x25,0x0d,0x99,0x49,
                               0x41,0x1f,0x01,0x09,0xff}; //不带小数点的共阳数码管段码(因为数码管的码线接反了,所以段码有点不同,下面的也是)

code unsigned char seg7codeB[]={0x02,0x9e,0x24,0x0c,0x98,0x48,
                               0x40,0x1e,0x00,0x08,0x00}; //带小数点的共阳数码管段码

//*********定义一些量*********

sbit DQ=P3^6;
unsigned char tempL=0;
unsigned char tempH=0;
unsigned int sdata;
unsigned char xiaoshu1;
unsigned char xiaoshu2;
unsigned char xiaoshu;
bit  fg=1;      


//******************延时子程序 *******************************
//这个延时程序的具体延时时间是time=i*8+10,适用于小于2ms的延时
//************************************************************
void delay(unsigned char i)
{
for(i;i>0;i--);
}

//***********************************************************
//                     延时子程序
//************************************************************
void delay1ms()
{
unsigned char i;
for(i=124;i>0;i--);  //延时124*8+10=1002us
}

//*****************************初始化程序 *********************************//
Init_DS18B20(void)
{
unsigned char x=0;
DQ=1; //DQ先置高
delay(8); //稍延时
DQ=0; //发送复位脉冲
delay(80); //延时(>480us)
DQ=1; //拉高数据线
delay(5); //等待(15~60us)
x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
delay(20);

//***********判断1820是否在线,不再则令p0.1为1****************

switch(x)         
{
    case 1:P0=0x01;break;}  //若没有检测到就亮一个警示灯      

}   

     
//**********读一个字节************//
ReadOneChar(void)  //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
{
unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
unsigned char dat=0;
for (i=8;i>0;i--) //一个字节有8位
{
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}

//*********************** **写一个字节**************************//
WriteOneChar(unsigned char dat)
{
  unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,
  for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。
  {
   DQ=0; //在开始另一个写周期前必须有1us以上的高电平恢复期。
   DQ=dat&0x01;
   delay(5);
   DQ=1;
   dat>>=1;
  }
  delay(4);
}

//读温度值(低位放tempL;高位放tempH;)
ReadTemperature(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
delay(125); //转换需要一点时间,延时
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
tempL=ReadOneChar(); //读出温度的低位LSB
tempH=ReadOneChar(); //读出温度的高位MSB
  
  if(tempH>0x7e)      //最高位为1时温度是负
  {
   tempL=~tempL;         //补码转换,取反加一
   tempH=~tempH+1;      
   fg=0;      //读取温度为负时fg=0
       }


  sdata = tempL/16+tempH*16;      //整数部分
  xiaoshu1 = (tempL&0x0f)*10/16; //小数第一位
  xiaoshu2 = (tempL&0x0f)*100/16%10;//小数第二位
  xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位

  
}

//********************显示函数****************
void Led(unsigned int date)
{
if(fg==1)
{
  P1=0xfe;     //P1.0=0,选通第一位
  P2=seg7code[date/10];  //十位数,查表,输出
  delay1ms();

   
  P2=0xff;        //消隐

  P1=0xfd;     //P1.1=0,选通第二位,个位数
  P2=seg7codeB[date%10];
  delay1ms();
  P2=0xff;       //消隐

  P1=0xfb;     //P1.3=0,选通第三位,小数点第一位
  P2=seg7code[xiaoshu1];
  delay1ms();
  P2=0xff;         //消隐

  P1=0xf7;     //P1.3=0,选通第四位,小数点第二位
  P2=seg7code[xiaoshu2];
  delay1ms();
  P2=0xff; }      //消隐

   if(fg==0)  //温度为负时显示的数据
   {
  P1=0xfe;     //P1.0=0,选通第一位
  P2=seg7code[11];  //显示负号
  delay1ms();
  P2=0xff;        //消隐

  P1=0xfd;     //P1.1=0,选通第二位,十位数
  P2=seg7code[date/10];
  delay1ms();
  P2=0xff;       //消隐

  P1=0xfb;     //P1.3=0,选通第三位,个位数
  P2=seg7codeB[date%10];
  delay1ms();
  P2=0xff;         //消隐

  P1=0xf7;     //P1.3=0,选通第四位,小数点第一位
  P2=seg7code[xiaoshu1];
  delay1ms();
  P2=0xff;       //消隐
   }

//***********温度上限,若超过34度就令p0.7位为1**********
if(date>=34)
P0=0x80;
else
P0=0xff;
}

//**************************** //主程序

main()
{
while(1)
{
  ReadTemperature();
  Led(sdata);
}
}
此帖出自51单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表