声明 :仅供参考
单片机 :89c52 pnp三极管驱动共阳数码管
# include
# include
# define uint unsigned int
# define uchar unsigned char
uchar code table1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code table2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x66,0x21,0x06,0x0e,0x0c,0x09,0x11};
sbit led0=P2^0;
sbit led1=P2^1;
sbit led2=P2^2;
sbit led3=P2^3;
sbit led4=P2^4;
sbit led5=P2^5;
sbit ds=P2^6;
float ftemp;
uint temp,flag;
void delay15us(uint temp) //整个函数关键的部分就在这个延时函数 在ds18b20中 每一步的延时都要求比较精确 要严格依据时序来写
{
for(temp;temp>0;temp--)
{
_nop_();
_nop_();
_nop_();
}
_nop_();
_nop_();
}
void delay(uint k) //延时函数 这个延时是为了数码管
{
uint i,j;
for(i=k;i>0;i--)
for(j=113;j>0;j--) ;
}
bit RST() //复位函数
{
bit ret=1;
ds=0;
delay15us(39);
ds=1;
delay15us(4);
ret=ds; //检测是否变位成功 即ds是否为零 下面用一个led/测试一下
//led=ds;
delay15us(27);//这都是根据时序图上来写的
ds=1;
return ret ;//其实有点不明白 为什么加上这个返回值 有什么用吗
}
void writebit(bit dat_bit) //完全依据时序来写一位 的函数
{
ds=0;
delay15us(0);
ds=dat_bit;
delay15us(2);
ds=1;
}
void writebyte(uchar dat_byte)
{
uint i;
for(i=0;i<8;i++)
{
writebit((dat_byte&0x01));
dat_byte>>=1;
}
}
bit readbit()
{
bit dat_bit;
ds=0;
_nop_();
_nop_();
_nop_();
ds=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
dat_bit=ds;
delay15us(3);
ds=1;
return dat_bit;
}
uchar readbyte()
{
uchar dat_byte=0;
uchar i,j;
for(i=0;i<8;i++)
{
j= readbit();
dat_byte=(j<<7)|(dat_byte>>1);
}
return dat_byte;
}
void sweap() //启动温度转换
{
RST();
_nop_();
_nop_();
writebyte(0xcc);
writebyte(0x44);
}
uint get()
{
uint a,b,t;
RST();
_nop_();
_nop_();
writebyte(0xcc);
writebyte(0xbe);
a=readbyte();
b=readbyte();
if(b&0xfc)
{
temp=b;
temp= temp<<8;
temp|=a;
temp=((~temp)+1);
ftemp=temp*0.0625*100+0.5;
t=ftemp;
flag=1;
}
else
{
ftemp=((b*256)+a)*0.0625;
t=ftemp*100+0.5;
flag=0;
}
return t;
}
void display(disnum)
{
led0=0;
P1=table1[disnum/1000];
delay(3);
P1=0xff;
led0=1;
led1=0;
P1=table2[disnum%1000/100];
delay(3);
P1=0xff;
led1=1;
led2=0;
P1=table1[disnum%100/10];
delay(3);
P1=0xff;
led2=1;
led3=0;
P1=table1[disnum%10];
delay(3);
P1=0xff;
led3=1;
led4=0;
P1=0xc6;
delay(1);
led4=1;
}
void main()
{
uint disnum;
led5=0;
while(1)
{
sweap() ;
disnum=get();
display(disnum);
}
}