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

📄 wenduji.txt

📁 基于单片机的数字温度计
💻 TXT
字号:
#include <stdio.h>
#include <reg51.h>
#include <intrins.h>
#define WENDU 40			//报警温度
#define uchar unsigned char
#define uint unsigned int

sbit DQ = P3^4;               //DS1820的数据位     
uchar Status_Flag; 
unsigned data Tbegin = WENDU;    //设定报警温度初值
unsigned data Temp1 = 0;   
unsigned char c = 0;
unsigned char d = 0;
unsigned a[4];                              //温度数值存放
unsigned char code tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//0-9,-,全灭 (共阳字段表)
uchar code ditab[16]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
uchar code PX[]={0xff,0xfd,0xfb,0xf7};

void Delay(unsigned x,unsigned y);                      //延时程序
void ChangeTemp();                  //温度数值的转换
void DisPlay();                     //数码管显示程序

void Delay1(unsigned int i);
void Init_DS18B20(void);
unsigned ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void ReadTemperature(void);



/*------------------------------------主程序----------------------------------*/
void main()
{	
	TMOD = 0x01;
    TH0 = 0xDC;
    TL0 = 0xB0;
    EA = 1;
    ET0 = 1;
    TR0 = 1;    
    while(1)
    {
        ReadTemperature();
    }
}

//双变量延时
void Delay(unsigned x,unsigned y)
{
    int i,j;

    for(i=0;i<x;i++)
    for(j=0;j<y;j++);
}



//温度数值的转换
void ChangeTemp()
{     
        if(d==15)
        {
            a[0] = 10;
        }
        else
        {
            a[0] = 11;
        }
       
        a[1] = Temp1 / 10;
        a[2] = Temp1 % 10;
        a[3] = ditab[c];
}


//显示函数
void DisPlay()
{       
    char k;
    ChangeTemp();
    for(k=0;k<4;k++)
    {
        if( k==2)
        {
            P1=(tab[a[k]] & 0x7f);
        }
        else
        {
            P1=tab[a[k]];
        }
        P2=PX[k];
        Delay(5,23);
    }
}

//显示定时器
void INT_T0() interrupt 1 using 0
{	
    TH0 = 0xDC;
    TL0 = 0xB0;
  //  ReadTemperature();
    DisPlay();
}


/*------------------------------温度传感器子程序--------------------------*/

void Delay1(unsigned int i)
{
    while(i--); 
}


//初始化函数
void Init_DS18B20(void)
{
    unsigned char x = 0;
    DQ = 1;    //DQ复位
    Delay1(8);  //稍做延时
    DQ = 0;    //单片机将DQ拉低
    Delay1(80); //精确延时 大于 480us//80
    DQ = 1;    //拉高总线
    Delay1(14);
    x = DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
    Delay1(20);
}


//读一个字节
unsigned ReadOneChar(void)
{
    unsigned char i = 0;
    unsigned char dat = 0;

    for (i=8;i>0;i--)
    {
        DQ = 0; // 给脉冲信号
        dat >>= 1;
        DQ = 1; // 给脉冲信号
        if(DQ)
            dat |= 0x80;
        Delay1(4);
    }
    return(dat);
}


//写一个字节
void WriteOneChar(unsigned char dat)
{
    unsigned char i = 0;

    for (i=8; i>0; i--)
    {
        DQ = 0;
        DQ = dat&0x01;
        Delay1(5);
        DQ = 1;
        dat >>= 1;
    }
    Delay1(4);
}


//读取温度
void ReadTemperature(void)
{
    unsigned char a = 0;
    unsigned char b = 0;

    Init_DS18B20();
    WriteOneChar(0xcc); // 跳过读序号列号的操作
    WriteOneChar(0x44); // 启动温度转换
    Init_DS18B20();
    WriteOneChar(0xcc); //跳过读序号列号的操作
    WriteOneChar(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
    a=ReadOneChar();   //读取温度值低位
    b=ReadOneChar();   //读取温度值高位
    c=(a&0x0f);d=b;
    a = a >> 4;            //低位右移4位,舍弃小数部分
    b = b << 4;            //高位左移4位,舍弃符号位
    Temp1 = b | a;
}






⌨️ 快捷键说明

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