📄 18b20.lst
字号:
C51 COMPILER V7.06 18B20 12/03/2011 22:07:49 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 18B20
OBJECT MODULE PLACED IN 18b20.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 18b20.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*-----------------------------------------------
2 名称:18B20温度传感器
3 日期:2009.5
4 修改:无
5 内容:18B20单线温度检测的应用样例程序,请将18b20插紧,
6 然后在数码管可以显示XX.XC,C表示摄氏度,如显示25.3C表示当前温度25.3度
7 ------------------------------------------------*/
8 #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
9 #include<math.h>
10 #include<INTRINS.H>
11
12 #define uchar unsigned char
13 #define uint unsigned int;
14 /******************************************************************/
15 /* 定义端口 */
16 /******************************************************************/
17 sbit seg1=P2^0;
18 sbit seg2=P2^1;
19 sbit seg3=P2^2;
20 sbit DQ=P3^7;//ds18b20 端口
21 sfr dataled=0x80;//显示数据端口
22 /******************************************************************/
23 /* 全局变量 */
24 /******************************************************************/
25 uint temp;
26 uchar flag_get,count,num,minute,second;
27 uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
28 //7段数码管段码表共阳
29 uchar str[6];
30 /******************************************************************/
31 /* 函数声明 */
32 /******************************************************************/
33 void delay1(uchar MS);
34 unsigned int ReadTemperature(void);
35 void Init_DS18B20(void);
36 unsigned char ReadOneChar(void);
37 void WriteOneChar(unsigned char dat);
38 void delay(unsigned int i);
39 /******************************************************************/
40 /* 主函数 */
41 /******************************************************************/
42 main()
43 {
44 1 unsigned char TempH,TempL;
45 1 TMOD|=0x01;//定时器设置
46 1 TH0=0xef;
47 1 TL0=0xf0;
48 1 IE=0x82;
49 1 TR0=1;
50 1 P2=0x00;
51 1 count=0;
52 1 while(1)
53 1 {
54 2 str[5]=0x39; //显示C符号
55 2 str[1]=tab[TempH/100]; //十位温度
C51 COMPILER V7.06 18B20 12/03/2011 22:07:49 PAGE 2
56 2 str[2]=tab[(TempH%100)/10]; //十位温度
57 2 str[3]=tab[(TempH%100)%10]|0x80; //个位温度,带小数点
58 2 str[4]=tab[TempL];
59 2 if(flag_get==1) //定时读取当前温度
60 2 {
61 3 temp=ReadTemperature();
62 3 if(temp&0x8000)
63 3 {
64 4 str[0]=0x40;//负号标志
65 4 temp=~temp; // 取反加1
66 4 temp +=1;
67 4 }
68 3 else
69 3 str[0]=0;
70 3 TempH=temp>>4;
71 3 TempL=temp&0x0F;
72 3 TempL=TempL*6/10;//小数近似处理
73 3 flag_get=0;
74 3 }
75 2 }
76 1 }
77
78
79 /******************************************************************/
80 /* 定时器中断 */
81 /******************************************************************/
82 void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔
83 {
84 1 TH0=0xef;//定时器重装值
85 1 TL0=0xf0;
86 1 num++;
87 1 if (num==50)
88 1 {num=0;
89 2 flag_get=1;//标志位有效
90 2 second++;
91 2 if(second>=60)
92 2 {second=0;
93 3 minute++;
94 3 }
95 2 }
96 1 count++;
97 1 if(count==1)
98 1 {P2=0;
99 2 dataled=str[0];}//数码管扫描
100 1 if(count==2)
101 1 {P2=1;
102 2 dataled=str[1];}
103 1 if(count==3)
104 1 { P2=2;
105 2 dataled=str[2];
106 2 }
107 1 if(count==4)
108 1 { P2=3;
109 2 dataled=str[3];
110 2 }
111 1 if(count==5)
112 1 { P2=4;
113 2 dataled=str[4];
114 2 }
115 1 if(count==6)
116 1 { P2=5;
117 2 dataled=str[5];
C51 COMPILER V7.06 18B20 12/03/2011 22:07:49 PAGE 3
118 2 count=0;}
119 1 }
120 /******************************************************************/
121 /* 延时函数 */
122 /******************************************************************/
123 void delay(unsigned int i)//延时函数
124 {
125 1 while(i--);
126 1 }
127 /******************************************************************/
128 /* 初始化 */
129 /******************************************************************/
130 void Init_DS18B20(void)
131 {
132 1 unsigned char x=0;
133 1 DQ = 1; //DQ复位
134 1 delay(8); //稍做延时
135 1 DQ = 0; //单片机将DQ拉低
136 1 delay(80); //精确延时 大于 480us
137 1 DQ = 1; //拉高总线
138 1 delay(10);
139 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
140 1 delay(5);
141 1 }
142
143 /******************************************************************/
144 /* 读一个字节 */
145 /******************************************************************/
146 unsigned char ReadOneChar(void)
147 {
148 1 unsigned char i=0;
149 1 unsigned char dat = 0;
150 1 for (i=8;i>0;i--)
151 1 {
152 2 DQ = 0; // 给脉冲信号
153 2 dat>>=1;
154 2 DQ = 1; // 给脉冲信号
155 2 if(DQ)
156 2 dat|=0x80;
157 2 delay(5);
158 2 }
159 1 return(dat);
160 1 }
161
162 /******************************************************************/
163 /* 写一个字节 */
164 /******************************************************************/
165 void WriteOneChar(unsigned char dat)
166 {
167 1 unsigned char i=0;
168 1 for (i=8; i>0; i--)
169 1 {
170 2 DQ = 0;
171 2 DQ = dat&0x01;
172 2 delay(5);
173 2 DQ = 1;
174 2 dat>>=1;
175 2 }
176 1 delay(5);
177 1 }
178
179 /******************************************************************/
C51 COMPILER V7.06 18B20 12/03/2011 22:07:49 PAGE 4
180 /* 读取温度 */
181 /******************************************************************/
182 unsigned int ReadTemperature(void)
183 {
184 1 unsigned char a=0;
185 1 unsigned int b=0;
186 1 unsigned int t=0;
187 1 Init_DS18B20();
188 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
189 1 WriteOneChar(0x44); // 启动温度转换
190 1 delay(200);
191 1 Init_DS18B20();
192 1 WriteOneChar(0xCC); //跳过读序号列号的操作
193 1 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
194 1 a=ReadOneChar(); //低位
195 1 b=ReadOneChar(); //高位
196 1
197 1 b<<=8;
198 1 t=a+b;
199 1
200 1 return(t);
201 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 425 ----
CONSTANT SIZE = 10 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 13 2
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 + -