微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 温控程序。。。不知道哪里出错了。。。帮忙看一下

温控程序。。。不知道哪里出错了。。。帮忙看一下

时间:10-02 整理:3721RD 点击:
我打算弄一个温度控制的继电器的程序,并且可以显示数值,温度传感器用的是DS18B20,单片机是STC89C51,开发板的原理图如图,我的程序需要实现的功能是:1、可以用数码管显示温度;2、温度高于25摄氏度时继电器闭合,低于23摄氏度时继电器断开。程序如下:
#include <reg52.h>
#include <intrins.h>  
#define uchar unsigned char
#define uint unsigned int
sbit D1=P2^0;
sbit D2=P2^1;
sbit D3=P2^2;
sbit K1=P3^7;
uchar code designP1[]={
0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
0x99,0x92,0x82,0xf8, // 4, 5, 6, 7
0x80,0x90};             // 8, 9  
uchar code tablel[]={ //带小数点的段码
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,
0x87,0xff,0xef};
uchar dispbitcode[]={ //位选
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
/********************************
  Ds18B20读取温度模块
********************************/
char a=0;
sbit DQ = P1^3;                //DS18B20的数据口位P1.3
uchar TPH;                           //存放温度值的高字节
uchar TPL;                           //存放温度值的低字节
uchar TN;
void DS18B20_Reset();
void DS18B20_WriteByte(uchar dat);
uchar DS18B20_ReadByte();
void DelayXus(uchar n)
{
    while (n--)
    {
        _nop_();
        _nop_();
    }
}
void main()
{unsigned char i;
unsigned int m,n,x;
     while(1)     
  {
    DS18B20_Reset();                //初始化
    DS18B20_WriteByte(0xCC);        //跳过ROM命令
    DS18B20_WriteByte(0x44);        //开始转换命令
    while (!DQ);                    //等待转换完成
    DS18B20_Reset();                //初始化
    DS18B20_WriteByte(0xCC);        //跳过ROM命令
    DS18B20_WriteByte(0xBE);        //读暂存存储器命令
    TPL = DS18B20_ReadByte();       //读温度低字节
    TPH = DS18B20_ReadByte();       //读温度高字节
TN=TPH*16+TPL/16 ;                              
   i=TN;//读温度
   if(i>0 && i<=10)        //如果温度在0到10度之间直接给七段数码管赋值
    {
    m=(i*10)/10;
    D1=0;
    D2=1;
    D3=0;
    P1=designP1[m];
    }
   else//如果温度大于10度
    {
    m=i%10;//先给第二个七段数码管赋值
       D1=0;
    D2=1;
       D3=0;
       P1=designP1[m]|0x80;               
       n=i/10;//再给第三个七段数码管赋值
       D1=0;
    D2=0;
       D3=1;
       P1=designP1[n];
       }
   x=(i*10)%10;//再给第一个数码管赋值
   D1=1;
   D2=0;
   D3=0;
   P1=designP1[x];
   }
/************************************
           继电器控制模块
  ***********************************/
if(TN>25)   //如果温度大于25℃,继电器闭合
   K1=0;   
if(TN<23)   //如果温度小于23℃,继电器断开
K1=1;
}
/**************************************
初始化DS18B20
**************************************/
void DS18B20_Reset()
{ char a;
    a = 1;
    while (a)
    {
        DQ = 0;                     //送出低电平复位信号
        DelayXus(240);              //延时至少480us
        DelayXus(240);
        DQ = 1;                     //释放数据线
        DelayXus(60);               //等待60us
        a= DQ;                    //检测存在脉冲
        DelayXus(240);              //等待设备释放数据线
        DelayXus(180);
    }
}
/**************************************
从DS18B20读1字节数据
**************************************/
uchar DS18B20_ReadByte()
{
    uchar i;
    uchar dat = 0;
    for (i=0; i<8; i++)             //8位计数器
    {
        dat >>= 1;
        DQ = 0;                     //开始时间片
        DelayXus(1);                //延时等待
        DQ = 1;                     //准备接收
        DelayXus(1);                //接收延时
        if (DQ) dat |= 0x80;        //读取数据
        DelayXus(60);               //等待时间片结束
    }
    return dat;
}
/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(uchar dat)
{
    char i;   
    for (i=0; i<8; i++)             //8位计数器
    {
  if(dat&0x01)
     {
        DQ = 1;                     //开始时间片
         _nop_();
      DQ = 0;   
      DelayXus(1);
   DQ = 1;
        DelayXus(60); //等待时间片结束
  }
       else
  {
    DQ=1;
    _nop_();
    DQ=0;
   DelayXus(60);
  DQ=1;
  }
  dat>>=1;  
  DelayXus(1);
  }     
        
    }





好象还少一段bit read_bit()程序,这是读一位(bit)数据的程序,一位都没有读出来怎么可能就有一字节(byte)呢?

有点不明白,我是初学者,这个18B20的全部程序是我拷贝的,我主要就是利用输出的TN的值。所以你那个Bit的什么的我不太明白。

感觉很乱啊,特别的显示那一块

好好学习天天向上

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

网站地图

Top