#include<reg52.h>
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sta
tic uchar th,tl,b,c,d,f,j;
uint a, temp;
sbit morehigh=P1^0 ;
sbit high=P1^1 ;
sbit low=P1^2 ;
sbit morelow=P1^3 ;
sbit R=P2^3;
sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit lcden=P2^2;
sbit speak=P2^5;
sbit di=P2^4;
sbit close=P2^6;
sbit open=P2^7;
unsigned char time ;
void rotate();
unsigned char code table[]={"0123456789.:'C"};
unsigned char code table1[]={"temp:"};
unsigned char code table2[]={"the angular is "};
unsigned char code error[]={" error!"};
void delay1us(unsigned char x)
{
uint i;
x*=5/4;
for(i=0;i<x;i++);
}
void delay1ms()
{ unsigned int x,y; for(x=0;x<10;x++) for(y=33;y>0;y--); }
void delay(unsigned int z)
{ unsigned char x; for(x=z;x>0;x--) delay1ms();}
void change();
void write_com(unsigned char com)
{
lcdrs=0;
SBUF=com; // 原来并行
通信时, 这条 是 P1=com;
// P1=com;
while(TI==0);TI=0; // 这条 是我改过的, 原来并行通信时,这条 是没有的
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(unsigned char dat)
{
lcdrs=1;
SBUF=dat; // 原来并行通信时, 这条 是 P1=com;
while(TI==0);TI=0; // 这条 是我改过的, 原来并行通信时,这条 是没有的
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init(void)
{
lcden=0;
lcdrw=0;
write_com(0x01);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
}
/*DS18b20操作program*/
bit datayn(void) //初始化设置
{
bit flag;
di=1;
for(time=0;time<2;time++);
di=0;
for(time=0;time<200;time++);
di=1;
for(time=0;time<10;time++);
flag=di;
for(time=0;time<100;time++);
di=1;
for(time=0;time<10;time++);
return(flag) ;
}
void Delayxus_DS18B20(unsigned int t)
{
for(t;t>0;t--)
{
_nop_();_nop_();_nop_();_nop_();
}
_nop_(); _nop_();
}
unsigned char Read_Bit()
{
unsigned char ret;
di=0;//拉低总线
_nop_(); _nop_();
di=1;//释放总线
// _nop_(); _nop_();
// _nop_(); _nop_();
ret=di;//读时隙产生7 us后读取总线数据。把总线的读取动作放在15us时间限制的后面是为了保证数据读取的有效性
Delayxus_DS18B20(3);//延时60us,满足读时隙的时间长度要求
di=1;//释放总线
return ret; //返回读取到的数据
}
uchar read_onechar(void)
{
unsigned char i;
unsigned char dat=0;
for(i=0;i<8;i++)
{
dat>>=1; //先读最低位
if(Read_Bit())
dat|=0x80;
}
return(dat);
}
void write_onechar(uchar dat)
{
uchar i,time;
di=1; _nop_();_nop_();
for(i=0;i<8;i++)
{
di=0; // delay1us(2); //for(time=0;time<4;time++);
di=dat&0x01; delay1us(20); // for(time=0;time<10;time++);
di=1;
_nop_(); //_nop_();
dat>>=1;
}
for(time=0;time<2;time++);
}
void display(void)
{
unsigned int i=0;
write_com(0x80);
if(datayn()==1)
{
while(error[i]!=' ')
{
write_data(error[i]);
i++;
}
}
else
{
while(table1[i]!=' ')
{
write_data(table1[i]);
i++;
}
}
}
void readtemp()
{
di=1;_nop_();_nop_();
datayn();
write_onechar(0XCC);
write_onechar(0x44);
for(time=0;time<100;time++);
datayn();
write_onechar(0XCC);
write_onechar(0XBE);
for(time=0;time<200;time++);
tl=read_onechar(); th=read_onechar();
// while ((tl>>4|th<<4)==85);
di=1; _nop_(); _nop_(); // nop_();
if (th>>4==0)
{
a=tl>>4|th<<4;
b=a/100;c=(a%100)/10;d=a%10;
j=tl&0x0f;f=(j*10/16)%10;
write_com(0x85); write_data(' ');
}
else
{
temp=(~(tl|th<<8)+1);temp*=0.0625;b=temp/100;c=temp/10%10;d=temp%10;f=(temp*10)%10;
write_com(0x85); write_data('-');
}
write_com(0x86); write_data(table[b]);write_data(table[c]);
write_data(table[d]);write_data(0x2e);write_data(table[f]);
write_data(table[12]);write_data('c');
}
void main()
{
SCON=0x00;
R=0; _nop_(); _nop_(); R=1;
init();
display();
while(1)
{
readtemp();
rotate(); // 为啥没这个程序块的时候,程序是正常的,加上后就会出现乱码呢,有时候显示反应可慢
}
}
void al
ARM()
{
uchar j=5;
while (j--)
{
speak=~speak;
delay(30);
}
}
void rotate()
{
if(a>90)
{
uint uk ;
uk=a-90;
while (uk--)
{
{
uchar i,t; t=0xfe;
for(i=0;i<4;i++)
{
P0=t;
delay(20);
t=_crol_(t,1);
alarm();
}
}
}
}
}
-
我个人感觉还是在18b20时序上有问题
后来我把后面的程序舍去后, 在显 示屏上停了半分钟左右,会闪下其他温度值 哎
希望这个问题能早点解决啊
一周热门 更多>