迟睁 2024-03-16 19:34 采纳率: 0%
浏览 9
已结题

51单片机采集温湿度数据

#51单片机采集温湿度
刚开始学单片机,简单了解了一下数码管及串口通信,想要采集温湿度数据
无法正确采集数据,如下

img


请各位帮忙看看代码问题出在哪里


#include<reg52.h>
#include<stdio.h>
#define uchar unsigned char 
#define uint unsigned int
sbit ds=P2^2;
uint temp;
float f_temp;
void delay(uint s)
{
   uint i,j;
   for(i=s;i>0;i--)
   for(j=110;j>0;j--);
}

void dsreset(void)
{
    uint i;
    ds=0;
    i=103;
    while(i>0)
    i--;
    ds=1;
    i=4;
    while(i>0)
    i--;
}

bit tempreadbit(void)
{
    uint i;
    bit dat;
    ds=0;
    i++;
    ds=1;
    i++;
    i++;
    dat=ds;
    i=8;
    while(i>0)
    i--;
    return(dat);
}

uchar tempread(void)
{
    uchar i,j,dat;
    dat = 0;
    for(i=1;i<=8;i++)
    {
        j=tempreadbit();
        dat=(j<<7)|(dat>>1);
    }
    return(dat);
}

void tempwritebyte(uchar dat)
{
    uint i;
    uchar j;
    bit testb;
    for(j=1;j<=8;j++)
    {
        testb=dat&0x01;
        dat=dat>>1;
        if(testb)
        {
            ds=0;
            i++;
            ds=1;
            i=8;
            while(i>0)
            i--;
        }
        else
        {
            ds=0;
            i=8;
            while(i>0)
            i--;
            ds=1;
            i++;
            i++;
        }
    }
}

void tempchange(void)
{
    dsreset();
    delay(1);
    tempwritebyte(0xcc);
    tempwritebyte(0x44);
}

uint get_temp()
{
    uchar a,b;
    tempchange();
    dsreset();
    tempwritebyte(0xcc);
    tempwritebyte(0xbe);
    a=tempread();
    b=tempread();
    temp=b;
    temp<<=8;
    temp=temp|a;
    f_temp=temp*0.0625;
    temp=f_temp*10+0.5;
    f_temp=f_temp+0.05;
}

void init_com(void)
{
    TMOD=0x20;
    PCON=0x00;
    SCON=0x50;
    TH1=0xfd;
    TL1=0xfd;
    TR1=1;
}

void comm(char *parr)
{
    do
    {
        SBUF=*parr++;
        while(!TI);
        TI=0;
    }
    while(*parr);
}

void main()
{
    uchar buff[4];
    init_com();
    while(1)
    {
    get_temp();
    sprintf(buff,"%f",f_temp);
    delay(100);
    comm(buff);
    }
}

谢谢各位帮助!

  • 写回答

5条回答 默认 最新

  • 码农阿豪 Java领域优质创作者 2024-03-16 19:34
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题分析:
    1. 硬件问题:需要确认温湿度传感器是否已经正确连接到单片机引脚上,以及是否有电源供给。
    2. 代码问题: a. 声明变量时需要正确初始化,例如uchar i,j,dat;,dat应该初始化为0。 b. 在传感器通信时,需要使用一定的时间间隔,并根据实际情况调整,例如dsreset()函数中的delay(1)函数。 c. 在tempread()函数中,数据读取时需要先读取低位,再读取高位,应该将for循环中的dat>>1改为dat<<1。 d. 在get_temp()函数中,计算温度值的时候应该是将读取到的数据右移3位再乘以0.0625,而当前代码中是左移8位。 e. 在将温度值转换成数码管可以显示的字符串时,需要保留小数点后一位,并四舍五入,例如sprintf(buff,"%0.1f", f_temp);。 代码修改:
    #include <reg52.h>
    #include <stdio.h>
    #define uchar unsigned char
    #define uint unsigned int
    sbit ds=P2^2;
    uint temp;
    float f_temp;
    void delay(uint s){
        uint i,j;
        for(i=s;i>0;i--)
            for(j=110;j>0;j--);
    }
    void dsreset(void){
        uint i;
        ds=0;
        i++;
        ds=1;
        i++;
        i++;
        ds=0;
        delay(1);
        ds=1;
        i=4;
        while(i>0)
            i--;
    }
    bit tempreadbit(void){
        uint i;
        bit dat;
        ds=0;
        i++;
        ds=1;
        i++;
        i++;
        dat=ds;
        i=8;
        while(i>0)
            i--;
        return(dat);
    }
    uchar tempread(void){
        uchar i,j,dat;
        dat = 0;
        for(i=1;i<=8;i++)
        {
            j=tempreadbit();
            dat=(j<<7)|(dat>>1);
        }
        return(dat);
    }
    void tempwritebyte(uchar dat){
        uint i;
        uchar j;
        bit testb;
        for(j=1;j<=8;j++)
        {
            testb=dat&0x01;
            dat=dat>>1;
            if(testb)
            {
                ds=0;
                delay(1);
                ds=1;
                i=8;
                while(i>0)
                    i--;
            }
            else
            {
                ds=0;
                i=8;
                while(i>0)
                    i--;
                ds=1;
                i++;
                i++;
            }
        }
    }
    void tempchange(void){
        dsreset();
        tempwritebyte(0xcc);
        tempwritebyte(0x44);
    }
    uint get_temp(){
        uchar a,b;
        tempchange();
        dsreset();
        tempwritebyte(0xcc);
        tempwritebyte(0xbe);
        a=tempread();
        b=tempread();
        temp=b;
        temp=temp>>3;
        temp=temp*0.0625*10+0.5;
        f_temp=temp/10.0;
        return temp;
    }
    void init_com(void){
        TMOD=0x20;
        PCON=0x00;
        SCON=0x50;
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
    }
    void comm(char *parr){
        do
        {
            SBUF=*parr++;
            while(!TI);
            TI=0;
        }
        while(*parr);
    }
    void main(){
        uchar buff[5];
        init_com();
        while(1)
        {
            get_temp();
            sprintf(buff,"%0.1f",f_temp);
            delay(100);
            comm(buff);
        }
    }
    

    参考资料:https://blog.csdn.net/a774854207/article/details/81160884

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月18日
  • 创建了问题 3月16日

悬赏问题

  • ¥15 Fatal error in Process MEMORY
  • ¥15 labelme生成的json有乱码?
  • ¥30 arduino vector defined in discarded section `.text' of wiring.c.o (symbol from plugin)
  • ¥20 如何训练大模型在复杂因素组成的系统中求得最优解
  • ¥15 关于#r语言#的问题:在进行倾向性评分匹配时,使用“match it"包提示”错误于eval(family$initialize): y值必需满足0 <= y <= 1“请问在进行PSM时
  • ¥45 求17位带符号原码乘法器verilog代码
  • ¥20 PySide6扩展QLable实现Word一样的图片裁剪框
  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统