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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3422|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

ds18b20溫度測(cè)量1602顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:195948 發(fā)表于 2017-5-3 12:00 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include<reg52.h>                                                //包含reg52.h庫(kù)文件
#include<math.h>                                                //包含絕對(duì)值函數(shù)
#define uint unsigned int                                //宏定義uint
#define uchar unsigned char                                //宏定義uchar
sbit lcden=P3^4;                                                //液晶使能端
sbit lcdrs=P3^5;                                                //液晶數(shù)據(jù)命令選擇端選擇寫數(shù)據(jù)還是寫命令
sbit DQ = P1^0;                         //通過(guò)DQ口讀取溫度值
//sbit s1=P3^0;                                                        //選擇按鍵
//sbit s2=P3^1;                                                        //加按鍵
//sbit s3=P3^2;                                                        //減按鍵
//sbit D1=P1^2;
//sbit D2=P1^3;
uchar temp_value,num,fig,s1num,figh,figl,t;  //設(shè)置全局無(wú)符號(hào)字符型變量
char h,l;                                                                //設(shè)置全局有符號(hào)字符型變量
void delay(uint z);                                                //申明延時(shí)程序
void init();                                                        //申明LCD初始化程序
void write_com(uchar com);                                //申明寫命令程序
void write_data(uchar date);                        //申明寫數(shù)據(jù)程序
//void keyscan();                                                    //申明按鍵掃描程序
//void write_hl(uchar add,char date);            //申明設(shè)置的最高低溫度值在LCD上顯示程序
void write_temp_value(uchar add,char date);        //申明溫度值在LCD上顯示程序
void delay_18B20(unsigned int i);                //申明延時(shí)程序
void Init_DS18B20(void);                                //申明DS18B20初始化程序
unsigned char ReadOneChar(void);                //申明ds18b20讀一個(gè)字節(jié)
void WriteOneChar(uchar dat);                        //申明ds18b20讀一個(gè)字節(jié)
void ReadTemp(void);                                        //申明讀取ds18b20當(dāng)前溫度
//void comp();
void main()
{        init();                                                                //LCD初始化
        Init_DS18B20();                                                //DS18B20初始化
        while(1)                                                        //大循環(huán)
        { //if(s1==0||s1num<=1)
                //{//        keyscan();                                        //按鍵掃描
        //        }
//        else{
                ReadTemp();                                        //讀取溫度值
                        write_temp_value(0,temp_value);        //LCD顯示溫度值
                }
        //        comp();               
//        }
}

void delay(uint z)                                                //延時(shí)程序
{
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}



void init()                                                //LCD初始化程序
{   lcden=0;
        write_com(0x38);                         //設(shè)置16x2 顯示5x7 點(diǎn)陣,8 位數(shù)據(jù)接口
        write_com(0x0c);                 //設(shè)置開始顯示不顯示光標(biāo)
        write_com(0x06);                         //寫一個(gè)字符后地址指針加1
        write_com(0x01);                         //顯示清零數(shù)據(jù)指針清零
        write_com(0x80+11);                         //將數(shù)據(jù)指針第一行第一個(gè)字處,
       
/*        write_com(0x80+9);                         //定義當(dāng)前指針位置
        write_data('H');                                 //寫入
        write_data(':');                                 //寫入
        write_data('+');                                 //寫入
        write_data('5');                                 //寫入
        write_data('0');                                 //寫入
        write_data(0xdf);                                 //寫入°
        write_data('C');                                 //寫入C
        write_com(0x80+9+0x40);                  //定義當(dāng)前指針位置
        write_data('L');                                 //寫入
        write_data(':');                                 //寫入
        write_data('-');                                 //寫入
        write_data('1');                                 //寫入
        write_data('0');                                 //寫入
        write_data(0xdf);                                 //寫入°
        write_data('C');                                 //寫入C  */
//        h=0x32;
//        l=0-0x0a;                                                 //h=45
//        D1=1;
//        D2=1;
//        figh=0;                                                         //給正確初始值,便于上電比較
//        figl=1;                                                         //給正確初始值,便于上電比較       
}
void write_com(uchar com)                //寫命令程序
{        lcdrs=0;                                         //設(shè)置為寫入命令
        P0=com;                                         //將命令賦給P0 口
        delay(5);                                         //延時(shí)
        lcden=1;                                         //打開LCD使能,輸入一個(gè)高脈沖
        delay(5);                                        //延時(shí)
        lcden=0;                                         //置低完成高脈沖
}
void write_data(uchar date)                //寫數(shù)據(jù)程序
{        lcdrs=1;                                         //設(shè)置為寫入數(shù)據(jù)
        P0=date;                                         //將數(shù)據(jù)賦給P0 口
        delay(5);                                         //延時(shí)
        lcden=1;                                         //打開LCD使能,輸入一個(gè)高脈沖
        delay(5);                                         //延時(shí)
        lcden=0;                                         //置低完成高脈沖
}

void write_temp_value(uchar add,char date)         //讀取的溫度值在LCD上顯示程序
{        uchar bai,shi,ge;
        bai=date/100;
        shi=date%100/10;                                 
        ge=date%10;                                                 //分離出百,十,個(gè)位數(shù)
        if((bai|shi)==0)                                 //如果百十都等于0
        shi=0x70;                                                 //十賦值0x70,以便十位寫入空字符,write_data(0x30+shi),參考1602字符圖形碼
        if(bai==0)
        bai=0x70;
        write_com(0x80+11+add);                     //設(shè)置當(dāng)前光標(biāo)位置,準(zhǔn)備寫數(shù)據(jù)
       
        if(fig==0&&shi!=0x70)                         //如果溫度為負(fù)且十位不等于0(如果十位等于0,shi=0x70)
        { write_data('-');                                 //在百位寫入負(fù)號(hào)
          write_data(0x30+shi);                        //寫入十位數(shù)據(jù)
        }
        if(fig==0&&shi==0x70)                         //如果溫度為負(fù)且百十位都等于0
        { write_data(0x30+0x70);                 //在百位寫入一個(gè)空字符
          write_data('-');                                 //在十位寫入負(fù)號(hào)
        }
        if(fig==1)write_data(0x30+bai);  //溫度正,寫入百位數(shù)據(jù)
        if(fig==1)write_data(0x30+shi);         //溫度正,寫入十位數(shù)據(jù)
        write_data(0x30+ge);                         //寫入個(gè)位數(shù)據(jù)
        write_data(0xdf);                                 //寫入°
        write_data('C');                                 //寫入C
       
}
/*void write_hl(uchar add,char date)         //設(shè)置的高低溫度值在LCD上顯示程序
{        uchar bai,shi,ge;
        bai=date/100;
        shi=date%100/10;                                 
        ge=date%10;                                                 //分離出百,十,個(gè)位數(shù)
        write_com(0x80+add);                     //設(shè)置當(dāng)前光標(biāo)位置,準(zhǔn)備寫數(shù)據(jù)
       
        if(t==1&&shi!=0)                             //如果溫度為負(fù)且十位不等于0(如果十位等于0,shi=0x70)            負(fù)數(shù):百位第1種情況,寫-
                { write_data('-');}                         //在百位寫入負(fù)號(hào)
        if(t==1&&shi==0)                             //如果溫度為負(fù)且百十位都等于0                                                    負(fù)數(shù):百位第2種情況,寫空
                { write_data(0x30+0x70);         //在百位寫入一個(gè)空字符
                    write_data('-');                         //在十位寫入負(fù)號(hào)                                                                            負(fù)數(shù):十位第1種情況,寫-
                }
        if(t==1&&shi!=0)                             //如果溫度為負(fù)且十不等于0                                                                負(fù)數(shù):十位第2種情況,寫數(shù)                                               
            {write_data(0x30+shi);}                 //在十位寫入數(shù)據(jù)
        if(t==0&&bai==0&&shi!=0)                 //否則溫度為正,如果bai=0且shi!=0                                                  正數(shù):百位第1種情況,寫+
                {write_data('+');}                         //在百位寫入+
        if(t==0&&bai==0&&shi==0)                 //否則溫度為正,如果bai=0且shi=0                                                           正數(shù):百位第2種情況,寫空
                {write_data(0x30+0x70);}         //在百位寫入一個(gè)空字符
        if(t==0&&bai!=0)       
                {write_data(0x30+bai);}      //否則百位為正不等于0,寫入百位數(shù)                                                           正數(shù):百位第3種情況,寫數(shù)
        if(t==0&&bai==0&&shi==0&&ge!=0)         //如果百十等于0,個(gè)不等于0                                                                           正數(shù):十位第1種情況,寫+
                {write_data('+');}                         //在十位寫入+
        if(t==0&&bai==0&&shi==0&&ge==0)         //如果百十個(gè)都等于0
            {write_data(' ');}                     //在十位寫入空字符                                                                                           正數(shù):十位第2種情況,寫空
        if(t==0&&shi!=0)       
                {write_data(0x30+shi);}             //在十位寫入數(shù)                                                                                                   正數(shù):十位第3種情況,寫數(shù)                    
        write_data(0x30+ge);                         //寫入個(gè)位數(shù)據(jù)
}        */

/***********ds18b20子程序*************************/

/***********ds18b20延遲子函數(shù)(晶振12MHz )*******/

void delay_18B20(unsigned int i)
{
        while(i--);
}

/**********ds18b20初始化函數(shù)**********************/

void Init_DS18B20(void)
{
         unsigned char x=0;
         DQ = 1;          //DQ復(fù)位
         delay_18B20(8);  //稍做延時(shí)
         DQ = 0;          //單片機(jī)將DQ拉低
         delay_18B20(80); //精確延時(shí) 大于 480us
         DQ = 1;          //拉高總線
         delay_18B20(14);
         x=DQ;            //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
         delay_18B20(20);
}

/***********ds18b20讀一個(gè)字節(jié)**************/  

unsigned char ReadOneChar(void)
{
        uchar i=0;
        uchar dat = 0;
        for (i=8;i>0;i--)
         {
                  DQ = 0; // 給脈沖信號(hào)
                  dat>>=1;
                  DQ = 1; // 給脈沖信號(hào)
                  if(DQ)
                  dat|=0x80;
                  delay_18B20(4);
         }
        return(dat);
}

/*************ds18b20寫一個(gè)字節(jié)****************/  

void WriteOneChar(uchar dat)
{
        unsigned char i=0;
        for (i=8; i>0; i--)
        {
                  DQ = 0;
                DQ = dat&0x01;
            delay_18B20(5);
                DQ = 1;
            dat>>=1;
}
}

/**************讀取ds18b20當(dāng)前溫度************/

void ReadTemp(void)
{
        unsigned char a=0;
        unsigned char b=0;
        unsigned char t=0;

        Init_DS18B20();
        WriteOneChar(0xCC);            // 跳過(guò)讀序號(hào)列號(hào)的操作
        WriteOneChar(0x44);         // 啟動(dòng)溫度轉(zhuǎn)換

        delay_18B20(100);       // this message is very important

        Init_DS18B20();
        WriteOneChar(0xCC);         //跳過(guò)讀序號(hào)列號(hào)的操作
        WriteOneChar(0xBE);         //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度

        delay_18B20(100);

        a=ReadOneChar();            //讀取溫度值低位
        b=ReadOneChar();                   //讀取溫度值高位
//        a=0xff;                                        //測(cè)試無(wú)法讀取-16度的問(wèn)題
//        b=0xfe;
        temp_value=b<<4;                  //temp_value=b左移動(dòng)4位  ,                         轉(zhuǎn)換成10進(jìn)制
        temp_value+=(a&0xf0)>>4;  //temp_value=temp_value+((a&0xf0)>>4) 轉(zhuǎn)換成10進(jìn)制
        fig=0x01;                                  //設(shè)置fig=1溫度正
        if(temp_value>0x7f)                  //如果temp_value大于0x7f,即為負(fù)數(shù)區(qū),參考DS18B20datasheet
        {fig=0;                                          //設(shè)置fig=0溫度負(fù),以便判斷顯示
         a=~a+1;                                  //將讀取的溫度轉(zhuǎn)換成10進(jìn)制數(shù)
         b=~b;
         temp_value=b<<4;                  //temp_value=b左移動(dòng)4位  ,                         轉(zhuǎn)換成10進(jìn)制
         temp_value+=(a&0xf0)>>4; //temp_value=temp_value+((a&0xf0)>>4) 轉(zhuǎn)換成10進(jìn)制
        }            
}

/*void keyscan()                                                 //按鍵掃描
{        if(s1==0)                                                 //如果s1按下,執(zhí)行下面程序
        {   delay(5);                                         //        延時(shí)一會(huì)
                if(s1==0)                                         //如果s1確實(shí)按下,執(zhí)行下面程序
                {        s1num++;                                 //s1num自加1
                        while(!s1);                                 //如果s1松開,執(zhí)行下面程序,否則一直停在這
                        if(s1num==1)                         //如果s1只按一次,執(zhí)行下面
                        {
                                write_com(0x80+13);       //設(shè)置當(dāng)前指針位置
                                write_com(0x0f);                  //寫入光標(biāo)閃爍命令
                        }
                        if(s1num==2)                                  //如果s1按2次,執(zhí)行下面
                        {
                                write_com(0x80+0x40+13);  //設(shè)置當(dāng)前指針位置,光標(biāo)閃
                        }
                        if(s1num==3)                                  //如果s1按3次,執(zhí)行下面
                        {        s1num=0;                                  //s1num清0
                                write_com(0x0c);              //寫入光標(biāo)不閃爍命令
                        }
                }
        }
       
        if(s2==0)                                                          //如果s2按下,執(zhí)行下面程序
        {        delay(5);                                                  //延時(shí)
                if(s2==0);                                                  //如果s2按下,執(zhí)行下面程序
                {               
                                while(!s2);                                  //如果s2松開,執(zhí)行下面程序,否則一直停在這
                                if(s1num==1)                          //如果光標(biāo)在h的位置閃爍,執(zhí)行下面程序
                                {        h++;                                  //h加1
                                        if(h==127)                            //=127清0
                                        h=0;                                  
                                        figh=0;                                  //設(shè)置figh=0,符號(hào)為正
                                        t=figh;                                  //賦值給t,以便液晶顯示
                                        if(h<=-1)                          //如果h為負(fù)數(shù)
                                        {figh=1;                          //設(shè)置figh=0
                                         t=figh;                          //賦值給t,以便液晶顯示
                                         h=abs(h);                          //h取絕對(duì)值
                                         write_hl(11,h);          //h寫入LCD
                                         h=0-h;                                  //把h變回原來(lái)的負(fù)數(shù)
                                        }
                                        else{write_hl(11,h);} //否則h寫入LCD
                                        write_com(0x80+13);          //光標(biāo)在溫度值位置閃爍
                                }
                                if(s1num==2)                          //如果光標(biāo)在l的位置閃爍,執(zhí)行下面程序
                                {        l++;                                  
                                        if(l==127)                            
                                        l=0;
                                        figl=0;
                                        t=figl;
                                        if(l<=-1)
                                        {figl=1;
                                         t=figl;
                                         l=abs(l);
                                         write_hl(0x40+11,l);          
                                         l=0-l;
                                        }
                                        else{write_hl(0x40+11,l);}          
                                        write_com(0x80+0x40+13);       
                                }
                }
        }
        if(s3==0)                                                          //如果s3按下,執(zhí)行下面程序
        {        delay(5);                                                  //延時(shí)
                if(s3==0);
                {
                                while(!s3);                                  //s3松開后,執(zhí)行下面程序
                                if(s1num==1)                          //如果光標(biāo)在h的位置閃爍,執(zhí)行下面程序
                                {        h--;                                  //h自減1
                                        if(h==-55)                          //如果h=-55清0
                                        h=0;
                                        figh=0;                                  //設(shè)置figh=0,溫度值為正
                                        t=figh;                                  //賦值給t,以便液晶顯示
                                        if(h<=-1)                          //如果h溫度值為負(fù)數(shù)
                                        {figh=1;                          //設(shè)置figh=1
                                         t=figh;                          //賦值給t,以便液晶顯示
                                         h=abs(h);                          //h取絕對(duì)值
                                         write_hl(11,h);          //h寫入LCD
                                         h=0-h;                                  //把h變回原來(lái)的負(fù)數(shù)
                                        }
                                        else{write_hl(11,h);} //否則h寫入LCD          
                                        write_com(0x80+13);          //光標(biāo)在溫度值位置閃爍
                                }                 
                                if(s1num==2)
                                {        l--;
                                        if(l==-55)
                                        h=0;
                                        figl=0;
                                        t=figl;
                                        if(l<=-1)
                                        {figl=1;
                                         t=figl;
                                         l=abs(l);
                                         write_hl(0x40+11,l);          
                                         l=0-l;
                                        }
                                        else{write_hl(0x40+11,l);}          
                                        write_com(0x80+0x40+13);
                                }
                }
        }               
}       
void comp()                                                                //溫度值報(bào)警程序
{if(fig==1&&temp_value>=h)                                //如果讀取溫度值為正
D1=0;
if(fig==1&&temp_value<=h)                                //如果讀取溫度值為正
D1=1;
         if(fig==0)                                                        //如果讀取溫度值為負(fù)
         {  if(figh==0)                                                //如果設(shè)置最高值溫度值為正
                 D1=1;  
                 if(figh==1)                                                //如果設(shè)置最高值溫度值為負(fù)
                  {h=abs(h);
                   if(temp_value<=h)
                   D1=0;
                   if(temp_value>=h)
                   D1=1;
                   h=-h;         
                  }
         }
if(fig==1&&temp_value<=l)
D2=0;
if(fig==1&&temp_value>=l)
D2=1;            
if(fig==0)
                {         if(figl==0)
                         D2=0;
                         if(figl==1)
                         {l=abs(l);
                          if(temp_value>=l)
                          D2=0;
                          if(temp_value<=l)
                          D2=1;
                          l=-l;
                         }
                }               
}*/                    

DS18B20_V1.3.rar

67.94 KB, 下載次數(shù): 28, 下載積分: 黑幣 -5

ds18b02 1602

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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美视频免费在线 | 国产精品一级 | a级毛片免费高清视频 | 亚洲品质自拍视频 | 看av在线 | 亚洲精品久久久一区二区三区 | 成人久久久 | 国产精彩视频 | 亚洲日韩中文字幕一区 | 亚洲精品在线播放 | 亚洲精品综合 | 国产精品欧美一区二区三区不卡 | 色av一区二区三区 | 国产精品一区一区 | 精品国产一级片 | 国产精品毛片一区二区在线看 | 操久久久 | 男女视频免费 | 奇米久久久 | 成人国产精品久久久 | 亚洲第一福利网 | 国产精品99久久久久久大便 | 亚洲福利一区二区 | 婷婷成人在线 | 91在线精品秘密一区二区 | 久久久性| 天天干狠狠操 | 欧美8一10sex性hd | 玖玖视频国产 | 91最新入口 | 天堂一区二区三区 | 99久久久无码国产精品 | www亚洲一区 | 免费艹逼视频 | 国产福利网站 | www.黄色在线观看 | 日韩在线观看中文字幕 | 天堂久久天堂综合色 | 国产偷录视频叫床高潮对白 | 国产在线小视频 | 一区二区三区亚洲 |