能发个ds18b20的C语言给我吗?要4个数码管显示的,12M的晶振,我做的时序老是不对

 我来答
zhangliang571
2011-05-12
知道答主
回答量:23
采纳率:0%
帮助的人:6.3万
展开全部
#include<reg52.h>
#include<intrins.h> //可选,当需用_nop_()时,使用它

/******************************************************
* 数据简洁定义
******************************************************/
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long dword;
#define uchar unsigned char
#define uint unsigned int
uchar ms;
uchar temps[4];
uchar temph;
uint templ;
sbit dq = P1^4;
//bit flag; //18B20启动成功标志位
uint temp;
uchar temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节
uchar id_buff[8];
uchar *p;

uchar crc_data;
uchar code CrcTable [256]={ //CRC校验码查询表
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};
//
/************************************************************
*Function:延时处理
*parameter:
*Return:
*Modify:
*************************************************************/
void TempDelay (uchar us)
{
while(us--);
}

/************************************************************
*Function:18B20初始化
*parameter:
*Return:
*Modify:
*************************************************************/
void Init18b20 (void)
{
dq=1;
_nop_();
dq=0;
TempDelay(86); //delay 530 uS//80
_nop_();
dq=1;
TempDelay(14); //delay 100 uS//14
_nop_();
_nop_();
_nop_();

/* if(dq==0)
flag = 1; //detect 1820 success!
else
flag = 0; //detect 1820 fail!*/
TempDelay(20); //20
_nop_();
_nop_();
dq = 1;
}

/************************************************************
*Function:向18B20写入一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
void WriteByte (uchar wr) //单字节写入
{
uchar i;
for (i=0;i<8;i++)
{
dq = 0;
_nop_();
dq=wr&0x01;
TempDelay(5); //delay 45 uS //5
_nop_();
_nop_();
dq=1;
wr >>= 1;
}
}

/************************************************************
*Function:读18B20的一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
uchar ReadByte (void) //读取单字节
{
uchar i,u=0;
for(i=0;i<8;i++)
{
dq = 0;
u >>= 1;
dq = 1;
if(dq==1)
u |= 0x80;
TempDelay (4);
_nop_();
}
return(u);
}

/************************************************************
*Function:读18B20
*parameter:
*Return:
*Modify:
*************************************************************/
void read_bytes (uchar j)
{
uchar i;
for(i=0;i<j;i++)
{
*p = ReadByte();
p++;
}
}

/************************************************************
*Function:CRC校验
*parameter:
*Return:
*Modify:
*************************************************************/
uchar CRC (uchar j)
{
uchar i,crc_data=0;
for(i=0;i<j;i++) //查表校验
crc_data = CrcTable[crc_data^temp_buff[i]];
return (crc_data);
}

/************************************************************
*Function:读取温度
*parameter:
*Return:
*Modify:
*************************************************************/
void GemTemp (void)
{
read_bytes (9);
if (CRC(9)==0) //校验正确
{
temp = temp_buff[1]*0x100 + temp_buff[0];
// temp *= 0.625;
// temp /= 16;
TempDelay(1);
}
}

/************************************************************
*Function:内部配置
*parameter:
*Return:
*Modify:
*************************************************************/
void Config18b20 (void) //重新配置报警限定值和分辨率
{
Init18b20();
WriteByte(0xcc); //skip rom
WriteByte(0x4e); //write scratchpad
WriteByte(0x19); //上限
WriteByte(0x1a); //下限
WriteByte(0x7f); //set 11 bit (0.125)
//------------------------------------
Init18b20();
WriteByte(0xcc); //skip rom
WriteByte(0x48); //保存设定值
//------------------------------------
Init18b20();
WriteByte(0xcc); //skip rom
WriteByte(0xb8); //回调设定值
}

/************************************************************
*Function:读18B20ID
*parameter:
*Return:
*Modify:
*************************************************************/
void ReadID (void)//读取器件 id
{
Init18b20();
WriteByte(0x33); //read rom
read_bytes(8);
}
void Read_Temp( void )
{
Init18b20 ();
WriteByte(0xcc); //skip rom
WriteByte(0x44); //Temperature convert
Init18b20 ();
WriteByte(0xcc); //skip rom
WriteByte(0xbe); //read Temperature
p = temp_buff;
GemTemp();
}

void d18b20_PowerUp()
{
p = id_buff;
ReadID();
Config18b20();
}

//数码管译码表0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、空
uchar code Seg[17]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x00};
void delay(uchar tt)
{
uchar i;
for(;tt>0;tt--)
for(i=0;i<200;i++);
}

//d1:段选码、d2:位选码
//最高位 a b c d e f g dp 最低位
void LED( uchar d1,uchar d2 )
{
// byte i;
INT0 = 0;
SBUF = d2;
while(!TI);
TI= 0;

SBUF = d1;
while(!TI);
TI= 0;
INT0 = 1;
}

//dis_buf:四位显示缓冲数组
void LED_disp( uchar *dis_buf )
{
LED( Seg[ dis_buf[0] ], 0xef );//最高位
delay(2);
LED( Seg[ dis_buf[1] ], 0xdf );
delay(2);
LED( Seg[ dis_buf[2] ]|0x01, 0xbf );
delay(2);
LED( Seg[ dis_buf[3] ], 0x7f );//最低位
delay(2);
}

/*************************************************************/
//延时1s
void DEL(uchar tt)
{
uchar i;
for(;tt>0;tt--)
for(i=0;i<10;i++)
{ ;}
}

/**********************************************************************
函数功能: 定时器中断函数(10ms 16位定时)
入口参数: 无
出口参数: 无
***********************************************************************/
void Time0_Func() interrupt 3 /*当定时器中断时执行此函数*/
{
TH1=(0xffff-9259)/256; /*T0初始化*/
TL1=(0xffff-9259)%256;
ms++;
if(ms == 200)
{
ms=0;
Read_Temp();

//----------------------------------------------------------

temph = temp / 16; //Temperature最低四位为小数部分
templ = temp & 0xf; //16进制与BCD码转换
templ = templ >> 1;
templ *= 125;
temps[0] = temph / 100;
temps[1] = temph / 10 %10;
temps[2] = temph % 10;
temps[3] = templ / 100;

}
}

/**********************************************************************
函数功能: 上电初始化函数
入口参数: 无
出口参数: 无
***********************************************************************/
void Power_Up(void)
{
TMOD = 0x10;/*Time0/1为16计数器*/
TH1=(0xffff-9216)/256;/*10ms*/
TL1=(0xffff-9216)%256;/*10ms*/
TR1=1;
IE=0x88; /*EA=1 ET1=1*/
P0=0xff;
P2=0xff;
}

main()
{
Power_Up();
d18b20_PowerUp();

while(1)
{

LED_disp(temps);

}
}
羅策店ry
2011-05-18 · 超过15用户采纳过TA的回答
知道答主
回答量:68
采纳率:0%
帮助的人:34.3万
展开全部
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式