You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

135 lines
5.5 KiB

C51 COMPILER V9.56.0.0 DS18B20 04/30/2022 20:50:18 PAGE 1
C51 COMPILER V9.56.0.0, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN DS18B20.OBJ
COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE DS18B20.c OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND TABS(2)
line level source
1 #include "DS18B20.h"
2
3 sbit DS18B20=P3^2; //定义数据线
4
5 void delay_ms(unsigned int x)//延时1ms
6 {
7 1 unsigned int y,z;
8 1 for(y=x;y>0;y--)
9 1 for(z=110;z>0;z--);
10 1 }
11
12 uchar DS18B20_Init() //初始化。成功返回1,不成功返回0.
13 {
14 1 uchar i;
15 1 DS18B20 = 0; //将总线拉低480微秒~960微秒
16 1 i = 70;
17 1 while(i--); //延时642微秒
18 1 DS18B20 = 1; //拉高总线,等待后续反馈
19 1 i = 0;
20 1 while(DS18B20) //等待DS18B20拉低总线
21 1 {
22 2 delay_ms(1); //定义的延迟1ms的延迟函数
23 2 i++;
24 2 if(i>5) //等待5ms以上
25 2 {
26 3 return 0; //初始化失败
27 3 }
28 2 }
29 1 return 1; //初始化成功
30 1 }
31
32 uchar DS18B20_ReadByte() //通过读取8次状态位达到读取字节的目的
33 {
34 1 uchar byte, bi;
35 1 uint i, j;
36 1 for(j=8; j>0; j--)
37 1 {
38 2 DS18B20 = 0; //先将总线拉低
39 2 i++;
40 2 DS18B20 = 1; //然后释放总线
41 2 i++;
42 2 i++; //延时6微秒等待数据稳定
43 2 bi = DS18B20; //读取数据,从最低位开始读取
44 2 byte = (byte >> 1) | (bi << 7); //从最低位开始记录,将byte依次右移
45 2 i = 4; //读取完之后等待48微秒再接着读取下一个数
46 2 while(i--);
47 2 }
48 1 return byte; //将读取完的字节保存
49 1 }
50
51 void DS18B20_WriteByte(uchar dat)//函数通过循环写8个位实现写一个字节
52 {
53 1 uint i, j;
54 1 for(j=0; j<8; j++)
55 1 {
C51 COMPILER V9.56.0.0 DS18B20 04/30/2022 20:50:18 PAGE 2
56 2 DS18B20 = 0; //每写入一位数据之前先把总线拉低
57 2 i++;
58 2 DS18B20 = dat & 0x01; //然后写入一个数据,从最低位开始
59 2 i=6;
60 2 while(i--); //延时68微秒
61 2 DS18B20 = 1; //释放总线,给总线1微秒恢复时间才能接着写入下一位
62 2 dat >>= 1;
63 2 }
64 1 }
65
66 int DS18B20_ReadTemp() //读取的温度有两个字节,分别用tml和tmh存储两个字节
67 {
68 1 int temp = 0;
69 1 uchar tmh, tml;
70 1 DS18B20_Init(); //传感器初始化
71 1 delay_ms(1); //延时1微秒
72 1 DS18B20_WriteByte(0xcc); //跳过读取序列号操作
73 1 DS18B20_WriteByte(0x44); //温度转换指令
74 1 //完成温度转换功能
75 1 DS18B20_Init(); //传感器初始化
76 1 delay_ms(1);
77 1 DS18B20_WriteByte(0xcc); //跳过读取序列号操作
78 1 DS18B20_WriteByte(0xbe); //发送读取温度指令
79 1 //然后等待转换完后发送读取温度命令
80 1 tml = DS18B20_ReadByte(); //读取温度值共16位,先读低字节
81 1 tmh = DS18B20_ReadByte(); //再读高字节
82 1 temp = tmh; //先存高字节,后面通过移位存储低字节
83 1 temp <<= 8;
84 1 temp |= tml;
85 1 return temp;
86 1 }
87
88
89 uint Temper_change()
90 {
91 1 uint temper;
92 1 float tp;
93 1 //temper=read_temper();
94 1 temper=DS18B20_ReadTemp();
95 1 if(temper<0) //考虑负温度的情况
96 1 {
97 2 temper=temper-1;
98 2 temper=~temper;
99 2 tp=temper*0.0625; //16位温度转换成10进制的温度
100 2 temper=tp*100+0.5; //留两个小数点,并四舍五入
101 2 }
102 1 else
103 1 {
104 2 tp=temper*0.0625; //16位温度转换成10进制的温度
105 2 temper=tp*100+0.5; //留两个小数点,并四舍五入
106 2 }
107 1 return temper;
108 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 307 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 7
IDATA SIZE = ---- ----
C51 COMPILER V9.56.0.0 DS18B20 04/30/2022 20:50:18 PAGE 3
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)