📄 ds18b20.lst
字号:
C51 COMPILER V6.12 DS18B20 12/30/2006 17:59:02 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN .\Ds18B20.OBJ
COMPILER INVOKED BY: F:\KeilC51\C51\BIN\C51.EXE .\Ds18B20.c DEBUG OBJECTEXTEND
stmt level source
1 /*---------------------------------------------------------------------------------------------------
2 功能:实现对DS18B20的读取+四位数码管动态显示
3 原理:单总线协议
4 注意:单总线协议对延时要求比较严格,此程序中采用的是11.0592M的晶振
5 版本:1.0
6 最后修改时间:2006年12月30日
7 ====================================================================================================*/
8 #include <AT89X51.H>
9
10 //声明
11 unsigned char LedT0;
12 unsigned char Led1;
13 unsigned char Led2;
14 unsigned char Led3;
15 unsigned char Led4;
16
17 const unsigned char table[18]={0x28,0xEB,0x32,0xA2,0xE1,0xA4,0x24,0xEA,0x20,0xA0,0x60,0x25,0x3c,0x23,0x34,
-0x74,0xF7,0xFF};
18
19
20 sbit DQ =P2^2; //定义通信端口
21
22 //延时函数
23 void delay(unsigned int i)
24 {
25 1 while(i--);
26 1 }
27
28 //初始化函数
29 Init_DS18B20(void)
30 {
31 1 unsigned char x=0;
32 1 DQ = 1; //DQ复位
33 1 delay(8); //稍做延时
34 1 DQ = 0; //单片机将DQ拉低
35 1 delay(80); //精确延时 大于 480us
36 1 DQ = 1; //拉高总线
37 1 delay(14);
38 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
39 1 delay(20);
40 1 }
41
42 //读一个字节
43 ReadOneChar(void)
44 {
45 1 unsigned char i=0;
46 1 unsigned char dat = 0;
47 1 for (i=8;i>0;i--)
48 1 {
49 2 DQ = 0; // 给脉冲信号
50 2 dat>>=1;
51 2 DQ = 1; // 给脉冲信号
52 2 if(DQ)
53 2 dat|=0x80;
54 2 delay(4);
C51 COMPILER V6.12 DS18B20 12/30/2006 17:59:02 PAGE 2
55 2 }
56 1 return(dat);
57 1 }
58
59 //写一个字节
60 WriteOneChar(unsigned char dat)
61 {
62 1 unsigned char i=0;
63 1 for (i=8; i>0; i--)
64 1 {
65 2 DQ = 0;
66 2 DQ = dat&0x01;
67 2 delay(5);
68 2 DQ = 1;
69 2 dat>>=1;
70 2 }
71 1 //delay(4);
72 1 }
73
74 //读取温度
75 ReadTemperature(void)
76 {
77 1 unsigned char a=0;
78 1 unsigned char b=0;
79 1 unsigned int t=0;
80 1 float tt=0;
81 1 Init_DS18B20();
82 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
83 1 WriteOneChar(0x44); // 启动温度转换
84 1 Init_DS18B20();
85 1 WriteOneChar(0xCC); //跳过读序号列号的操作
86 1 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
87 1 a=ReadOneChar(); //高8位
88 1 b=ReadOneChar(); //低8位
89 1 t=b;
90 1 t<<=8;
91 1 t=t|a; //合成一个16位
92 1 tt=t;
93 1 return(tt);
94 1 }
95
96 //显示中断
97 void int1() interrupt 1 using 1
98 {
99 1 TF0 = 0; //清定时0中断标志
100 1 TH0 = 0xF6; //2.5MS
101 1 TL0 = 0x3D;
102 1
103 1 P2 |= 0xF0; //对P2口的高四位置1,关数码管
104 1
105 1 switch(LedT0)
106 1 { case 0:
107 2 P0 = table[Led1];
108 2 P2_4 = 0;
109 2 LedT0 = 1;
110 2 break;
111 2 case 1:
112 2 P0 = table[Led2];
113 2 P2_5 = 0;
114 2 LedT0 = 2;
115 2 break;
116 2 case 2:
C51 COMPILER V6.12 DS18B20 12/30/2006 17:59:02 PAGE 3
117 2 P0 = table[Led3];
118 2 P2_6 = 0;
119 2 LedT0 = 3;
120 2 break;
121 2 case 3:
122 2 P0 = table[Led4];
123 2 P2_7 = 0;
124 2 LedT0 = 0;
125 2 break;
126 2 default://语句d
127 2 LedT0 = 0;
128 2 break;
129 2 }
130 1 }
131
132 main()
133 {
134 1 unsigned char i=0;
135 1 float tt=0;
136 1 unsigned int t=0;
137 1 TMOD = 0x01; //设定T0为十六位定时模式。
138 1 TH0 = 0xF6;
139 1 TL0 = 0x3D; //2MS
140 1 TR0 = 1; //开定时器0
141 1 ET0 = 1; //致能定时0中断
142 1 TF0 = 0; //清定时0中断标志
143 1 EA = 1; //开总中断
144 1
145 1 LedT0 = 0;
146 1
147 1 Led1 = 1;
148 1 Led2 = 2;
149 1 Led3 = 3;
150 1 Led4 = 4;
151 1
152 1 while(1)
153 1 {
154 2 t=ReadTemperature();//读温度
155 2 if(tt!=t*0.0625*100)
156 2 {
157 3 tt=t*0.0625*100;
158 3 Led1=tt/1000;
159 3 tt=tt-Led1*1000;
160 3 Led2=tt/100;
161 3 tt=tt-Led2*100;
162 3 Led3=tt/10;
163 3 tt=tt-Led3*10;
164 3 Led4=tt/1;
165 3 }
166 2 }
167 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 650 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 23 13
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILER V6.12 DS18B20 12/30/2006 17:59:02 PAGE 4
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -