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