用郭天祥的TX-1C板子功能可以实现,效果如图一;但同样的程序,照着板子一样的接法在proteus与搭的面包板上效果都出不来如图二图三;附程序;哪位热心帮我的大神指点我一下谢谢大家
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P3^5;//1602数据/命令选择
sbit E=P3^4;//1602使能
sbit DQ=P2^2;//18b20信号
uint temp;
uchar wdL,wdH;
static uchar sn[8]={0};
uchar code b2hex[]="0123456789ABCDEF";
void delay(uint z)
{
while(--z);
}
void wrcmd1602(uchar cmd)//1602写命令
{
RS=0;
P0=cmd;
delay(2);
E=1;
E=0;
}
void wrdata1602(uchar shuju)//1602写数据
{
RS=1;
P0=shuju;
delay(2);
E=1;
E=0;
}
void init1602()//1602初始化
{
E=0;
wrcmd1602(0x38);
wrcmd1602(0x0c);
wrcmd1602(0x06);
wrcmd1602(0x01);
}
void disp1602(uchar x,uchar y,uchar ch)//1602显示
{
wrcmd1602(0x80+x*0x40+y);
wrdata1602(ch);
}
void init18b20(void)//18b20初始化
{
uchar m;
DQ=0;
for(m=0;m<=90;m++);
DQ=1;
for(m=0;m<=65;m++);
}
void wrcmd18b20(uchar cmd18b20)//18b20写1字节
{
bit sendbit;
uchar i,m;
for(i=1;i<=8;i++)
{
sendbit=cmd18b20&0x01;
cmd18b20=cmd18b20>>1;
if(sendbit==0)
{
DQ=0;
for(m=0;m<=2;m++);
DQ=0;
for(m=0;m<=20;m++);
DQ=1;
for(m=0;m<=2;m++);
}
else
{
DQ=0;
for(m=0;m<=1;m++);
DQ=1;
for(m=0;m<=10;m++);
DQ=1;
for(m=0;m<=1;m++);
}
}
}
bit rdbit18b20(void)//18b20读1位
{
uchar m;
bit onebit;
DQ=0;
_nop_();
DQ=1;
for(m=0;m<=1;m++);
onebit=DQ;
for(m=0;m<=10;m++);
return(onebit);
}
uchar rdbyte18b20(void)//18b20读1字节
{
uchar i,j;
uint wenduzhi;
for(i=1;i<=8;i++)
{
j=rdbit18b20();
wenduzhi=(j<<7)|(wenduzhi>>1);
}
return(wenduzhi);
}
void stconv18b20(void)//18b20启动
{
uchar m,n;
init18b20();
for(m=0;m<=1;m++);
wrcmd18b20(0xCC);
for(m=0;m<=1;m++);
wrcmd18b20(0x44);
for(n=0;n<=250;n++)
for(m=0;m<=250;m++);
for(n=0;n<=250;n++)
for(m=0;m<=250;m++);
}
uint rdwendu(void)//18b20读取
{
init18b20();
wrcmd18b20(0xCC);
wrcmd18b20(0xBE);
wdL=rdbyte18b20();
wdH=rdbyte18b20();
temp=wdH;
temp=temp<<8;
temp=temp|wdL;
temp=(uint)((float)temp*0.0625*10+0.5);
return(temp);
}
void main()
{
uint t,k;
init1602();
while(1)
{
stconv18b20();
t=rdwendu();
disp1602(0,0,t/100+'0');
disp1602(0,1,t/10%10+'0');
disp1602(0,2,'.');
disp1602(0,3,t%10+'0');
}
}
|