cwz8632 发表于 2021-6-14 12:48:28

单片机的数字温度计谁会设计

本帖最后由 cwz8632 于 2021-6-15 17:18 编辑

要求:将温度显示在LCD1602上,当温度超过或低于设定的阈值是,能通过LED闪烁b报警
设计思路:采用单总线数字温度传感器DS1305提供温度值。显示模块采用LCD1602,将温度显示在第一行。温度超过或低于设定的阈值,分别用两个LED进行闪烁报警。会的大神麻烦加下我Q1095360407,我还有一些资料。谢谢。

sunrise085 发表于 2021-6-14 21:43:32

你确定数字温度传感器是DS1305?
我怎么记得这是个时钟芯片啊。。。

sxdqx 发表于 2021-6-28 18:10:20

我会,DS18B20典型温度感应器,我有源码胆没写温度报警程序。DS13系列是时钟芯片吧!

wpp123456 发表于 2021-12-29 20:09:41

#include <reg52.h>//
#include <intrins.h>
#define uint unsigned int   //宏定义
#define uchar unsigned char

//数码管段码
uchar code seg[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
                        0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
uchar smg_wei[] = {0xe3, 0xe7, 0xeb, 0xef, 0xf3, 0xf7, 0xfb, 0xff};
uchar DisplayData={0};
sbit DQ = P3^7;

//延时函数
void delay_ms(uint n)
{
    uint i,j;
    for(i = n; i > 0; i--)
    {
      for(j = 0; j < 114; j++);
    }
}
//延时10*n微秒
void delay_10um(uint n)
{
    while(n--);
}

uchar DS18B20Init()
{
    uchar flag_DQ;
    DQ = 0;             //将总线拉低 480us~960us
    delay_10um(50);   //延时 500us
    DQ = 1;             //然后释放总线,
                        //如果DS18B20做出反应会将在15us~60us后总线拉低
    delay_10um(6);      //延时60us
    flag_DQ = DQ;   
    while(!DQ);   
    //delay_10um(50);   //延时 500us
    return flag_DQ;   
}

//先写低位再读高位
void DS18B20WriteByte(uchar dat)
{
    uchar j;
    for(j=0;j<8;j++)
    {
      DQ = 0;         
      //_nop _: 51单片机中封装好的函数,用于延时,大约1us,需包含#includc“intrins.h”
      _nop_();//延时1微秒
      _nop_();//延时1微秒
      DQ = dat & 0x01;         
      delay_10um(6);//延时 60us
      DQ = 1;
      dat = dat >> 1;//右移一位
    }   
}

//先读低位再读高位
uchar DS18B20ReadByte()
{
    uchar i,byte=0;
    for(i=0;i<8;i++)
    {
      DQ = 0;
      _nop_();
      _nop_();
      byte = byte >> 1;
      DQ = 1;
      _nop_();
      _nop_();

      //byte = byte >> 1;
      if(DQ)
      {   
            byte |= 0x80;
      }      
      delay_10um(5);//延时 50us      
      
    }
    return byte;
}

//读取温度
uint DS18B20ReadTemp()
{
    uint temp = 0;
    uchar tmh,tml;
    //1.初始化DS18B20
    DS18B20Init();
    //2.执行ROM指令
    DS18B20WriteByte(0xcc); //跳过ROM
    //3.执行RAM指令——启动温度测量
    DS18B20WriteByte(0x44); //启动温度转换(测量)   
    delay_10um(75);//延时 750ms
   
    //4.初始化DS18B20
    DS18B20Init();
    //5.执行ROM指令
    DS18B20WriteByte(0xcc); //跳过ROM
    //6.执行RAM指令——读取温度数据
    DS18B20WriteByte(0xbe); //读取暂存器中的温度数据
    tml = DS18B20ReadByte();//读取byte0低位温度值
    tmh = DS18B20ReadByte();//读取byte1高位温度值
    //7.将低温温度和高位温度组合
    temp = tmh;               
    temp <<= 8;
    temp |= tml;
    //8.温度转换
    temp = temp *0.0625 + 0.5;
    return temp;
}

void main()
{
    uchar i,temp;      
    while(1)
    {
      temp = DS18B20ReadTemp();
      DisplayData = seg;
      DisplayData = seg;
      for(i = 0; i < 8; i++)
      {
            
            P2 = smg_wei;/n码
            P0 = DisplayData;      //取段码
            delay_ms(1);
            P0 = 0x00;
      }               
    }
}

wpp123456 发表于 2021-12-29 20:10:35

wpp123456 发表于 2021-12-29 20:09
#include   //
#include
#define uint unsigned int   //宏定义


ds18b20 才是温度传感器{:5_90:}
页: [1]
查看完整版本: 单片机的数字温度计谁会设计