用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);
}
}
此帖出自
小平头技术问答
请问怎样能在这个程序的基础上实现对数码管的控制,让数码管关闭或者可控显示,正常对数码管声明,写代码就行吗?
得看硬件
一周热门 更多>