📄 dis18b20.lst
字号:
C51 COMPILER V8.09 DIS18B20 12/05/2008 12:05:20 PAGE 1
C51 COMPILER V8.09, COMPILATION OF MODULE DIS18B20
OBJECT MODULE PLACED IN DIS18B20.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DIS18B20.c OMF2 BROWSE DEBUG
line level source
1 #include<reg51.h>
2 #include<intrins.h>
3 #define uint unsigned int
4 #define uchar unsigned char
5 sbit DQ=P1^7 ;
6 uchar temper[]="0123456789";
7 //延时函数
8 void delay_18B20(int i)
9 {
10 1 while(i--);
11 1 }
12
13
14 void Init_18B20()
15 {
16 1 bit flag;//器件检测位
17 1 DQ=1; //这是在启动复位信号之前的的总线电平状态,可要可不要
18 1 delay_18B20(8); //稍做延时
19 1 DQ=0; //单片机将DQ拉低
20 1 delay_18B20(80); //主机发送的复位脉冲是480US~960us的低电平
21 1 DQ=1; //拉高总线
22 1 delay_18B20(14);//主机发出复位脉冲后就释放总线要15us~60us时间,等待接收
23 1 flag=DQ; //当flag为0,要维持60us~240us,即低电平的时候就说明主机收到了从机的应答信号,也就是有器件存在
-,可以发收或者接收数据了
24 1 delay_18B20(20);
25 1 while(flag)//高电平说明没有发现器件的存在
26 1 ;
27 1 }
28 void Write_18B20(uchar dat)
29 {
30 1 uchar i=0;
31 1 for (i=8; i>0; i--)
32 1 {
33 2 DQ=0;//写时序启动于数据总线低电平,写0和写1也一样的,数据位8位数据,有0也有1
34 2 DQ=dat&0x01;//取出最低位数据,可以是0或者1,放到总线
35 2 delay_18B20(5);//从低位开始送数据,可以写入0或者1,写入数据的第i位,只要维持60MS,就把数据写入
36 2 DQ=1;///写入一位数据就释放总线,准备写入下一位数据
37 2 delay_18B20(2);//在15us内释放总线
38 2 dat>>=1;
39 2 }
40 1 }
41 uint Read_18B20()
42 {
43 1 uchar i=0;
44 1 uchar dat=0;
45 1 for (i=8;i>0;i--)
46 1 {
47 2 DQ=0;//从从器件读数据也开始于主机拉低总线,起码维持1ms的低电平
48 2 dat>>=1;
49 2 delay_18B20(2);
50 2 DQ=1; //释放总线,等待从机返回数据
51 2 if(DQ)//如果从机发出1,那么总线维持高电平,否则为低电平
52 2 dat|=0x80;//如果从机发出的数据为1,那么接收到的也为1,否则为0
53 2 delay_18B20(4);
54 2 }
C51 COMPILER V8.09 DIS18B20 12/05/2008 12:05:20 PAGE 2
55 1 return dat;
56 1 }
57 uint ReadTemperature(void)
58 {
59 1 uchar tempL=0,tempH;
60 1 int temper_int=0;
61 1 float temper;
62 1 Init_18B20();
63 1 Write_18B20(0xCC); // 跳过读序号列号的操作
64 1 Write_18B20(0x44); // 启动温度转换
65 1 Init_18B20();
66 1 Write_18B20(0xCC); //跳过读序列号的操作
67 1 Write_18B20(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
68 1 tempL=Read_18B20();
69 1 tempH=Read_18B20();
70 1 temper=(tempL&0xf)*0.0625+(((tempH&0x7)<<4)|((tempL&0xf0)>>4));
71 1 temper_int=(uint)(temper*100);//放大100倍
72 1 return(temper_int);
73 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 261 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 11 6
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
EDATA SIZE = ---- ----
HDATA SIZE = ---- ----
XDATA CONST SIZE = ---- ----
FAR CONST SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -