//******************************************************************
/*/******************************************************************
知识点
各位大侠, value>>=1;这句C程序什么意思??还有value|=0x80; ???
满意回答 value>>=1;
相当于
value = value >>1;
同理
value|=0x80;
也就相当于
value = value | 0x80;
| 和 >>都是位操作符,前者表示或,后者表示右移的意思,针对二进制位进行操作。
*//******************************************************************
//******************************************************************
//******************************************************************
//以下是c 语言程序代码
/******************************************************************/
//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 /??
/******************************************************************/
#include
#define uchar unsigned char
#define uint unsigned int
//DS18B20数据线?
sbit DQ =P2^4;
unsigned char flag ; /*负数标志*/
//行扫描数组
uchar code scan[8] ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//row0-----row7
//数码管显示的 段码表 7段数码管段码表共阴
uchar code table[13] ={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x39,0x00};// 显示段码值0123456789
//小数部分显示查询表
uchar code ditab[16]= {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,
0x07,0x08,0x08,0x09,0x09};
uchar dispbuf[8];//显示缓冲区
uchar temper[2];//存放温度的数组
//******************************************************************
//延时函数
//******************************************************************
void delay (unsigned int us)
{
while (us --);
}
//******************************************************************
//DA18B20复位函数
//******************************************************************
void reset(void)
{
uchar x =0;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(14);
x=DQ;
delay(20);
}
//******************************************************************
//从DS18B20中读出一个字节
//******************************************************************
uchar readbyte(void)
{
uchar i= 0;
uchar dat =0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
//******************************************************************
//向DS18B20中写一个字节
//******************************************************************
void writebyte(unsigned char dat)
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
//******************************************************************
//从中读取实时
//******************************************************************
void readtemp(void)
{
uchar a=0, b=0;
reset();
writebyte(0xCC); //跳过序列号
writebyte(0x44); //启动温度转换
reset();
writebyte(0xCC);
writebyte(0xBE);
a=readbyte();
b=readbyte();
if(b>0x0f)
{
a= ~ a +1;
if(a==0)
b= ~b + 1;
else b= ~b;
flag =10; //是负数table[10]=0x04显示负数标志“-”
}
else flag =12;//是正数table[12]=0x00不显示正数标志
temper[0]=a&0x0f;
a=a>>4;
temper[1]=b<<4;
temper[1]=temper[1]|a;
}
//******************************************************************
//动态扫描函数
//******************************************************************
void scandisp()
{
unsigned char i,value;
for(i=0;i<8;i++)
{
P3=0xff;
value=table[dispbuf[i]];
if(i==3)
value|=0x80;
P0=value;
P3=scan[i];
delay(70) ; // delay(50)闪;
}
}
//******************************************************************
//主函数
//******************************************************************
void main()
{
uchar temp,temp1;
while(1)
{
scandisp();
readtemp();
temp1=temper[0];
temp =temper[1];
dispbuf[4]=ditab[temp1]; //显示小数部分
//dispbuf[4]=ditab[0];dispbuf[4]=ditab[1];
//dispbuf[4]=ditab[2];dispbuf[4]=ditab[3];
//dispbuf[4]=ditab[5]------ dispbuf[4]=ditab[15];
dispbuf[1]=temp/100;//显示百位部分
dispbuf[3]=temp%10;//显示个位部分
temp =temp/10;
dispbuf[2]=temp%10;//显示十位部分
dispbuf[0]=flag;//显示正负标志位
dispbuf[5]=11; //显示C
//scandisp();//在前后均可
}
}
//******************************************************************
//******************************************************************
//******************************************************************
//******************************************************************
本文来源:https://www.2haoxitong.net/k/doc/565d330bba1aa8114431d98a.html
文档为doc格式