亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機分布式溫度測量系統設計,為什么我運行出來就顯示127°怎么改都沒辦法

[復制鏈接]
跳轉到指定樓層
樓主
100黑幣


分布式溫度測量系統設計,為什么我運行出來就顯示127°怎么改都沒辦法
U5主機代碼
#include <reg52.h>
#include <stdio.h>

typedef unsigned char u8;
typedef unsigned int u16;


#define LCD_DATA_PORT P1


sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit LCD_EN = P2^7;


sbit LED_HIGH = P2^0;
sbit LED_LOW  = P2^1;

char Disp_Temp = 0;     
char Temp_String[16];   


void delay_ms(u16 ms) {
    u16 i, j;
    for(i=0; i<ms; i++)
        for(j=0; j<110; j++);
}


void LCD_WriteCmd(u8 cmd) {
    LCD_RS = 0; LCD_RW = 0; LCD_EN = 0;
    LCD_DATA_PORT = cmd;
    delay_ms(1);
    LCD_EN = 1; delay_ms(1); LCD_EN = 0;
}

void LCD_WriteData(u8 dat) {
    LCD_RS = 1; LCD_RW = 0; LCD_EN = 0;
    LCD_DATA_PORT = dat;
    delay_ms(1);
    LCD_EN = 1; delay_ms(1); LCD_EN = 0;
}

void LCD_Init() {
    delay_ms(15);
    LCD_WriteCmd(0x38);
    LCD_WriteCmd(0x0C);
    LCD_WriteCmd(0x06);
    LCD_WriteCmd(0x01);
    delay_ms(5);
}

void LCD_ShowString(u8 x, u8 y, char *str) {
    u8 addr;
    if (y == 0) addr = 0x80 + x;
    else addr = 0xC0 + x;      
    LCD_WriteCmd(addr);
    while (*str) {
        LCD_WriteData(*str++);
    }
}


void Check_Alarm(char t) {

    if (t > 70) {
        LED_HIGH = 0;
    } else {
        LED_HIGH = 1;
    }


    if (t < -20) {
        LED_LOW = 0;
    } else {
        LED_LOW = 1;
    }
}


void UART_Init() {
    TMOD = 0x20;
    TH1 = 0xFD;
    TL1 = 0xFD;
    TR1 = 1; REN = 1; SM0 = 0; SM1 = 1; EA = 1; ES = 1;
}

void main() {
    u16 count = 0;


    LED_HIGH = 1;
    LED_LOW = 1;

    UART_Init();
    LCD_Init();

    LCD_ShowString(0, 0, "System Init...");
    delay_ms(500);
    LCD_WriteCmd(0x01);

    while(1) {

        sprintf(Temp_String, "Temp: %d C    ", (int)Disp_Temp);
        LCD_ShowString(0, 0, Temp_String);


        if(Disp_Temp > 70)
            LCD_ShowString(0, 1, "Warning: HIGH! ");
        else if(Disp_Temp < -20)
            LCD_ShowString(0, 1, "Warning: LOW!  ");
        else
            LCD_ShowString(0, 1, "Status: Normal ");

        Check_Alarm(Disp_Temp);


        count++;
        if(count > 100) {
            count = 0;
            SBUF = 0x01;
            while(!TI); TI = 0;
        }
        delay_ms(10);
    }
}

void UART_Routine() interrupt 4 {
    if(RI) {
        Disp_Temp = SBUF;
        RI = 0;
    }
}
U6從機代碼
#include <reg52.h>
#include <intrins.h>

typedef unsigned char u8;
typedef unsigned int u16;

sbit DQ = P2^0;

char temp_val = 0;


void delay_us(u16 us) {
    while(us--) {
        _nop_();
        _nop_();
    }
}


bit DS18B20_Init() {
    bit ack;
    DQ = 1;
    _nop_();
    DQ = 0;
    delay_us(250);
    DQ = 1;
    delay_us(30);  

    ack = DQ;      

    delay_us(200);
    return ack;
}

void DS18B20_WriteByte(u8 dat) {
    u8 i;
    for(i=0; i<8; i++) {
        DQ = 0;
        _nop_();
        DQ = dat & 0x01;
        delay_us(30);
        DQ = 1;
        dat >>= 1;
        _nop_();
    }
}

u8 DS18B20_ReadByte() {
    u8 i, dat = 0;
    for(i=0; i<8; i++) {
        dat >>= 1;
        DQ = 0;
        _nop_();
        DQ = 1;  


        _nop_(); _nop_(); _nop_();

        if(DQ) dat |= 0x80;

        delay_us(30);
    }
    return dat;
}

char Get_Temperature() {
    u8 L, H;


    if(DS18B20_Init() == 1) return 0;

    DS18B20_WriteByte(0xCC);
    DS18B20_WriteByte(0x44);


    DS18B20_Init();
    DS18B20_WriteByte(0xCC);
    DS18B20_WriteByte(0xBE);

    L = DS18B20_ReadByte();
    H = DS18B20_ReadByte();

    return (H << 4) | (L >> 4);
}

void UART_Init() {
    TMOD = 0x20; TH1 = 0xFD; TL1 = 0xFD; TR1 = 1; REN = 1; SM0 = 0; SM1 = 1; EA = 1; ES = 1;
}

void main() {
    UART_Init();
    while(1) {
        temp_val = Get_Temperature();

        {

            volatile u16 x = 30000;
            while(x--);
        }
    }
}

void UART_Routine() interrupt 4 {
    if(RI) {
        if(SBUF == 0x01) { SBUF = temp_val; while(!TI); TI = 0; }
        RI = 0;
    }
}

51hei_1767528881789.png (155.76 KB, 下載次數: 0)

結果圖

結果圖

最佳答案

查看完整內容

在沒有充分經驗的前提下不要試圖直接設計復雜的應用。可以先設計單個DS18B20的測溫LCD1602顯示系統。調試成功后再擴展為多個DS18B20分布式溫度測量系統,既可以采用單總線分布式方式也可以采用各自獨立的分布方式。在此基礎上調通后再拆分為主從機。無非就是將本系統顯示緩存中的數據通過串口在另一個系統中顯示。只要按上述步驟逐一調通,其實沒有什么難度。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1133081 發表于 2026-1-4 20:15 | 只看該作者
在沒有充分經驗的前提下不要試圖直接設計復雜的應用。可以先設計單個DS18B20的測溫LCD1602顯示系統。調試成功后再擴展為多個DS18B20分布式溫度測量系統,既可以采用單總線分布式方式也可以采用各自獨立的分布方式。在此基礎上調通后再拆分為主從機。無非就是將本系統顯示緩存中的數據通過串口在另一個系統中顯示。只要按上述步驟逐一調通,其實沒有什么難度。
回復

使用道具 舉報

板凳
ID:1166010 發表于 2026-1-5 05:20 | 只看該作者
不用回復自己已解決
回復

使用道具 舉報

地板
ID:384109 發表于 2026-1-5 09:46 | 只看該作者
用示波器看時序,DS18B20對時序要求比較嚴
回復

使用道具 舉報

5#
ID:320306 發表于 2026-1-5 11:23 | 只看該作者
我之前遇到過相同的代碼 ,一個仿真可以,一個仿真不可以。最后通過把4.7K換成10K那個不可以的好了,但是相同的仿真文件,寧一個4.7K確可以。有時候和版本什么也有關系。
回復

使用道具 舉報

6#
ID:584814 發表于 2026-1-5 12:22 | 只看該作者
本壇內有相關成功的例子甚至包括仿真;
可先做一個探頭的再逐步加多;
建議直接上全部包含仿真的工程文件,這玩意實在沒啥保密的。
回復

使用道具 舉報

7#
ID:1128898 發表于 2026-1-6 09:07 | 只看該作者
累加計數
回復

使用道具 舉報

8#
ID:123289 發表于 2026-1-7 09:01 | 只看該作者
沒有時間看你的程序了,
提示一下:每一秒顯示一次溫度,試試。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表