📄 temperature.lst
字号:
C51 COMPILER V8.02 TEMPERATURE 11/24/2008 15:05:18 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE TEMPERATURE
OBJECT MODULE PLACED IN Temperature.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Temperature.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h>
2 #include <absacc.h>
3
4 #define uchar unsigned char
5 #define uint unsigned int
6
7 uchar code table[]={
8 0x3f,0x06,0x5b,0x4f,
9 0x66,0x6d,0x7d,0x07,
10 0x7f,0x6f,0x77,0x7c,
11 0x39,0x5e,0x79,0x71};
12
13
14 sbit U138_A=P2^5;
15 sbit U138_B=P2^6;
16 sbit U138_C=P2^7;
17 sbit U138_G2=P2^4;
18
19 sbit wendu=P1^4;
20
21 uint f,g,init_success,temperature;
22
23 void Board_Init();
24
25 void Init_DS18B20(void);
26
27
28 void delay_18B20(uint i);
29 unsigned char ReadOneChar(void);
30 void WriteOneChar(uchar dat);
31
32 void LED_A_ENABLE();
33 void LED_B_ENABLE();
34 void LED_DISABLE();
35
36 void ReadTemperature(void);
37 void LED_DISPLAY(uint);
38
39 void main()
40 {
41 1 Board_Init();
42 1
43 1 TMOD=0x20; //定时器工作方式
44 1 TH1=0xfd; //采用定时器溢出方式设定波特率为9600
45 1 TL1=0xfd;
46 1 TR1=1;
47 1 REN=1;
48 1 SM0=0;
49 1 SM1=1;
50 1
51 1 while(1)
52 1 {
53 2 ReadTemperature();
54 2
55 2 LED_DISPLAY(temperature);
C51 COMPILER V8.02 TEMPERATURE 11/24/2008 15:05:18 PAGE 2
56 2
57 2 SBUF=temperature;
58 2 }
59 1
60 1
61 1
62 1 }
63
64 /*
65 * Board_Init - 初始化
66 */
67 void Board_Init()
68 {
69 1 /* 初始化IO口 */
70 1 P0 = 0xff;
71 1 P1 = 0xff;
72 1 P2 = 0xff;
73 1 P3 = 0xff;
74 1
75 1 //初始化数码管
76 1 P0=0x00;
77 1 LED_A_ENABLE();
78 1 LED_DISABLE();
79 1 LED_B_ENABLE();
80 1 LED_DISABLE();
81 1 P0 = 0xff;
82 1
83 1
84 1 }
85
86 void LED_A_ENABLE()
87 {
88 1
89 1 U138_A=1;
90 1 U138_B=0;
91 1 U138_C=0;
92 1 U138_G2=0;
93 1
94 1 }
95
96 void LED_B_ENABLE()
97 {
98 1
99 1 U138_A=0;
100 1 U138_B=0;
101 1 U138_C=0;
102 1 U138_G2=0;
103 1
104 1 }
105
106 void LED_DISABLE()
107 {
108 1 U138_A=1;
109 1 U138_B=1;
110 1 U138_C=1;
111 1 U138_G2=1;
112 1 }
113
114 void LED_DISPLAY(uint num)
115 {
116 1 if(num>99||num<0)
117 1 {
C51 COMPILER V8.02 TEMPERATURE 11/24/2008 15:05:18 PAGE 3
118 2 return;
119 2 }
120 1
121 1 f=num/10;
122 1 g=num-f*10;
123 1
124 1 P0=table[f];
125 1 LED_A_ENABLE();
126 1 LED_DISABLE();
127 1 P0=table[g];
128 1 LED_B_ENABLE();
129 1 LED_DISABLE();
130 1 }
131
132
133 /***********ds18b20延迟子函数(晶振11.0592MHz )*******/
134 void delay_18B20(uint i)
135 {
136 1 while(i--);
137 1 }
138 /**********ds18b20初始化函数**********************/
139 void Init_DS18B20(void)
140 {
141 1 temperature=0;
142 1 init_success=0;
143 1
144 1 wendu = 1; //wendu复位 ds18b20通信端口
145 1 delay_18B20(8); //稍做延时
146 1 wendu = 0; //单片机将wendu拉低
147 1 delay_18B20(80); //精确延时 大于 480us
148 1 wendu = 1; //拉高总线
149 1 delay_18B20(5); //延时15-60微秒后 如果x=0则初始化成功 x=1则初始化失败
150 1
151 1 if(wendu==0)
152 1 {
153 2 init_success=1;
154 2 }
155 1 else
156 1 {
157 2 init_success=0;
158 2
159 2 }
160 1
161 1 delay_18B20(20);
162 1 }
163 /***********ds18b20读一个字节**************/
164 unsigned char ReadOneChar(void)
165 {
166 1 uchar i=0;
167 1 uchar dat = 0;
168 1
169 1 for (i=8;i>0;i--)
170 1 {
171 2 wendu = 0; // 高电平拉成低电平时读周期开始
172 2 dat>>=1;
173 2 wendu = 1; // 给脉冲信号
174 2 if(wendu)
175 2 dat|=0x80; // | *
176 2 delay_18B20(4);
177 2 }
178 1 return(dat);
179 1 }
C51 COMPILER V8.02 TEMPERATURE 11/24/2008 15:05:18 PAGE 4
180 /*************ds18b20写一个字节****************/
181 void WriteOneChar(uchar dat)
182 {
183 1 unsigned char i=0;
184 1
185 1 for (i=8; i>0; i--)
186 1 {
187 2 wendu = 0; //从高电平拉至低电平时,写周期的开始
188 2 wendu = dat&0x01; //数据的最低位先写入
189 2 delay_18B20(5); //60us到120us延时
190 2 wendu = 1;
191 2 dat>>=1; //从最低位到最高位传入
192 2 }
193 1 }
194 /**************读取ds18b20当前温度************/
195 void ReadTemperature(void)
196 {
197 1 unsigned char r=0;
198 1 unsigned char s=0;
199 1
200 1 Init_DS18B20();
201 1
202 1 if(init_success==1)
203 1 {
204 2 WriteOneChar(0xCC); // 跳过读序号列号的操作
205 2 WriteOneChar(0x44); // 启动温度转换
206 2 delay_18B20(100); // this message is wery important
207 2 Init_DS18B20();
208 2 WriteOneChar(0xCC); //跳过读序号列号的操作
209 2 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
210 2 delay_18B20(100);
211 2 r=ReadOneChar(); //读取温度值低位
212 2 s=ReadOneChar(); //读取温度值高位
213 2 temperature=s<<4; //高8位中后四位数的值
214 2 temperature+=(r&0xf0)>>4; //低8位中的高4位值加上高8位中后四位数的值 temp1室温整数值
215 2
216 2 }
217 1
218 1 }
219
220
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 372 ----
CONSTANT SIZE = 16 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -