|
需要DS1820的C51源程序看看这里,这边需要双DS1820.正在研究中。。。。
- 网上有很多这样的例程啊。给你一个STC的,STC的下载程序方便,上手也比较快
- CPU:STC12C5A48S2
- #include "18B20.h"
- #include<intrins.h>
- #include <math.h> //要用到取绝对值函数abs()
- /**************************************
- 延时X微秒(STC12C5A60S2@12M)
- 不同的工作环境,需要调整此函数
- 此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
- **************************************/
- sbit DQ=P1^0; //定义18B20数据脚为P1.0端口
- void DelayXus(uint n)
- {
- while (n--)
- {
- _nop_();
- _nop_();
- }
- }
- void getTmp_Update()
- {
- uint TPL,TPH,tmpvalue,value;
- float t;
-
- Room_tmep=0;
- DS18B20_Reset(); //设备复位
- DS18B20_WriteByte(0xCC); //跳过ROM命令
- DS18B20_WriteByte(0x44); //开始转换命令
-
- while (!DQ){}; //等待转换完成
- DS18B20_Reset(); //设备复位
- DS18B20_WriteByte(0xCC); //跳过ROM命令
- DS18B20_WriteByte(0xBE); //读暂存存储器命令
- TPL = DS18B20_ReadByte(); //读温度低字节
- TPH = DS18B20_ReadByte(); //读温度高字节
- tmpvalue = TPH;
- tmpvalue <<= 8;
- tmpvalue |= TPL;
- value = tmpvalue;
- t = value * 0.0625; //使用DS18B20的默认分辨率12位, 精确度为0.0625度, 即读回数据的最低位代表0.0625度
- /* 如果将它放大100倍, 使显示时可显示小数点后两位, 并对小数点后第三进行4舍5入, 如t=11.0625, 进行计数后, 得到value = 1106, 即11.06 度,
- 如t=-11.0625, 进行计数后, 得到value = -1106, 即-11.06 度 */
- Room_tmep= t; //得到最终温度
- }
- /**************************************
- 复位DS18B20,并检测设备是否存在
- **************************************/
- void DS18B20_Reset()
- {
- uchar i=0;
- CY = 1;
- while (CY)
- {
-
- DQ = 0; //送出低电平复位信号
- DelayXus(240); //延时至少480us
- DelayXus(240);
- DQ = 1; //释放数据线
- DelayXus(60); //等待60us
- CY = DQ; //检测存在脉冲
- DelayXus(240); //等待设备释放数据线
- DelayXus(180);
- i++;
- if (i>50){AD_Error_code=1;return;}else{if (AD_Error_code==1) {AD_Error_code=0;}}
- }
- }
- /**************************************
- 从DS18B20读1字节数据
- **************************************/
- uint DS18B20_ReadByte()
- {
- uchar i;
- uchar dat = 0;
- for (i=0; i<8; i++) //8位计数器
- {
- dat >>= 1;
- DQ = 0; //开始时间片
- DelayXus(1); //延时等待
- DQ = 1; //准备接收
- DelayXus(1); //接收延时
- if (DQ) dat |= 0x80; //读取数据
- DelayXus(60); //等待时间片结束
- }
- return dat;
- }
- /**************************************
- 向DS18B20写1字节数据
- **************************************/
- void DS18B20_WriteByte(uint dat)
- {
- uchar i;
- for (i=0; i<8; i++) //8位计数器
- {
- DQ = 0; //开始时间片
- DelayXus(1); //延时等待
- dat >>= 1; //送出数据
- DQ = CY;
- DelayXus(60); //等待时间片结束
- DQ = 1; //恢复数据线
- DelayXus(1); //恢复延时
- }
- }
复制代码
|
|