您的位置 首页 动态

51单片机 8255 18b20 数码管显现温度C程序

includereg52h>includeabsacch>includeintrinsh>defineuintunsignedintdefineucharunsignedcharde

#include

#include
#include
#define uint unsigned int
#define uchar unsigned char
#define PA 0x7cff //PA口
#define PB 0x7dff //PB口
#define con 0x7fff //操控字

sbit A8=P2^0; //地址线A0
sbit A9=P2^1; //地址线A1
sbit cs=P2^7; //片选
sbit wr=P3^6; //读端口
uint temp;
uchar tplsb,tpmsb; // 温度值低位、高位字节
sbit date=P1^2; //数据通信线

uchar code tableshi[]=
{0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
//数码管段选 十位

uchar code tablege[]=
{0xbf,0x86,0xdb,0xcf,0xe6,
0xed,0xfd,0x87,0xff,0xef};
//数码管段选 个位 带小数点

//uchar code tablewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
//数码管位选

void delay(uchar i)
{
uchar j,k;
for(j=i;j>0;j–)
for(k=125;k>0;k–);
}

void init()
{
uint i;
date=1;
delay(1);

date = 0;
i = 100; //拉低约900us
while (i>0) i–;

date= 1; // 发生上升沿
i = 4;
while (i>0) i–;
}

void wait()
{
uint i;
while(date);
while(~date); // 检测到应对脉冲
i = 4;
while (i>0) i–;
}

bit readbit()
{
uint i;
bit b;
date = 0;
i++;
date = 1;
i++;i++; // 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有用
b = date;
i = 8;
while(i>0) i–;
return (b);
}

uchar readbyte()
{
uchar i,j,b;
b = 0;
for (i=1;i<=8;i++)
{
j = readbit();
b = (j<<7)|(b>>1);//读出的数据最低位在最前面,这样刚好一个字节在DATE里
}
return(b);
}

void writebyte(uchar b)//
{
uint i;
uchar j;
bit btmp;
for(j=1;j<=8;j++)
{
btmp = b&0x01;
b = b>>1; // 取下一位(由低位向高位)
if (btmp) // 写1
{

date = 0;
i++;i++; // 延时,使得15us以内拉高
date = 1;
i = 8;
while(i>0) i–; // 整个写1时隙不低于60us
}
else // 写0
{

date = 0;
i = 8;
while(i>0) i–; // 坚持低在60us到120us之间
date = 1;
i++;
i++;
}
}
}

void convert()
{
init(); // 发生复位脉冲,初始化DS18B20
wait(); // 等候DS18B20给出应对脉冲
delay(1); // 延时
writebyte(0xcc); // 越过rom 指令
writebyte(0x44); // convert T 指令

}

uint readtemp()
{
float tt;
init(); // 发生复位脉冲,初始化DS18B20
wait(); // 等候DS18B20给出应对脉冲
delay(1); // 延时
writebyte(0xcc); // 越过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,A3;
A1=temp/100;
A2=temp%100/10;
A3=temp%10;

wr=1;
XBYTE[PB]=0xdf; //选通第一位数码管
wr=0;
delay(1);

wr=1;
XBYTE[PA]=tableshi[A1]; //显现百位
wr=0;
delay(10);

wr=1;
XBYTE[PA]=0x00; //关掉显现百位
wr=0;

wr=1;
XBYTE[PB]=0xef; //选通第2位数码管
wr=0;
delay(1);

wr=1;
XBYTE[PA]=tablege[A2];//显现十位
wr=0;
delay(10);

wr=1;
XBYTE[PA]=0x00; //关掉显现十位
wr=0;

wr=1;
XBYTE[PB]=0xf7; //选通第3位数码管
wr=0;
delay(1);

wr=1;
XBYTE[PA]=tableshi[A3]; //显现个位
wr=0;
delay(10);

wr=1;
XBYTE[PA]=0x00; //关掉显现个位
wr=0;

}

void main()
{

wr=1;
XBYTE[con]=0x80;//A组输入B组输出方法0
wr=0;
delay(1); // 延时1ms
convert(); // 发动温度转化,需求750ms
delay(1000); // 延时1s
while(1)
{
convert();
display(readtemp());
}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/dongtai/260691.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部