找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 334|回复: 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 单片机教程网

快速回复 返回顶部 返回列表