📄 ds18b20_pwm.lst
字号:
C51 COMPILER V8.02 DS18B20_PWM 06/25/2010 17:30:16 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE DS18B20_PWM
OBJECT MODULE PLACED IN ds18b20_pwm.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ds18b20_pwm.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg51.h>
2 #include "intrins.h"
3
4
5 #define uchar unsigned char
6 #define uint unsigned int
7 void keyscan();
8 void delay20ms(void);
9
10
11 sbit DQ=P3^3;//ds18b20与单片机连接口
12 sbit RS=P2^0;
13 sbit RW=P2^1;
14 sbit EN=P2^2;
15
16 unsigned char code str1[]={"D/C: % T: 3S "};
17 unsigned char code str2[]={"t C Set:50C"};
18
19
20 uchar data disdata[5];
21 uint tvalue;//温度值
22 uchar tflag;//温度正负标志
23 //uint Tset=60; //设置周期
24
25 sbit Light = P2^3; //控制LED显示
26 sbit key = P1^0; //调整设置温度加
27 sbit key2 = P1^1; //调整设置温度减
28 sbit key3 = P1^2; //调整周期加,步进20
29 sbit key4 = P1^3; //调整周期减,步进20
30 int SetTemp=50; //温度初始值
31 unsigned long int Tset=60; //设置周期
32 int temp=0; //温度中间变量
33 uint count1=0;
34
35 unsigned long int count=0; //计数器
36
37
38
39
40 /*************************lcd1602程序**************************/
41 void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
42 {unsigned int i,j;
43 1 for(i=0;i<ms;i++)
44 1 for(j=0;j<100;j++);
45 1 }
46
47 void Write_Com(unsigned char com)//写指令//
48 { delay1ms(1);
49 1 RS=0;
50 1 RW=0;
51 1 EN=0;
52 1 P0=com;
53 1 delay1ms(1);
54 1 EN=1;
55 1 delay1ms(1);
C51 COMPILER V8.02 DS18B20_PWM 06/25/2010 17:30:16 PAGE 2
56 1 EN=0;
57 1 }
58
59 void Write_Dat(unsigned char dat)//写数据//
60 { delay1ms(1);;
61 1 RS=1;
62 1 RW=0;
63 1 EN=0;
64 1 P0=dat;
65 1 delay1ms(1);
66 1 EN=1;
67 1 delay1ms(1);
68 1 EN=0;
69 1 }
70
71 void lcd_init()//初始化设置//
72 {delay1ms(15);
73 1 Write_Com(0x38);delay1ms(5);
74 1 Write_Com(0x08);delay1ms(5);
75 1 Write_Com(0x01);delay1ms(5);
76 1 Write_Com(0x06);delay1ms(5);
77 1 Write_Com(0x0c);delay1ms(5);
78 1 }
79
80
81 void display(unsigned char *p)//显示//
82 {
83 1 while(*p!='\0')
84 1 {
85 2 Write_Dat(*p);
86 2 p++;
87 2 delay1ms(1);
88 2 }
89 1 }
90
91 init_play()//初始化显示
92 { lcd_init();
93 1 Write_Com(0x80);
94 1 display(str1);
95 1 Write_Com(0xc0);
96 1 display(str2);
97 1 }
98
99 /******************************ds1820程序***************************************/
100 void delay_18B20(unsigned int i)//延时1微秒
101 {
102 1 while(i--);
103 1 }
104
105 void ds1820rst()/*ds1820复位*/
106 { unsigned char x=0;
107 1 DQ = 1; //DQ复位
108 1 delay_18B20(4); //延时
109 1 DQ = 0; //DQ拉低
110 1 delay_18B20(100); //精确延时大于480us
111 1 DQ = 1; //拉高
112 1 delay_18B20(40);
113 1 }
114
115 uchar ds1820rd()/*读数据*/
116 { unsigned char i=0;
117 1 unsigned char dat = 0;
C51 COMPILER V8.02 DS18B20_PWM 06/25/2010 17:30:16 PAGE 3
118 1 for (i=8;i>0;i--)
119 1 { DQ = 0; //给脉冲信号
120 2 dat>>=1;
121 2 DQ = 1; //给脉冲信号
122 2 if(DQ)
123 2 dat|=0x80;
124 2 delay_18B20(10);
125 2 }
126 1 return(dat);
127 1 }
128
129 void ds1820wr(uchar wdata)/*写数据*/
130 {unsigned char i=0;
131 1 for (i=8; i>0; i--)
132 1 { DQ = 0;
133 2 DQ = wdata&0x01;
134 2 delay_18B20(10);
135 2 DQ = 1;
136 2 wdata>>=1;
137 2 }
138 1 }
139
140
141
142 read_temp()/*读取温度值并转换*/
143 {uchar a,b;
144 1 ds1820rst();
145 1 ds1820wr(0xcc);//*跳过读序列号*/
146 1 ds1820wr(0x44);//*启动温度转换*/
147 1 ds1820rst();
148 1 ds1820wr(0xcc);//*跳过读序列号*/
149 1 ds1820wr(0xbe);//*读取温度*/
150 1 a=ds1820rd();
151 1 b=ds1820rd();
152 1 tvalue=b;
153 1 tvalue<<=8;
154 1 tvalue=tvalue|a;
155 1 if(tvalue<0x0fff)
156 1 tflag=0;
157 1 else
158 1 {tvalue=~tvalue+1;
159 2 tflag=1;
160 2 }
161 1 tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
162 1 temp=tvalue/10;
163 1 return(tvalue);
164 1 }
165
166 /*******************************************************************/
167 void ds1820disp()//温度值显示
168 { uchar flagdat;
169 1
170 1 disdata[0]=tvalue/1000+0x30;//百位数
171 1 disdata[1]=tvalue%1000/100+0x30;//十位数
172 1 disdata[2]=tvalue%100/10+0x30;//个位数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -