18b20&&max7221.c
来自「把18B20测得的温度信号通过MAX7221驱动的数码管显示出来」· C语言 代码 · 共 203 行
C
203 行
#include<reg51.h>
#include<intrins.h>
#include<math.h>
#define unchar unsigned char
sbit CS=P2^0;//max7221
sbit dat=P2^1;//18b20
//DIN接RXD(max7221)
//CLK接TXD(max7221)
void write_MAX7221(unchar A,unchar B)
{
CS=0;
SBUF=A;
while(!TI);
TI=0;
SBUF=B;
while(!TI);
TI=0;
CS=1;
}
void initial()
{
SCON=0X00; //串行方式0,1/12*fosc,S51先移出数据最低位
TI=0;
//初始化max7221,未用到的数据位全部置1
write_MAX7221(0X9F,0XF0);//设定DECODE MODE(只译码0~3位)
write_MAX7221(0X5F,0X0F);//设定INTENSITY(1/32)
write_MAX7221(0XDF,0XDF);//设定SCAN LIMIT(只扫描0~3位)
write_MAX7221(0X3F,0XFF);//SHUT DOWN(NORMAL OPERATION)
write_MAX7221(0XFF,0X7F);//DISPLAY TEST(NORMAL OPERATION)
}
void delay(unchar k)
{
while(--k); //delay_time=(5+2*k)us
}
void write_DS18B20(unchar k)
{
unchar idata i,j=0;
for(i=8;i>0;i--)
{
j=k&0X01;
if(j==0) //write '0'
{
dat=0;
delay(30); //62us
dat=1;
}
else //write '1'
{
dat=0;
_nop_();
_nop_();
dat=1;
delay(27); //60us
}
k>>=1;
}
}
unchar read()
{
unchar idata i,j=0,k=0;
for(i=8;i>0;i--)
{
dat=0;
_nop_();
_nop_();
dat=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
k=dat;
delay(22); //>45us
j=(k<<(8-i))|j;
}
return j;
}
void reset()
{
dat=0;
delay(240); //>480us
dat=1;
_nop_();
_nop_();
_nop_();
_nop_();
while(dat);
while(!dat);
delay(150); //405us
}
float convert(unchar TH,unchar TL)
{
float idata i=0;
if(TH>>4==0) //若为正数
{
i=(TH*256+TL)*0.0625;
}
else //若为负数
{
i=(-1)*((255-TH)*16+(256-TL)*0.0625);
}
return i;
}
void display(float k)
{
float v=k;
unchar idata b,c,d,e;
unsigned int idata a;
unchar idata decode[]={0X0E,0X8E,0X4E,0XCE,0X2E,0XAE,0X6E,0XEE,0X1E,0X9E,0X5E};
unchar idata pdecode[]={0X0F,0X8F,0X4F,0XCF,0X2F,0XAF,0X6F,0XEF,0X1F,0X9F,0X5F};
if(k>=100){k*=10;}
else if(k<100&&k>=10){k*=100;}
else if(k<10&&k>=0){k*=1000;}
else if(k<0&&k>-10){k*=-100;}
else {k*=-10;}
a=k;
b=a/1000;
c=a/100%10;
d=a%100/10;
e=a%100%10;
//digit 3为第一个数码管
if(v>=100)
{
write_MAX7221(0X8F,decode[e]); //digit 0
write_MAX7221(0X4F,pdecode[d]);//digit 1
write_MAX7221(0XCF,decode[c]); //digit 2
write_MAX7221(0X2F,decode[b]); //digit 3
}
else if(v<100&&v>=10)
{
write_MAX7221(0X8F,decode[e]); //digit 0
write_MAX7221(0X4F,decode[d]); //digit 1
write_MAX7221(0XCF,pdecode[c]); //digit 2
write_MAX7221(0X2F,decode[b]); //digit 3
}
else if(v<10&&v>=0)
{
write_MAX7221(0X8F,pdecode[e]); //digit 0
write_MAX7221(0X4F,decode[d]); //digit 1
write_MAX7221(0XCF,decode[c]); //digit 2
write_MAX7221(0X2F,decode[b]); //digit 3
}
else if(v<0&&v>-10)
{
write_MAX7221(0X8F,decode[e]); //digit 0
write_MAX7221(0X4F,decode[d]); //digit 1
write_MAX7221(0XCF,pdecode[c]);//digit 2
write_MAX7221(0X2F,decode[10]);//digit 3
}
else
{
write_MAX7221(0X8F,decode[e]); //digit 0
write_MAX7221(0X4F,pdecode[d]);//digit 1
write_MAX7221(0XCF,decode[c]); //digit 2
write_MAX7221(0X2F,decode[10]);//digit 3
}
}
void main()
{
unchar idata TH,TL;
float idata a;
initial();
for(;;)
{
reset();
write_DS18B20(0XCC);
write_DS18B20(0X44);
while(!dat);
reset();
write_DS18B20(0XCC);
write_DS18B20(0XBE);
TL=read();
TH=read();
a=convert(TH,TL);
display(a);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?