📄 ds18b20_pwm.lst
字号:
174 1
175 1 disdata[0]=tvalue/1000+0x30;//百位数
176 1 disdata[1]=tvalue%1000/100+0x30;//十位数
177 1 disdata[2]=tvalue%100/10+0x30;//个位数
178 1 disdata[3]=tvalue%10+0x30;//小数位
179 1
C51 COMPILER V8.02 DS18B20_PWM 01/02/2003 13:13:40 PAGE 4
180 1 if(tflag==0)
181 1 flagdat=0x20;//正温度不显示符号
182 1 else
183 1 flagdat=0x2d;//负温度显示负号:-
184 1
185 1 if(disdata[0]==0x30)
186 1 {disdata[0]=0x20;//如果百位为0,不显示
187 2 if(disdata[1]==0x30)
188 2 {disdata[1]=0x20;//如果百位为0,十位为0也不显示
189 3 }
190 2 }
191 1
192 1 Write_Com(0xCa);
193 1 Write_Dat(Tset/2000+0x30);//显示周期百位 Tset/20/100+0x30
194 1
195 1 Write_Com(0xCb);
196 1 Write_Dat(Tset/200%10+0x30);//显示周期十位 Tset/20/10%10+0x30
197 1
198 1 Write_Com(0xCc);
199 1 Write_Dat(Tset/20%10+0x30);//显示周期个位 Tset/20%10+0x30
200 1
201 1 Write_Com(0x81);
202 1 Write_Dat(flagdat);//显示符号位
203 1 Write_Com(0x82);
204 1 Write_Dat(disdata[0]);//显示百位
205 1 Write_Com(0x83);
206 1 Write_Dat(disdata[1]);//显示十位
207 1 Write_Com(0x84);
208 1 Write_Dat(disdata[2]);//显示个位
209 1 Write_Com(0x85);
210 1 Write_Dat(0x2e);//显示小数点
211 1 Write_Com(0x86);
212 1 Write_Dat(disdata[3]);//显示小数位
213 1
214 1
215 1 Write_Com(0x8d);
216 1 Write_Dat(SetTemp/10+0x30); //显示设置温度十位
217 1 Write_Com(0x8e);
218 1 Write_Dat(SetTemp%10+0x30); //显示设置温度各位
219 1 Write_Com(0x8f);
220 1 Write_Dat('C');
221 1
222 1
223 1 }
224
225
226 void TO_Service (void) interrupt 1 using 3
227 {
228 1 TH0 = 0x3C; //重装设置初值50MS
229 1 TL0 = 0x0B0;
230 1 if(count==Tset) {count = 0;}
231 1 count++;
232 1 if(count<=Tset/20*(SetTemp-temp)) Light=0; //小于高电平的次数灯亮
233 1 else Light=1;
234 1 }
235 void initTO(void)
236 {
237 1 TMOD=0X11;
238 1 EA=1;
239 1 ET0=0;
240 1 TH0 = 0x3C;
241 1 TL0 = 0x0B0;
C51 COMPILER V8.02 DS18B20_PWM 01/02/2003 13:13:40 PAGE 5
242 1 TH1 = 0x3C;
243 1 TL1 = 0x0B0;
244 1 ET1 = 1;
245 1 TR1 = 1;
246 1 TR0=0;
247 1
248 1 }
249
250
251
252 void Timer1Interrupt(void) interrupt 3
253 {
254 1 TH1 = 0x3C;
255 1 TL1 = 0x0B0;
256 1 if(count1==10) {count1=0;read_temp();} //0.5S读一次温度
257 1 count1++;
258 1 // keyscan();
259 1
260 1
261 1 }
262
263 void delay20ms(void) //误差 0us
264 {
265 1 unsigned char a,b;
266 1 for(b=215;b>0;b--)
267 1 for(a=45;a>0;a--);
268 1 _nop_; //if Keil,require use intrins.h
*** WARNING C275 IN LINE 268 OF DS18B20_PWM.C: expression with possibly no effect
269 1 _nop_; //if Keil,require use intrins.h
*** WARNING C275 IN LINE 269 OF DS18B20_PWM.C: expression with possibly no effect
270 1 }
271 void keyscan()
272 {
273 1 if(key==0||key2==0||key3==0)
274 1 delay20ms();
275 1 {
276 2 if(key==0)
277 2 {SetTemp++;
278 3 Disp();
279 3 if(SetTemp==100) SetTemp=0;
280 3 }
281 2 if(key2==0)
282 2 {SetTemp--;
283 3 Disp();
284 3 if(SetTemp==-1) SetTemp=99;
285 3
286 3 }
287 2 if(key3==0)
288 2 {
289 3 Tset+=20;count=0;//count必须清零,否则中断里的count不知道加到多少,造成紊乱
290 3 Disp();
291 3 if(Tset==20000) Tset=20;
292 3 }
293 2 if(key4==0)
294 2 {
295 3 if(Tset==20) Tset=20000;
296 3 Tset-=20;count=0;//count必须清零,否则中断里的count不知道加到多少,造成紊乱
297 3 Disp();
298 3
299 3
300 3 }
301 2 }
C51 COMPILER V8.02 DS18B20_PWM 01/02/2003 13:13:40 PAGE 6
302 1 }
303
304 /********************主程序***********************************/
305 void main()
306 { init_play();//初始化显示
307 1
308 1 initTO(); //TO初始化
309 1 while(1)
310 1 { keyscan();
311 2 Disp();//显示
312 2 if((SetTemp-20)>0){
313 3 if(temp>=SetTemp) {ET0=0;Light=1;
314 4 Write_Com(0xC4);Write_Dat('0');
315 4 Write_Com(0xC5);Write_Dat('0');
316 4 Write_Com(0xC6);Write_Dat('*');
317 4 } //如果温度值大于等于50度,灯灭
318 3 if(temp>(SetTemp-20)&&temp<SetTemp) {TR0=1;ET0=1;
319 4 Write_Com(0xC4);Write_Dat(((SetTemp-temp)*100/20)/10+0x30);
320 4 Write_Com(0xC5);Write_Dat(((SetTemp-temp)*100/20)%10+0x30);
321 4 Write_Com(0xC6);Write_Dat('%');} //如果温度值在30和50度之间,开中断,输出PWM波,显示占空比
322 3 if(temp<=SetTemp-20) {ET0=0;Light=0;
323 4 Write_Com(0xC4);Write_Dat('0');
324 4 Write_Com(0xC5);Write_Dat('1');
325 4 Write_Com(0xC6);Write_Dat('*');}// 如果温度值小于30度,关中断,灯亮
326 3 }
327 2 if ((SetTemp-20)<=0){ET0=0;Light=1;
328 3 Write_Com(0xC5);Write_Dat('0');
329 3 Write_Com(0xC6);Write_Dat('*');}//如果设置温度小于当前温度,占空比显示00*
330 2 }
331 1 }
332
333
334
335
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1514 ----
CONSTANT SIZE = 34 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 22 5
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 2 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -