找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1151|回复: 3
打印 上一主题 下一主题
收起左侧

写入的温控程序为什么单片机读不了ds18b20数据显示000.0采用STC89C52RC单片机12M晶振

[复制链接]
跳转到指定楼层
楼主
#include<reg52.h>
#include<intrins.h>
#include<wendu.h>

#define uchar unsigned char
#define uint unsigned int

sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit led=P3^3;
sbit shenwen=P1^5;
sbit jiangwen=P1^6;
       
uchar code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40,0x00,0x40,0x38,0x76};
uchar code tab3[]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0xC0,0x00};

uchar yi,er,san,si,san1;
uint shangxian=30,xiaxian=0,flag=0;

void delay(int ma);
void display1(uchar yi,uchar er,uchar san,uchar si);
void display2(uchar yi,uchar er,uchar san1,uchar si);
void keyscan();

void main()
{
          float wendu=0;
          int wenduzhen=0;

          yi=11;er=11;san=11;si=11;
          jiangwen=shenwen=1;//继电器
               
          while(1)
                {
                  keyscan();

                  if(flag==0)//温度测试界面
                  {
                          wendu=temget();
                               
                          if(wendu<xiaxian)   //升温
                          {
                                          shenwen=0;
                                        jiangwen=1;
                          }
                          else if((wendu>=xiaxian) && (wendu<=shangxian) )        //实际温度处于保温范围
                          {
                                          shenwen=1;           //继电器初始化
                                        delay(5);
                                        jiangwen=1;
                                        delay(5);
                          }
                          else if(wendu>=shangxian)    //降温开启,烧水功能关闭
                          {
                                          shenwen=1;
                                        jiangwen=0;
                          }

                          wenduzhen=wendu*10;
                      yi=wenduzhen/1000;
                          er=wenduzhen%1000/100;
                          san=wenduzhen%100/10;
                          si=wenduzhen%10;        

                          display1(yi,er,san,si);
                  }
               
                  else         if(flag==2)//温度下限设置界面
                   {
                           yi=13;er=12;
                          xiaxian=shangxian-2;
                      san1=xiaxian%100/10;
                      si=xiaxian%10;
                                 
                          display2(yi,er,san1,si);
                  }

                  else         if(flag==1)//温度上限设置界面
                   {
                           yi=14;er=12;
                      san1=shangxian%100/10;
                      si=shangxian%10;
                                 
                          display2(yi,er,san1,si);
                  }
//                 
//                  if(xiaxian>=shangxian)led=0;//下限超过上限led亮
//                  else led=1;

                }
}

void keyscan()
{
        if(key1==0)//设置界面
        {
                delay(5);
                if(key1==0)
                {
                  flag++;
                  if(flag>2)flag=0;
                }
                while(!key1);       
        }

          if(key2==0)//加数值
        {
                delay(5);
                if(key2==0)
                {
                          if(flag==1)
                        {
                                shangxian++;
                                if(shangxian>90)shangxian=0;
                        }
                        else if(flag==2)
                        {
                                xiaxian++;
                                if(xiaxian>89)shangxian=0;
                        }
                }
                while(!key2);       
        }

        if(key3==0)//减数值
        {
                delay(5);
                if(key3==0)
                {
                          if(flag==1)
                        {
                                shangxian--;
                                if(shangxian<1)xiaxian=1;
                        }
                        else if(flag==2)
                        {
                                xiaxian--;
                                if(shangxian<0)xiaxian=0;
                        }
                }
                while(!key3);       
        }
}

void display1(uchar yi,uchar er,uchar san,uchar si)
{
                P2=0XBF;
                P0=tab[yi];
                delay(1);
       
                P2=0XF7;
                P0=tab[er];
                delay(1);

                P2=0XEF;
                P0=tab3[san];
                delay(1);
       
                P2=0XDF;
                P0=tab[si];
                delay(1);
}

void display2(uchar yi,uchar er,uchar san1,uchar si)
{
                P2=0XBF;
                P0=tab[yi];
                delay(1);
       
                P2=0XF7;
                P0=tab[er];
                delay(1);

                P2=0XEF;
                P0=tab[san1];
                delay(1);
       
                P2=0XDF;
                P0=tab[si];
                delay(1);
}

void delay(int ms)
{
                int i,a;
                for(i=ms;i>0;i--)
                  for(a=125;a>0;a--);
}


#include<reg52.h>
#include<intrins.h>
#include<wendu.h>

uchar temget()
{
    uchar low,high;
    int temp;
        float temperature;

        dsinit();
        write(0xcc);
        write(0x44);
        Delay_us(100);

        dsinit();
        write(0xcc);
        write(0xbe);
        Delay_us(100);

    low=read();
        high=read();       

        temp=((high<<8)|low);
        temperature=temp*0.0625;//分辨率是0.0625

//        temp=high<<4;
//        temp|=(low>>4);        //显示整数

    return temperature;
}

uchar read()
{
        uchar i;
        uchar dat;
        for(i=0;i<8;i++)
        {
                DQ=0;
                _nop_();_nop_();_nop_();_nop_();_nop_();
                dat>>=1;
                DQ=1;
                if(DQ==1)
                {
                                dat|=0x80;
                }
                Delay_us(100);                       
        }
        return dat;
}

void write(uchar dat)
{
                uchar i;
                for(i=0;i<8;i++)
                {
                                DQ=0;
                                DQ=dat&0x01;
                                Delay_us(70);
                                DQ=1;
                                dat>>=1;
                }
}



void dsinit()
{
                DQ=0;
                Delay_us(80);
                DQ=1;
                Delay_us(80);               
}


void Delay_us(uchar us)
{
        while(us--);        
}


#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit DQ=P1^7;

uchar temget();
void write(uchar dat);
uchar read();
void dsinit();
void Delay_us(uchar us);



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:445575 发表于 2019-6-11 23:58 | 只看该作者
仿真软件能读取温度且显示,在硬件电路就出问题了,其他功能都正常
回复

使用道具 举报

板凳
ID:514901 发表于 2019-6-12 21:20 | 只看该作者
既然仿真没问题,那程序就应该没有多大问题,大概是电路问题,我猜是与DS18B20的IO口没接上拉电阻
回复

使用道具 举报

地板
ID:520590 发表于 2019-6-12 22:13 | 只看该作者
可能硬件问题,有接上拉电阻吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表