数码管显示部分的原理图:http://www.51hei.com/f/51hei-5.pdf
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit ds=P2^2;
sbit speak=P2^3;
uchar code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x39};
uchar code smg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar dis_smg[3] ;
int temper;
void delay_1ms(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++);
}
void delayus(uint t)
{
while(t--);
}
void reset()
{
uchar n;
ds=1;
delayus(8);
ds=0;
delayus(80);
ds=1;
delayus(8);
n=ds;
delayus(4);
}
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
ds=0;
ds=dat&0x01;
delayus(5);
ds=1;
dat>>=1;
}
}
uchar read_byte(uchar value)
{
uchar i;
for(i=0;i<8;i++)
{
ds=0;
value>>=1;
ds=1;
if(ds==1)
value|=0x80;
delayus(4);
}
return value;
}
void write_com()
{
reset();
write_byte(0xcc);
write_byte(0x44);
}
int read_temper()
{
int temper;
uchar a,b;
reset();
write_byte(0xcc);
write_byte(0xbe);
EA=0;
a=read_byte();
b=read_byte();
EA=1;
temper=b;
temper<<=8;
temper|=a;
temper*=0.625;
return temper;
}
void display(uchar dat1,uchar dat2)
{
P0=0x00;
dula=1;dula=0;
P0=smg_we[dat1];
wela=1;wela=0;
P0=smg_du[dat2];
dula=1;dula=0;
delay_1ms(5);
}
void main()
{
uchar i;
while(1)
{
write_com();
temper=read_temper();
//temper-=200;
delay_1ms(1);
for(i=0;i<10;i++)
{
if(temper>250)
{
speak=0;
delay_1ms(10);
speak=1;
}
if(temper<0)
{
temper=~temper+1;
for(i=0;i<200;i++)
{
display(1,10);
display(2,(temper/100));
display(3,(temper/10%10));
display(4,11);
}
}
else
{
for(i=0;i<100;i++)
{
display(2,(temper/100));
display(3,(temper/10%10));
display(4,11);
}
}
}
}
}
|