⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 18b20c语言.c

📁 这是一个经过调试过并且很好用的一个智能温度传感器ds18b20程序!
💻 C
字号:
#include<reg51.h>
#include<absacc.h>
#include<intrins.h>
#define uchar unsigned char
#define tempint DBYTE[0X30]
#define tempdf DBYTE[0X31]
uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XC6,0XC6,0XC6,0XC6};
char xdata w _at_ 0x7FFF;
sbit dat=P3^2;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit P17=P1^7;
void set_ds18b20();               //初始化DS18B20子程序
void get_temperature();           //获得温度子程序
void read_ds18b20();              //读DS18B20子程序
void write_ds18b20(uchar command);//向DS18B20写1字节子程序
void delayms(uchar count);        //延时count毫秒子程序
void disp_temp();                 //显示温度子程序
void datachange ();

/*=====================================================================*/
void main(void)
{
     EA = 0;                        //禁止中断
     SP = 0x60;                     //设置堆栈指针
     while(1)
     {
         get_temperature();       //获得温度
         disp_temp();             //显示温度
     }
}
/*=====================================================================*/
void set_ds18b20()
{
    while(1)
    {
        uchar delay,flag;
        flag=0;
        dat=0;                    //数据线置低电平
        delay=250;
        while(--delay);           //低电平保持500us
        dat=1;                    //数据线置高电平
        delay=30;
        while(--delay);           //低电平保持60us
        while(dat==0)             //判断DS18B20是否发出低电平信号
        {
            delay=120;            //DS18B20响应,延时240us
            while(--delay);
            if(dat)               //DS18B20发出高电平初始化成功,返回
            {
                flag=1;           //DS18B20初始化成功标志
                break;
            }
        }
        if(flag)                  //初始化成功,再延时480us
        {
            delay=240;
            while(--delay);
            break;
        }
    }
}

/*=========================================================================*/
void get_temperature()            //温度转换、获得温度子程序
{
    set_ds18b20();                //初始化DS18B20
    write_ds18b20(0xcc);          //发跳过ROM匹配命令
    write_ds18b20(0x44);          //发温度转换命令
    disp_temp();                  //显示温度,等待转换结束,大于600ms
    set_ds18b20();
    write_ds18b20(0xcc);          //发跳过ROM匹配命令
    write_ds18b20(0xbe);          //发出读温度命令
    read_ds18b20();               //将读出的温度数据保存到tempint和tempdf处
}
/*=========================================================================*/
void read_ds18b20()
{
    uchar delay,i,j,temp,temph,templ;
    j=2;                          //读2位字节数据
    do
     {
       for(i=8;i>0;i--)              //一个字节分8位读取
       {
        temp>>=1;                 //读取1位右移1位
        dat=0;                    //数据线置低电平
        _nop_();
        _nop_();
        dat=1;                    //数据线置高电平
        delay=4;
        while(--delay);           //延时4us
        if(dat)                   //读取1位数据
        temp|=0x80;
        delay=10;                 //读取以为数据后延时20us
        while(--delay);
       }
       if(j==2)                      //读取的第一字节存templ
         templ=temp;
       else
        temph=temp;               //读取的第二字节存temph
     }
     while(--j);
    tempdf=templ&0x0f;            //将读取的数据转换成温度值,整数部分存tempint,小数部分存tempdf
    templ>>=4;
    temph<<=4;
    tempint=temph|templ;
}
/*====================================================================================*/
void write_ds18b20(uchar command)
{
    uchar delay,i;
    for(i=8;i>0;i--)              //将一字节数据一位一位写入
    {
        dat=0;                    //数据线置低电平
        delay=8;                  //延时16us
        while(--delay);
        dat=command&0x01;         //将数据放置在数据线上
        delay=20;                 //延时40us
        while(--delay);
        command=command>>1;       //准备发送下一位数据
        dat=1;                    //发送完一位数据,数据线置高电平
        _nop_();                  //延时1us
       
    }
}
/*=====================================================================================*/
void disp_temp()
{
    uchar tempinth,tempintl,tempdfh,tempdfl,cnt;
    tempinth=tab[tempint/10];     //整数高半字节
    tempintl=tab[tempint%10]&0x7f;//整数低半字节  由于同实际温度有2度温差故此减2
    tempdfh=tab[tempdf*10/16];    //小数高半字节
    tempdfl=tab[tempdf*100/16%10];//小数低半字节
    cnt=200;                      //循环显示200次
    while(--cnt)
    { 
   
       
    w=tempinth;  //整数温度显示
    //P2=0xfe;      //选通数码管左一位
    P20=0;
    delayms(1);
    P20=1; 
  
    w=tempintl;
    //P2=0xfd;      //选通数码管左2位
    P21=0;
    delayms(1); 
    P21=1;
   
    w=tempdfh;   //小数温度显示
    //P2=0xfb;      //选通数码管第三位
    P22=0;
    delayms(1); 
    P22=1;
 
    w=0xc6;
    //P2=0xf7;
    P23=0;
    delayms(1);
    P23=1;
	//w=tempdfl;
    //P2=0xf7;      //选通数码管第四位
    //delayms(1);
    P24=0;
    delayms(1);
    P24=1;

    w=0xff;
    
    P17= ~ P17;
    }
}




/*void disp_temp()
{
uchar tempinth,tempintl,tempdfh,tempdfl,cnt;
int i,m;
    m=0xfe;

    tempinth=tab[tempint/10];     //整数高半字节
    tempintl=tab[tempint%10]&0x7f;//整数低半字节
    tempdfh=tab[tempdf*10/16];    //小数高半字节
    tempdfl=tab[tempdf*10%10];    //小数低半字节
    /* cnt=200;                   //循环显示200次
    while(--cnt)
    void datachange (void);
    for(i=0;i<4;i++)
    {
     P2=m;
     m<<=1;
     m+=1;
     w=display_code[tm[i]];  //18B20C-0.C(169): error C202: 'tm': undefined identifier
     delayms(1);
    }

}

void datachange (void)
    {
    tm[0]= tempinth;       //18B20C-0.C(169): error C202: 'tm': undefined identifier
    tm[1]= tempintl;
    tm[2]= tempdfh;
    tm[3]= tempdfl;
    }*/

/*============================================================================================*/
void delayms(uchar count)
{
    uchar i,j;
    do
    {
        for(i=5;i>0;i--)
        for(j=98;j>0;j--);
    }while(--count);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -