|
#include<regx52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit a1=P2^2;
sbit b1=P2^3;
sbit c1=P2^4;
uchar DisplayData[5];
void Delay1ms(uint y)
{
uint x;
for( ; y>0; y--)
{
for(x=110; x>0; x--);
}
}
uchar code LEDcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay(uint x)
{
while(x--);
}
void display()
{
uchar i;
for(i=0;i<5;i++)
{
switch(i)
{
case 0:a1=0;b1=0;c1=0;break;
case 1:a1=1;b1=0;c1=0;break;
case 2:a1=0;b1=1;c1=0;break;
case 3:a1=1;b1=1;c1=0;break;
case 4:a1=0;b1=0;c1=1;break;
}
P0=DisplayData[i];
delay(100);
P0=0x00;
}
}
sbit ds18b20=P3^7;
void rest()
{
uchar i;
ds18b20=0;
i=70;
while(i--);
ds18b20=1;
while(ds18b20);
i=50;
while(i--);
}
void writeds18b20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
uchar i;
ds18b20=0;
_nop_();_nop_();
ds18b20=dat&0x01;
dat>>=1;
i=6;
while(i--);
ds18b20=1;
_nop_();
}
}
uchar readds18b20()
{
uchar bi,i,a;
for(i=0;i<8;i++)
{
ds18b20=0;
_nop_();_nop_();
ds18b20=1;
i++;
i++;
a=ds18b20;
bi=(bi>>1)|(a<<7);
i = 4;
while(i--);
}
return bi;
}
void Ds18b20ChangTemp()
{
rest();
Delay1ms(1);
writeds18b20(0xcc); //跳過ROM操作命令
writeds18b20(0x44); //溫度轉(zhuǎn)換命令
//Delay1ms(100); //等待轉(zhuǎn)換成功,而如果你是一直刷著的話,就不用這個(gè)延時(shí)了
}
void Ds18b20ReadTempCom()
{
rest();
Delay1ms(1);
writeds18b20(0xcc); //跳過ROM操作命令
writeds18b20(0xbe); //發(fā)送讀取溫度命令
}
uint Ds18b20ReadTemp()
{
uint temp = 0;
uchar tmh, tml;
Ds18b20ChangTemp(); //先寫入轉(zhuǎn)換命令
Ds18b20ReadTempCom(); //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
tml = readds18b20(); //讀取溫度值共16位,先讀低字節(jié)
tmh =readds18b20(); //再讀高字節(jié)
temp = tmh;
temp <<= 8;
temp |= tml;
return temp;
}
void datapros(uint temp)
{
temp=temp*0.0625;
DisplayData[0] = ~LEDcode[temp / 10000];
DisplayData[1] = ~LEDcode[temp % 10000 / 1000];
DisplayData[2] = ~LEDcode[temp % 1000 / 100] | 0x80;
DisplayData[3] = ~LEDcode[temp % 100 / 10];
DisplayData[4] = ~LEDcode[temp % 10];
}
main()
{
while(1)
{
datapros(Ds18b20ReadTemp());
display();
}
}
對(duì)于延時(shí)多久我是真的頭疼,把控不了 |
|