找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2264|回复: 7
收起左侧

STC15F2K60S2+DS18B20怎么一直都是显示-0.1°,求大佬帮忙,单片机代码如下

[复制链接]
回帖奖励 1 黑币 回复本帖可获得 1 黑币奖励! 每人限 5 次
ID:858978 发表于 2021-1-8 18:43 | 显示全部楼层 |阅读模式
本帖最后由 111gjk 于 2021-1-8 18:48 编辑

#include"STC15F2K60S2.h"
//#include"reg52.h"
#include"intrins.h"
        sbit DQ=P4^2;
//   sbit DQ=P3^6;
        sbit beep=P3^7;
        sbit LED_H=P1^4;
        sbit LED_L=P1^5;
        
        unsigned char code Duan_Ma[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
        unsigned char code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
        char Alarm_Temp[2]={70,-20};
        unsigned long int  Current=0;
        unsigned char Temp_Value[]={0x00,0x00};
        unsigned char Display[]={0,0,0,0};//待显示的各温度数位
        bit Alarm_H=0,Alarm_L=0;
        bit DS18B20_IS_OK=1;
        unsigned int  Timer0_cout=0;
        
        void delay(unsigned int k)
        {
                        while(--k);
        }
        void delay15us(unsigned long int i)   //误差 0us
{
        while(i--)
        {
    unsigned char a;
    for(a=6;a>0;a--);
        }
}

//        void dsreset()
//        {
//                unsigned int i;
//                DQ=0;
//                i=103;
//                while(i>10)
//                        i--;
//                DQ=1;
//                i=4;
//                while(i>0)
//                        i--;
//        }
                unsigned char DS18B20_Init()//18B20初始化
        {
                        unsigned char staues;
                        DQ=1;
                        delay(8);
                        DQ=0;
                        delay15us(32);
                        DQ=1;
                delay15us(4);
                  staues=DQ;
                delay15us(32);
//                  while(1)
//                        {
//                                if( staues==1)
//                                {
//                                        P0=0x3f;
//                                        P2=0x00;
//                                }
//                                        else
//                                        {
//                                                P0=0x06;
//                                                P2=0x00;
//                                        }
//                                
//                        }
                        DQ=1;
                        delay15us(16);
                        
                return staues;
        }               
        unsigned char Red_Byte_1()//读一个字节
        {
unsigned char byte = 0;
  unsigned char  j=0;   
//      DQ=1;               
//                  delay(1);
        for(j=8; j>0; j--)
        {
                DQ = 0;
                byte >>= 1;           //先将总线拉低1us
                DQ = 1;                                          //然后释放总线                //延时6us等待数据稳定
//                                            delay15us(3);
                if(DQ)
                byte |= 0x80;
                           delay15us(20);                                         
        }   
        return byte;
        }
unsigned  Wri_Byte_1(unsigned int dat)//写入一个字节
        {
                unsigned char i;
                for(i=8;i>0;i--)
                {
                        DQ=0;
                        DQ=dat&0x01;
                        delay15us(20);
                        DQ=1;
                        dat>>=1;
                }
                delay15us(20);
//                while(1)
//                {
//                        if(dat==0)
//                        {
//                        P0=0x3f;
//                        P2=0x00;
//                  }
//                }
                return dat;
        }

        void Red_Temp_ture()//读取温度值  
        {
//                dsreset();
//                delay15us(6);
                if(DS18B20_Init()==1)
                        DS18B20_IS_OK=0;
                else
                {
//                        delay15us(12);
                        DS18B20_Init();
                        Wri_Byte_1(0xCC);//跳过序列号
                        Wri_Byte_1(0x44);
//             delay15us(12);
                        DS18B20_Init();
//                        delay15us(3000);
                        Wri_Byte_1(0xCC);
                        Wri_Byte_1(0xBE);
                        Temp_Value[0]=Red_Byte_1();
                        Temp_Value[1]=Red_Byte_1();
                        Alarm_Temp[0]=Red_Byte_1();
                        Alarm_Temp[1]=Red_Byte_1();
                        DS18B20_IS_OK=1;
                }
//                DS18B20_IS_OK=1;
        }
        void Set_Alare_Temp_V()//设置温度报警值
        {
                        DS18B20_Init();
                        Wri_Byte_1(0xCC);
                        Wri_Byte_1(0x4E);
                        Wri_Byte_1(Alarm_Temp[0]);
                        Wri_Byte_1(Alarm_Temp[1]);
                        Wri_Byte_1(0x7F);
                  DS18B20_Init();
                        Wri_Byte_1(0xCC);
                        Wri_Byte_1(0x48);
        }
        void Display_Temp()//数码管上显示温度
        {
                unsigned char i;
                unsigned char t=150;
                unsigned char ng=0,np=0;
         char  Singed_Currtet_Temp;//如果为负数则取反加一,并设置负号标识及负号显示位置
                if((Temp_Value[1]&0xF8)==0xF8)
                {
                        Temp_Value[1]=~Temp_Value[1];
                        Temp_Value[0]=~Temp_Value[0]+1;
                        if(Temp_Value[0]==0x00)
                                Temp_Value[1]++;
                          ng=1;
                                np=0xFD;
                }
                Display[0]=df_Table[Temp_Value[0]&0x0F];
                Current=((Temp_Value[0]&0x0F)>>4)|((Temp_Value[1]&0xF0)<<4);
                if(Singed_Currtet_Temp==ng)
                {
                        Singed_Currtet_Temp=-Current;
                }
                else
                {
                        Singed_Currtet_Temp=Current;
                }
                Alarm_H=Singed_Currtet_Temp>=Alarm_Temp[0]?1:0;
                Alarm_L=Singed_Currtet_Temp<=Alarm_Temp[1]?1:0;
                Display[3]=Current/100;
                Display[2]=Current%100/10;
                Display[1]=Current%10;
//                Display[3]=0;
//                Display[2]=1;
//                Display[1]=0;
                if(0==Display[3])
                {
                        Display[3]=10;
                        np=0xFB;
                        if(0==Display[2])
                        {
                                Display[2]=10;
                                np=0xF7;
                        }
                }
                for(i=0;i<30;i++)
                {
                        P0=0x39;
                        P2=0x7F;
                        delay(t);
                        P2=0xFF;
                        
                        P0=0x63;
                        P2=0xBF;
                        delay(t);
                        P2=0xFF;
                        
                        P0=Duan_Ma[Display[0]];
                        P2=0xDF;
                        delay(t);
                        P2=0xFF;
                        
                P0=(Duan_Ma[Display[1]])|0x80;
                        P2=0xEF;
                        delay(t);
                        P2=0xFF;
                        P0=Duan_Ma[Display[2]];
                        
                        P2=0xF7;
                        delay(t);
                        P2=0xFF;
                        
                        P0=Duan_Ma[Display[3]];
                        
                        P2=0xFB;
                        delay(t);
                        P2=0xFF;
                        
                        if(ng)
                        {
                                P0=0x40;
                                P2=np;
                                delay(t);
                                P2=0xFF;
                        }
                }
        }
        void Timer0_Init ()interrupt 1
        {
                TH0=(60536)/256;
                TL0=(60536)%256;
                beep=!beep;
                if(++Timer0_cout==400)
                {
                        Timer0_cout=0;
                        if(Alarm_H)
                        {
                                LED_H=~LED_H;
                        }
                        else
                        {
                                LED_H=1;
                        }
                        if(Alarm_L)
                        {
                                LED_L=~LED_L;
                        }
                        else
                        {
                                LED_L=1;
                        }
                }
        }
void main()
        {
                IE=0x82;
                TMOD=0x01;
                TH0=(60536)/256;
                TL0=(60536)%256;
                TR0=0;
                LED_H=1;
                LED_L=1;
                Set_Alare_Temp_V();
                Red_Temp_ture();
//                DS18B20_Init();
                delay(50000);
                delay(50000);
                while(1)
                {
                                Red_Temp_ture();
                                if(DS18B20_IS_OK)
                                {
                                        if(Alarm_H==1||Alarm_L==1)
                                        {
                                                TR0=1;
                                        }
                                        else
                                        {
                                                TR0=0;
                                        }
                                        Display_Temp();
                                }
                                else
                                {
                                        P0=P2=0x00;
                                }
                }
        }

回复

使用道具 举报

ID:328014 发表于 2021-1-8 18:47 | 显示全部楼层
有仿真吗?这样不好调试啊,看样子你是从12t芯片移植到1t的,,你需要注意一下延迟函数 加长时间
回复

使用道具 举报

ID:858978 发表于 2021-1-8 18:50 | 显示全部楼层
51hei团团 发表于 2021-1-8 18:47
有仿真吗?这样不好调试啊,看样子你是从12t芯片移植到1t的,,你需要注意一下延迟函数 加长时间

只要注意延时就可以了吗?
回复

使用道具 举报

ID:858978 发表于 2021-1-8 18:52 | 显示全部楼层
51hei团团 发表于 2021-1-8 18:47
有仿真吗?这样不好调试啊,看样子你是从12t芯片移植到1t的,,你需要注意一下延迟函数 加长时间

之前用51芯片仿真是没有问题的,但是用15F2K60S2之后就不行了
回复

使用道具 举报

ID:390416 发表于 2021-1-8 20:39 | 显示全部楼层
数字温度传感器DS18B20最好的资料:http://www.51hei.com/bbs/dpj-200465-1.html
后面这个是DS18B20代码贴子 http://www.51hei.com/bbs/dpj-200968-1.html
回复

使用道具 举报

ID:213173 发表于 2021-1-9 07:12 | 显示全部楼层
111gjk 发表于 2021-1-8 18:52
之前用51芯片仿真是没有问题的,但是用15F2K60S2之后就不行了

此51程序移植到STC15F2K60S2失败的主要有两个原因:
1.原来的延时函数要重新调整参数。由于具体函数体写法和采用数据类型不同,CPU处理用时也不同,无法给你一个固定的比例关系套用。可以参考STC官方示例。
2.由于1T单片机速度非常快,对端口写操作后要等待至少2个时钟达到稳定后才能读准,否则容易出错。1个 _nop_()  用时3个时钟。 无标题.jpg


回复

使用道具 举报

ID:328014 发表于 2021-1-9 17:30 | 显示全部楼层
51hei搜索"1t DS18B20"可以找到程序:
http://www.51hei.com/bbs/dpj-114378-1.html
他这个芯片的延迟和你这个一样的
回复

使用道具 举报

ID:146782 发表于 2022-6-3 23:14 | 显示全部楼层
主要问题在DS18B20的时序延时上。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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