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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2004|回復: 2
收起左側

怎么樣將使用獨立鍵盤前三個按鍵去調整 ds18b20的TH,TL,并且使用LCD1602 去顯示...

[復制鏈接]
ID:742007 發表于 2020-4-30 21:42 | 顯示全部樓層 |閱讀模式
怎么樣用代   使用獨立鍵盤前三個按鍵去調整
ds18b20的TH,TL,并且使用LCD1602
去顯示每次按鍵的變化
以下代碼只實現了測出溫度
代碼:#include <reg52.H>#include <intrins.H>
#include <math.H>

#define uchar unsigned char
#define uint unsigned int
sbit dula = P2^6;
sbit wela = P2^7;
sbit rw = P3^6;
sbit RS = P3^5;  
sbit LCDEN = P3^4;

void delayUs()           //us級延時
{
    _nop_();  //匯編語句  空語句,用來產生短暫的延時效果,
                            //對于延時很短的,要求在us級的,采用“_nop_”函數,對于12M晶振,延時1uS。
}

void delayMs(uint a)  //ms級延時
{
    uint i, j;
    for(i = a; i > 0; i--)
        for(j = 100; j > 0; j--);
}


void writeComm(uchar comm)         //寫LCD1602指令
{
     RS = 0;   
    P0 = comm;
    LCDEN = 1;
     delayUs();
    LCDEN = 0;
    delayMs(1);
}

//寫數據:RS=1, RW=0;   可以選擇想要寫入的數據
void writeData(uchar dat)        //從 writeString()函數中逐一寫入數據
{
     RS = 1;
     P0 = dat;
     LCDEN = 1;           //讀取數據并寫入1602內
    delayUs();
    LCDEN = 0;          //釋放總線
    delayMs(1);
}


void init()           //初始化函數
{
     rw = 0;
     dula = wela = 0;
    writeComm(0x38); //        顯示模式設置指令碼00111000           16*2顯示
   writeComm(0x0c);  //顯示開/關及光標設置          00001DCB  D=1 開顯示   C=1顯示光標  B=1光標閃爍
    writeComm(0x06); //顯示指針指向000001NS         N=1 當讀或寫一個字符后地址指針加一,且光標加一
    writeComm(0x01); //顯示清屏:1.數據指針清零,2.所有顯示清零
}

void writeString(uchar * str, uchar length)         //寫入字符串
{
     uchar i;
    for(i = 0; i < length; i++)
    {
         writeData(str[i]);
     }
}

/**//*****************************DS18B20*******************************/
sbit ds = P2^2;
void dsInit()        //單總線初始化時序
{

    unsigned int i;  
    ds = 0;
    i = 100;  
     while(i>0) i--;   //猜測是為了使傳感器復位,即拉低單總線480us以上
    ds = 1;                      //釋放總線
    i = 4;                          
     while(i>0) i--;   //拉低總線15-60us,即可讀取18B20的存在信號
}

void dsWait()
{
      unsigned int i;
      while(ds);  
      while(~ds);
      i = 4;
      while(i > 0) i--;
}


bit readBit() //采樣總線上的數據
{
    unsigned int i;
    bit b;
    ds = 0;
    i++;   
    ds = 1;
   i++; i++;  
    b = ds;
    i = 8;
    while(i>0) i--;
    return b;
}

unsigned char readByte() //讀時序  讀字節每次一位
{
    unsigned int i;
    unsigned char j, dat;
   dat = 0;
    for(i=0; i<8; i++)
    {
        j = readBit();

        dat = (j << 7) | (dat >> 1);//把字節每次移動一位,直到移動8次,數據寫入dat中
    }
    return dat;
}


void writeByte(unsigned char dat)  //寫時序
{
    unsigned int i;
    unsigned char j;
    bit b;
    for(j = 0; j < 8; j++)        //每次寫入一個字節,寫入8次
    {
        b = dat & 0x01;
        dat >>= 1;

        if(b)   
        {
           ds = 0;          i++; i++;  
            ds = 1;   
            i = 8; while(i>0) i--;  
        }
        else  
        {
            ds = 0;
          i = 8; while(i>0) i--;  
            ds = 1;
           i++; i++;
        }
   }
}


void sendChangeCmd() //溫度轉換指令
{
    dsInit();   
    dsWait();   
    delayMs(1);   
    writeByte(0xcc);
    writeByte(0x44); //發送溫度轉換指令
/*        設置EEPROM中的TH  TL   及精度程序
        writeByte(0x4e); //發送寫暫存器指令
        writeByte(0x依據需要); //設置TH指令
        writeByte(0x依據需要); //設置TL指令
        writeByte(0x依據需要); //配置工作在哪一位的模式下  如0 R1 R2 1 1 1 1 1 R1=R2=0 為9位精度
        writeByte(0x48); //把高速暫存器的值拷貝到EEPROM中
        PS:每次使用時都需要初始化
        dsInit();   
    dsWait();
        writeByte(0xcc); //發送跳躍ROM指令        
        */
}

void sendReadCmd()
{
    dsInit();
    dsWait();
    delayMs(1);
    writeByte(0xcc); //發送跳躍ROM指令
    writeByte(0xbe); //讀取高速暫存器中的內容
}


int getTmpValue()
{
    unsigned int tmpvalue;
    int value;
    float t;
    unsigned char low, high;
    sendReadCmd();

    low = readByte();  //讀取高速暫存器中的第一個字節 ,即LSB
    high = readByte(); //讀取高速暫存器中的第2個字節 ,即MSB

    tmpvalue = high;  //將高字節的溫度數據換算成十進制
    tmpvalue <<= 8;
    tmpvalue |= low;
    value = tmpvalue;

  \
    t = value * 0.0625;//換算成實際溫度
    \
    value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0減0.5   四舍五入
    return value;
}

void display(int v) //顯示函數
{
    unsigned char count;
    unsigned char datas[] = {0, 0, 0, 0, 0};
    unsigned int tmp = abs(v);
    datas[0] = tmp / 10000;
    datas[1] = tmp % 10000 / 1000;
    datas[2] = tmp % 1000 / 100;
    datas[3] = tmp % 100 / 10;
    datas[4] = tmp % 10;
    writeComm(0xc0+3);
    if(v < 0)
    {
        writeString("- ", 2);
   }
    else
    {
       writeString("+ ", 2);
    }
    if(datas[0] != 0)
    {
        writeData('0'+datas[0]);
    }
    for(count = 1; count != 5; count++)
    {
        writeData('0'+datas[count]);
        if(count == 2)
        {
            writeData('.');
        }
    }
}
/**//*****************************DS18B20*******************************/

void main()
{
    uchar table[] = "  xianzaiwendu: ";
    sendChangeCmd();
    init();
    writeComm(0x80);
    writeString(table, 16);
    while(1)
    {
        delayMs(1000); //溫度轉換時間需要750ms以上
        writeComm(0xc0);//第二行地址 顯示溫度
        display(getTmpValue());
        sendChangeCmd(); //再次初始化DS總線
    }
}


無標題.png
回復

使用道具 舉報

ID:452950 發表于 2020-5-1 09:59 | 顯示全部樓層
TH、TL是溫度報警的上下限嗎,設置兩個變量,一個·按鍵選擇調節上限或下限、一個按鍵加、一個按鍵減就好了。
回復

使用道具 舉報

ID:282850 發表于 2020-5-1 13:52 | 顯示全部樓層
設三個按鍵,+ -  S,S時可以選TH、TL,并閃爍,+時選中++,-時選中--,最后按S時保存。OK。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美理伦片在线播放 | www.jizzjizz| 国产欧美一区二区精品久导航 | 久久久久久av | 欧美极品在线视频 | 涩在线 | 日本一区二区高清不卡 | 黄色大片在线播放 | 日韩在线小视频 | 久热精品视频 | 精品欧美一区二区精品久久久 | 久久9视频| 亚洲一区精品在线 | 亚洲成人中文字幕 | 男人天堂网av | 国产欧美一区二区三区在线看 | 久久亚洲一区二区 | 亚洲自拍偷拍视频 | 亚洲精品乱码久久久久久黑人 | 亚洲福利在线视频 | 日本视频一区二区 | 一区二区三区在线免费观看视频 | 久久九精品 | 中国美女av | 午夜精品91 | 国产精品大片在线观看 | a久久 | 国产精品日韩一区 | 国产精品网页 | 精品国产一区久久 | 国产福利一区二区 | 一区二区福利视频 | 一区二区三区在线播放视频 | 视频一区在线观看 | 中文字幕三区 | 久久男人天堂 | 精品乱人伦一区二区三区 | 国产激情小视频 | 国产精品美女一区二区 | 韩日精品在线观看 | 涩涩片影院 |