用12864液晶显示屏实时显示DS18b20温度,数码管总是乱码怎么破?

2019-03-24 17:24发布

用12864液晶显示屏实时显示DS18b20温度,12864的确可以显示实时温度了,但是不知道为什么,数码管始终在乱码,求大神指点怎样解决这问题。下面是 打的代码。
#include<reg52.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2;
sbit beep=P2^3;
sbit en=P3^4;
sbit rs=P3^5;
sbit rw=P3^6;
sbit psb=P3^7;
uint temp;//定义整型变量temp用来储存温度数据
float f_temp;//定义浮点型变量ftemp用来储存温度数据
uint warnl=270;//定义温度下限值为27度
uint warnh=290;//定义温度上限值为29度

uchar code table[]="0123456789.d";

uchar dis1[3];
uchar code dis2[]={"laexl"};
uchar code dis3[]={"1503020127"};
uchar code dis4[]={"电信15-1班"};



void delay (uint x)
{
        uint i,j;
        for(j=0;j<x;j++)
                for(i=0;i<110;i++);
}


//DS18B20复位,初始化函数
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);
}



//向DS18B20写一个字节函数
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++;i++;
                        ds=1;
                        i=8;while(i>0)i--;
                }
                else
                {
                        ds=0;
                        i=8;while(i>0)i--;
                        ds=1;
                        i++;i++;
                }
        }
}


//DS18B20获取温度并转换
void tempchange(void)
{
        dsreset();
        delay(1);
        tempwritebyte(0xcc);
        tempwritebyte(0x44);
       
}

//读取寄存器中存储的温度数据
uint get()
{
        uchar a,b;
        dsreset();
        delay(1);
        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;
        return temp;

}


//写指令数据到LCD
void write_cmd(uchar cmd)
{
        rs=0;
        rw=0;
        en=0;
        P0=cmd;
        delay(5);
        en=1;
        delay(5);
        en=0;
}


//写显示数据到LCD
void write_dat(uchar dat)
{
        rs=1;
        rw=0;
        en=0;
        P0=dat;
        delay(5);
        en=1;
        delay(5);
        en=0;
}


//LCD初始化设定
void initinal()
{
        psb=1;
        write_cmd(0x30);
        delay(5);
        write_cmd(0x0c);
        delay(5);
        write_cmd(0x01);
        delay(5);
}

void delay50us(uint t)
{
        uchar j;
        for (t=50;t>0;t--)
                for(j=19;j>0;j--);
}

void main()
{
        initinal();
        while(1)
        {
                uint a,b,c,d;
                tempchange();
                a=get();
                b=a/100;
                c=a%100/10;
                d=a%100%10;
                write_cmd(0x83);
                write_dat(table[b]);
                delay50us(1);
                write_dat(table[c]);
                delay50us(1);
                write_dat(table[10]);
                delay50us(1);
                write_dat(table[d]);
                delay50us(1);
                write_dat(table[11]);
                delay50us(4);
                write_cmd(0x83);
        }
}


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
雨后的梧桐
1楼-- · 2019-03-24 23:43
 精彩回答 2  元偷偷看……
single
2楼-- · 2019-03-25 00:42
这个要查 图纸,看看那些IO和数码管相关
人民币的幻想
3楼-- · 2019-03-25 02:09
板子硬件决定的,软件控制液晶之前,关闭所有数码管位选
wajuka
4楼-- · 2019-03-25 07:59
 精彩回答 2  元偷偷看……
kk118a
5楼-- · 2019-03-25 12:31
你就没有控制数码管的
gh131413
6楼-- · 2019-03-25 15:00
数码管乱码,无非就是你的计算显示值超出了范围,比如前面定义数码管显示0~9,而你计算的单个数码管显示的值超出了范围比如15就会出现乱码这种情况

一周热门 更多>