微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 使用18B20测温的C语言程序(含上下温度警报)

使用18B20测温的C语言程序(含上下温度警报)

时间:10-02 整理:3721RD 点击:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P3^3;
sbit beep=P3^6;           //蜂鸣器的警报控制位
sbit led0=P1^0;           //四盏led灯的警报控制位
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
uchar code shuma[]=
{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};    //数码管额编码 ,前十个是带小数点的,后十个不带小数点
uint temp;             //临时存放温度数据
float f_temp;             
uint warn_l1=200;          //温度的上下限设置  
uint warn_l2=150;
uint warn_h1=250;
uint warn_h2=300;
void delayms(uint xms)       //延时函数  (X 毫秒)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--)
                        ;
}
void init_18B20()          //初始化18B200
{
        uint i;
        ds=0;
        i=103;
        while(i>0)
                i--;
        ds=1;
        i=4;
        while(i>0)
                i--;
}
bit read_bit()              //读一位数据位  
{
        uint i;
        bit date;
        ds=0;                //先拉低数据线
        i++;
        ds=1;                //数据线置高
        i++;
        i++;
        date=ds;            //读取一位数据
        i=8;                 //计数延时  
        while(i>0)
                i--;           
        return date;
}
uchar read_byte()                //读一个字节数据
{
        uchar i,j,date;
        date=0;
        for(i=1;i<=8;i++)
        {
                j=read_bit();
                date=(j<<7)|(date>>1);     //读取的最低字节正好依次存入
        }
        return date;
}
void write_byte(uchar date)       //写入一个字节数据
{
        uint i;
        uchar j;
        bit testb;
        for(j=1;j<=8;j++)
        {
                testb=date&0x01;
                date=date>>1;
                if(testb)             //写入数据1
                {
                        ds=0;             //先拉低数据线
                        i++;
                        i++;
                        ds=1;             //数据线置高,写入1
                        i=8;                          //计数延时
                        while(i>0)
                                i--;
                }
                else               //写入数据0
                {
                        ds=0;               //拉低数据线 ,写入数据0
                        i=8;                   //计数延时
                        while(i>0)
                                i--;
                        ds=1;                  //数据线置高
                        i++;
                        i++;
                }
        }
}
void change()                //开始转换
{
        init_18B20();
        delayms(1);
        write_byte(0xcc);        //跳过ROM   直接开始温度转换,适用于只有一个从机工作
        write_byte(0x44);                 //开始温度转换 结果存入内部9字节的RAM中
}
uint get_temp()             //读取寄存器中的温度数据   
{
        uchar a,b;
        init_18B20();
        delayms(1);
        write_byte(0xcc);       //跳过ROM   直接开始温度转换,适用于只有一个从机工作  
        write_byte(0xbe);                //读取内部RAM中9字节的温度数据
        a=read_byte();                        //高字节数据
        b=read_byte();                        //低字节数据
        temp=b;
        temp<<=8;
        temp=temp|a;
        f_temp=temp*0.0625;            //温度在寄存器中为12位 ,分辨率为0.0625°
        temp=f_temp*10+0.5;                //乘以10表示小数点后面只取1位,加0.5是四舍五入  
        f_temp=f_temp+0.05;
        return temp;
}
void display(uchar num,uchar date)        //显示数据的函数
{
        uchar i;
        P0=shuma[date];
        i=0xff;
        i=i&(~((0x01)<<(num)));
        P2=i;
        delayms(1);
}
void display_temp(uint t)             //将温度数据传送并显示
{
        uchar i;
        i=t/100;
        display(0,i+10);
        i=t%100/10;
        display(1,i);
        i=t%10;
        display(2,i+10);
}
void warn(uint s,uchar led)
{
        uchar i;
        i=s;
        beep=0;
        P1=~(led);
        while(i--)
                display_temp(get_temp());
    beep=1;
        P1=0xff;
        i=s;
        while(i--)
                display_temp(get_temp());
}
void deal(uint t)
{
        uchar i;
        if((t>warn_l2)&&(t<=warn_l1))
                warn(40,0x01);
        else if(t<=warn_l2)
                warn(10,0x03);
        else if((t<warn_h2)&&(t>=warn_h1))
                warn(40,0x04);
        if(t>=warn_h2)
                warn(10,0x0c);
        else
        {
                i=40;
                while(i--)
                {
                        display_temp(get_temp());
                }
        }
}
void main()
{
        //uchar i;
        while(1)
        {
                change();
                deal(get_temp());                      //得到温度数据,并进行上下限的比较处理 ,同时显示数据
                //for(i=10;i>0;i--)
                        //display_temp(get_temp());            //如果不需要上下温度的限制,则可直接显示温度  
                delayms(5);
        }       
}

自己顶一下!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top