久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2748|回復: 7
打印 上一主題 下一主題
收起左側

STC15F2K60S2+DS18B20怎么一直都是顯示-0.1°,求大佬幫忙,單片機代碼如下

[復制鏈接]
回帖獎勵 1 黑幣 回復本帖可獲得 1 黑幣獎勵! 每人限 5 次
跳轉到指定樓層
樓主
本帖最后由 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;
                                }
                }
        }

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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之后就不行了
回復

使用道具 舉報

5#
ID:390416 發表于 2021-1-8 20:39 | 只看該作者
數字溫度傳感器DS18B20最好的資料:http://www.zg4o1577.cn/bbs/dpj-200465-1.html
后面這個是DS18B20代碼貼子 http://www.zg4o1577.cn/bbs/dpj-200968-1.html
回復

使用道具 舉報

6#
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個時鐘。


回復

使用道具 舉報

7#
ID:328014 發表于 2021-1-9 17:30 | 只看該作者
51hei搜索"1t DS18B20"可以找到程序:
http://www.zg4o1577.cn/bbs/dpj-114378-1.html
他這個芯片的延遲和你這個一樣的
回復

使用道具 舉報

8#
ID:146782 發表于 2022-6-3 23:14 | 只看該作者
主要問題在DS18B20的時序延時上。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费在线h视频 | 日韩精品一区二区三区在线播放 | 美国av片在线观看 | 欧美久久国产 | 亚洲国产一区二区三区 | 日韩影院在线观看 | 殴美黄色录像 | 最新中文字幕一区 | 97伦理| 亚洲成人毛片 | 国产国语精品 | 中文字幕欧美一区 | 国产91精品在线 | 免费一级欧美在线观看视频 | 成人性视频免费网站 | 欧美精品首页 | dy天堂 | 在线资源视频 | 国产视频久久久 | 草在线 | 婷婷色国产偷v国产偷v小说 | 久久久久国产一级毛片 | 欧美 日韩 综合 | 成人久久网 | 成人黄色在线 | 在线观看黄色电影 | 蜜桃av鲁一鲁一鲁一鲁 | 欧美日韩国产三级 | 国产精品视频一区二区三区不卡 | 99热这里都是精品 | 亚洲精品视频在线 | 日韩欧美国产一区二区 | 一区二区免费 | 午夜一区二区三区视频 | 91视频在线看 | 日韩一区不卡 | 国产激情偷乱视频一区二区三区 | 99在线视频观看 | 欧美成人精品一区二区男人看 | 精品综合网 | 欧美精品一区二区三区一线天视频 |