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

STC15F2K60S2+DS18B20怎么一直都是显示-0.1°,求大佬帮忙,单片机代码如下, 本帖最后由 111gjk 于 2021-1-8 18:48 编辑 #include…

STC15F2K60S2+DS18B20怎么一直都是显示-0.1°,求大佬帮忙,单片机代码如下, 本帖最后由 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;
                                }
                }
        }

,有仿真吗?这样不好调试啊,看样子你是从12t芯片移植到1t的,,你需要注意一下延迟函数 加长时间,

51hei团团 发表于 2021-1-8 18:47

有仿真吗?这样不好调试啊,看样子你是从12t芯片移植到1t的,,你需要注意一下延迟函数 加长时间

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

51hei团团 发表于 2021-1-8 18:47

有仿真吗?这样不好调试啊,看样子你是从12t芯片移植到1t的,,你需要注意一下延迟函数 加长时间

之前用51芯片仿真是没有问题的,但是用15F2K60S2之后就不行了
,数字温度传感器DS18B20最好的资料:http://www.073107.com/bbs/dpj-200465-1.html
后面这个是DS18B20代码贴子 http://www.073107.com/bbs/dpj-200968-1.html,

111gjk 发表于 2021-1-8 18:52

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

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

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

,51hei搜索”1t DS18B20″可以找到程序:
http://www.073107.com/bbs/dpj-114378-1.html
他这个芯片的延迟和你这个一样的

作者: soufei

为您推荐


Fatal error: Can't use function return value in write context in /www/wwwroot/www.qianrushi.com.cn/wp-content/themes/news/footer.php on line 115