📄 ds18b20-shuma-c51.lst
字号:
C51 COMPILER V7.20 DS18B20_SHUMA_C51 10/24/2008 06:26:44 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE DS18B20_SHUMA_C51
OBJECT MODULE PLACED IN DS18B20-SHUMA-C51.OBJ
COMPILER INVOKED BY: C:\Program Files\keil\C51\BIN\C51.EXE DS18B20-SHUMA-C51.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /**********************************************************
2
3 DS18B20温度采集系统
4
5 通过DD18B20读取温度,数码管显示温度值,并由串口
6 传送到上位机,上位机显示当前温度,画出温度曲线
7
8 **********************************************************/
9
10 #include <regx51.h>
11
12 #define XTAL 11059200 // CUP 晶振频率
13 #define baudrate 9600 // 通信波特率
14
15 #define uchar unsigned char
16 #define uint unsigned int
17
18 sbit DQ = P3^3; // 定义DS18B20端口DQ
19 sbit BEEP = P3^7;
20
21 unsigned char presence ;
22
23 unsigned char code LEDData[ ] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
24 0x80,0x90,0xff};
25 unsigned char data temp_data[2] = {0x00,0x00};
26 unsigned char data display[5] = {0x00,0x00,0x00,0x00,0x00};
27 unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
28 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
29 void beep();
30 sbit DIN = P0^7; // 小数点
31 bit flash=0; // 显示开关标记
32
33 /**********************************************************/
34 void Delay(unsigned int num)// 延时函数
35 {
36 1 while( --num );
37 1 }
38
39 /**********************************************************/
40 uchar Init_DS18B20(void) // 初始化ds1820
41 {
42 1
43 1 DQ = 1; // DQ复位
44 1 Delay(8); // 稍做延时
45 1
46 1 DQ = 0; // 单片机将DQ拉低
47 1 Delay(90); // 精确延时 大于 480us
48 1
49 1 DQ = 1; // 拉高总线
50 1 Delay(8);
51 1
52 1 presence = DQ; // 如果=0则初始化成功 =1则初始化失败
53 1 Delay(100);
54 1 DQ = 1;
55 1
C51 COMPILER V7.20 DS18B20_SHUMA_C51 10/24/2008 06:26:44 PAGE 2
56 1 return(presence); // 返回信号,0=presence,1= no presence
57 1 }
58 /**********************************************************/
59 uchar ReadOneChar(void) // 读一个字节
60 {
61 1 unsigned char i = 0;
62 1 unsigned char dat = 0;
63 1
64 1 for (i = 8; i > 0; i--)
65 1 {
66 2 DQ = 0; // 给脉冲信号
67 2 dat >>= 1;
68 2 DQ = 1; // 给脉冲信号
69 2
70 2 if(DQ)
71 2 dat |= 0x80;
72 2 Delay(4);
73 2 }
74 1
75 1 return (dat);
76 1 }
77
78 /**********************************************************/
79 void WriteOneChar(unsigned char dat)// 写一个字节
80 {
81 1 unsigned char i = 0;
82 1
83 1 for (i = 8; i > 0; i--)
84 1 {
85 2 DQ = 0;
86 2 DQ = dat&0x01;
87 2 Delay(5);
88 2
89 2 DQ = 1;
90 2 dat>>=1;
91 2 }
92 1 }
93
94 /*********************************************************/
95 void Read_Temperature(void)// 读取温度
96 {
97 1 Init_DS18B20();
98 1
99 1 if(presence==1)
100 1 {
101 2 beep();
102 2 flash=1;
103 2 } // DS18B20不正常,蜂鸣器报警
104 1 else
105 1 {
106 2 flash=0;
107 2 WriteOneChar(0xCC); // 跳过读序号列号的操作
108 2 WriteOneChar(0x44); // 启动温度转换
109 2
110 2 Init_DS18B20();
111 2 WriteOneChar(0xCC); // 跳过读序号列号的操作
112 2 WriteOneChar(0xBE); // 读取温度寄存器
113 2
114 2 temp_data[0] = ReadOneChar(); // 温度低8位
115 2 temp_data[1] = ReadOneChar(); // 温度高8位
116 2 }
117 1 }
C51 COMPILER V7.20 DS18B20_SHUMA_C51 10/24/2008 06:26:44 PAGE 3
118
119 /*********************************************************/
120 void Disp_Temperature()// 显示温度
121 {
122 1 unsigned char n=0;
123 1
124 1 display[4]=temp_data[0]&0x0f;
125 1 display[0]=ditab[display[4]]; // 查表得小数位的值
126 1
127 1 display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
128 1 display[3]=display[4]/100;
129 1 display[1]=display[4]%100;
130 1 display[2]=display[1]/10;
131 1 display[1]=display[1]%10;
132 1
133 1 if(!display[3]) // 高位为0,不显示
134 1 {
135 2 display[3]=0x0a;
136 2 if(!display[2]) // 次高位为0,不显示
137 2 display[2]=0x0a;
138 2 }
139 1
140 1 P0 = 0xc6; // 显示 C
141 1 P2 = 0x7f;
142 1 Delay(300);
143 1
144 1 P0 = 0x9c; // 显示 °
145 1 P2 = 0xbf;
146 1 Delay(300);
147 1
148 1 P0 =LEDData[display[0]] ; // 显示小数位
149 1 P2 = 0xdf;
150 1 Delay(300);
151 1
152 1 P0 =LEDData[display[1]]; // 显示个位
153 1 DIN = 0;
154 1 P2 = 0xef;
155 1 Delay(300);
156 1
157 1 P0 =LEDData[display[2]]; // 显示十位
158 1 P2 = 0xf7;
159 1 Delay(300);
160 1
161 1 P0 =LEDData[display[3]]; // 显示十位
162 1 P2 = 0xfb;
163 1 Delay(300);
164 1
165 1 P2 = 0xff; // 关闭显示
166 1 }
167
168 /*********************************************************/
169 void beep(void)
170 {
171 1 unsigned char i;
172 1 for (i=0;i<100;i++)
173 1 {
174 2 Delay(60);
175 2 BEEP=!BEEP; // BEEP取反
176 2 }
177 1 BEEP=1; // 关闭蜂鸣器
178 1 }
179
C51 COMPILER V7.20 DS18B20_SHUMA_C51 10/24/2008 06:26:44 PAGE 4
180 /*********************************************************/
181 void init(void)
182 {
183 1 EA = 1; // "中断总允许"
184 1
185 1 TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
186 1
187 1 TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
188 1 TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate))); // 定时器0赋初值
189 1
190 1 SCON = 0x50; // 设定串行口工作方式
191 1 PCON &= 0x00; // 波特率不倍增
192 1
193 1 TR1 = 1; // 启动定时器1
194 1 IE = 0x00; // 禁止任何中断
195 1 }
196
197 /*********************************************************/
198 void send_char(void)
199 // 传送十六位的温度数据,低位在前
200 {
201 1 unsigned i=0;
202 1
203 1 while (i < 2)
204 1 {
205 2 SBUF = temp_data[i];
206 2 while (!TI); // 等特数据传送
207 2 TI = 0; // 清除数据传送标志
208 2 i++;
209 2 }
210 1 }
211
212 /*********************************************************/
213 void main(void)
214 {
215 1 uchar receive;
216 1
217 1 init();
218 1
219 1 while(1)
220 1 {
221 2 Read_Temperature(); // 读取温度
222 2
223 2 if (flash==0)
224 2 {
225 3 Disp_Temperature(); // 显示温度
226 3 }
227 2 else
228 2 {
229 3 P2 = 0xff ; // DS18B20不正常,关闭显示
230 3 }
231 2
232 2 if (RI) // 是否有数据到来
233 2 {
234 3 RI = 0;
235 3 receive = SBUF;
236 3
237 3 if (receive == 's') // 是否开始采集温度
238 3 {
239 4 send_char(); // 传送采集的温度
240 4 }
241 3 }
C51 COMPILER V7.20 DS18B20_SHUMA_C51 10/24/2008 06:26:44 PAGE 5
242 2 }
243 1 }
244
245 /*********************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 415 ----
CONSTANT SIZE = 27 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 1
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -