本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
数码管显示电路:
源程序:
/*********************************************
**项目: DS18B20驱动程序(EE01学习板演示程序)
**作者:一线工人
**网站:电子工程师之家 www.eehome.cn
*********************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint temp;
uchar tplsb,tpmsb; // 温度值低位、高位字节
sbit DQ = P1^3; // 数据通信线DQ
sbit dm=P1^4;
sbit wm=P1^5;
sbit led=P1^6;
unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E};
unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//带小数的段码表
/********************** 延时t毫秒***************** */
void delay(uint t)
{
uint i;
while(t--)
{
for (i=0;i<125;i++) // 对于11.0592M时钟,约延时1ms
{}
}
}
/*******************产生复位脉冲初始化DS18B20**************/
void reset(void)
{
uint i;
DQ = 0;
i = 100; //拉低约900us
while (i>0) i--;
DQ = 1; // 产生上升沿
i = 4;
while (i>0) i--;
}
/********************* 等待应答脉冲*********************/
void wait(void)
{
uint i;
while(DQ);
while(~DQ); // 检测到应答脉冲
i = 4;
while (i>0) i--;
}
/********************读取数据的一位,满足读时隙要求**************/
bit readbit(void)
{
uint i;
bit b;
DQ = 0;
i++;
DQ = 1;
i++;i++; // 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
b = DQ;
i = 8;
while(i>0) i--;
return (b);
}
/******************* 读取数据的一个字节**************************/
uchar readbyte(void)
{
uchar i,j,b;
b = 0;
for (i=1;i<=8;i++)
{
j = readbit();
b = (j<<7)|(b>>1);
}
return(b);
}
/******************写数据的一个字节,满足写1和写0的时隙要求************/
void writebyte(uchar b)
{
uint i;
uchar j;
bit btmp;
for(j=1;j<=8;j++)
{
btmp = b&0x01;
b = b>>1; // 取下一位(由低位向高位)
if (btmp)
{
DQ = 0;
i++;i++; // 延时,使得15us以内拉高
DQ = 1;
i = 8;
while(i>0) i--; // 整个写1时隙不低于60us
}
else
{
DQ = 0;
i = 8;
while(i>0) i--; // 保持低在60us到120us之间
DQ = 1;
i++;
i++;
}
}
}
/************************* 启动温度转换********************/
void convert(void)
{
reset(); // 产生复位脉冲,初始化DS18B20
wait(); // 等待DS18B20给出应答脉冲
delay(1); // 延时
writebyte(0xcc); // skip rom 命令
writebyte(0x44); // convert T 命令
}
/********************* 读取温度值****************************/
uint readtemp(void)
{ float tt;
reset(); // 产生复位脉冲,初始化DS18B20
wait(); // 等待DS18B20给出应答脉冲
delay(1); // 延时
writebyte(0xcc); // skip rom 命令
writebyte(0xbe); // read scratchpad 命令
tplsb = readbyte(); // 温度值低位字节(其中低4位为二进制的“小数”部分)
tpmsb = readbyte(); // 高位值高位字节(其中高5位为符号位)
temp=tpmsb;
temp<<=8;
temp=temp|tplsb;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}
/**********************显示程序****************************/
void display(uint temp)
{
uchar A1,A2,A2t,A3;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
P0=0X01; //选通第一位数码管
wm=1;
wm=0;
P0=table[A1];//显示百位
dm=1;
dm=0;
delay(1);
P0=0xff;//关位码
dm=1;
dm=0;
P0=0x02;//选通第二位数码管
wm=1;
wm=0;
P0=table1[A2];//显示十位
dm=1;
dm=0;
delay(1);
P0=0xff;//关位码
dm=1;
dm=0;
P0=0x04;//选通第三位数码管
wm=1;
wm=0;
P0=table[A3];//显示个位
dm=1;
dm=0;
delay(1);
P0=0xff;//关位码
dm=1;
dm=0;
}
void main(void)
{
led=0;
delay(1); // 延时1ms
convert(); // 启动温度转换,需要750ms
delay(1000); // 延时1s
readtemp(); // 读取温度
while(1)
{
convert();
display(readtemp());
}
} |
|