📄 18b20
字号:
C51 COMPILER V9.00 VV 11/20/2012 17:43:09 PAGE 1
C51 COMPILER V9.00, COMPILATION OF MODULE VV
OBJECT MODULE PLACED IN vv.OBJ
COMPILER INVOKED BY: F:\学习软件\keil uvision4\C51\BIN\C51.EXE vv.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h>
2 #include<stdio.h>
3 #define uchar unsigned char
4 #define uint unsigned int
5 sbit ds=P2^2; //温度传感器信号线
6 sbit beep=P2^3; //蜂鸣器
7 sbit dula=P2^6; //数码管段选线
8 sbit wela=P2^7; //数码管位选线
9
10
11 uint temp; //定义整型的温度数据
12 float ftemp; //定义浮点型的温度数据
13 uint warnl1=270;
14 uint warnl2=250;
15 uint warnh1=300;
16 uint warnh2=320;
17 sbit led0=P1^0;
18 sbit led1=P1^1;
19 sbit led2=P1^2;
20 sbit led3=P1^3;
21 uchar code table[]=
22 {
23 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
24 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef
25 //不带小数点的0~9位编码
26 };
27
28 void delay(uint t) //延时函数
29 {
30 1 uint i,j;
31 1 for(i=t;i>0;i--)
32 1 for(j=110;j>0;j--);
33 1 }
34 void dsreset(void)//DS18B20复位,初始化函数
35 {
36 1 uint i;
37 1 ds=1;
38 1 ds=0;
39 1 i=100;
40 1 while(i>0)i--;
41 1 ds=1;
42 1 i=6;
43 1 while(i>0)i--;
44 1 }
45
46 bit tempreadbit(void)//读1位数据函数
47 {
48 1 uint i;
49 1 bit dat;
50 1 ds=0;i++;
51 1 ds=1;i++;i++; //i++起延时作用
52 1 dat=ds;
53 1 i=8;while(i>0)i--;
54 1 return(dat);
55 1 }
C51 COMPILER V9.00 VV 11/20/2012 17:43:09 PAGE 2
56 uchar tempread(void)// 读1个字节数据函数
57 {
58 1 uchar i,j,dat;
59 1 dat=0;
60 1 for(i=1;i<=8;i++)
61 1 {
62 2 j=tempreadbit();
63 2 dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在dat里
64 2 }
65 1 return(dat);
66 1 }
67 void tempwritebyte(uchar dat) //向DS18B20写一个字节数据函数
68 {
69 1 uint i;
70 1 uchar j;
71 1 bit testb;
72 1 for(j=1;j<=8;j++)
73 1 {
74 2 testb=dat&0x01;
75 2 dat=dat>>1;
76 2 if(testb) //写1
77 2 {
78 3 ds=0;
79 3 i++;i++;
80 3 ds=1;
81 3 i=8;while(i>0)i--;
82 3
83 3 }
84 2 else
85 2 {
86 3 ds=0; //写0
87 3 i=8;while(i>0)i--;
88 3 ds=1;
89 3 i++;i++;
90 3 }
91 2 }
92 1 }
93
94 void tempchange(void) //DS18B20开始获取温度并开始转换
95 {
96 1 dsreset();
97 1 delay(1);
98 1 tempwritebyte(0xcc); //写跳过读ROM指令
99 1 tempwritebyte(0x44); //写温度转换指令
100 1
101 1 }
102 uint get_temp() //读取寄存器中存储的温度数据
103 {
104 1 uchar a,b;
105 1 dsreset();
106 1 delay(1);
107 1 tempwritebyte(0xcc);
108 1 tempwritebyte(0xbe);
109 1 a=tempread(); //读低8位
110 1 b=tempread(); //读高8位
111 1 temp=b;
112 1 temp<<=8; //两个字节组合为1个字节
113 1 temp=temp|a;
114 1 ftemp=temp*0.0625;//温度在寄存器中为12位,分辨率为0.0625
115 1 temp=ftemp*10+0.5;//乘以10表示小数点后面只取1位,加0.5是四舍五入
116 1 ftemp=ftemp+0.05;
117 1 return temp; //temp是整型
C51 COMPILER V9.00 VV 11/20/2012 17:43:09 PAGE 3
118 1 }
119 ////////////////////显示程序//////////////////////////
120 void display(uchar num,uchar dat) //num是第几个数码管,dat是要显示的数字
121 {
122 1 uchar i;
123 1 dula=0;
124 1 P0=table[dat];
125 1 dula=1;
126 1 dula=0;
127 1
128 1 wela=0;
129 1 i=0XFF;
130 1 i=i&(~((0X01)<<(num)));//用i来存储位选数据,只有一位为0
131 1 P0=i;
132 1 wela=1;
133 1 wela=0;
134 1 delay(1);
135 1 }
136
137 void dis_temp(uint t) //t显示的是整型温度值
138 {
139 1 uchar i;
140 1 i=t/100;
141 1 display(0,i);
142 1 i=t%100/10;
143 1 display(1,i+10);
144 1 i=t%100%10;
145 1 display(2,i);
146 1 }
147
148
149 /*void warn(uint s,uchar led)
150 {
151 uchar i;
152 i=s;
153 beep=0;
154 P1=led;
155 while(i--)
156 {
157 dis_temp(get_temp());
158 }
159 beep=1;
160 P1=0xff;
161 i=s;
162 while(i--)
163 {
164 dis_temp(get_temp());
165 }
166 }
167 void deal(uint z)
168 {
169 uchar buff[4],i;
170 if((z>warnl2)&&(z<=warnl1))
171 {
172 warn(10,0x01);
173 }
174 else if(z<=warnl2)
175 {
176 warn(20,0x03);
177 }
178 else if((z<warnh2)&&(z>warnh1))
179 {
C51 COMPILER V9.00 VV 11/20/2012 17:43:09 PAGE 4
180 warn(40,0x04);
181 }
182 else if(z>warnh2)
183 {
184 warn(20,0x0c);
185 }
186 else
187 {
188 i=40;
189 while(i--)
190 {
191 dis_temp(get_temp());
192 }
193 }
194 } */
195 void main()
196 {
197 1 uchar buff[4],i;
198 1 while(1)
199 1 {
200 2 tempchange();
201 2 for(i=10;i>0;i--)
202 2 {
203 3 dis_temp(get_temp());
204 3 }
205 2
206 2 // deal(temp);
207 2 sprintf(buff,"%f",ftemp);
208 2 for(i=10;i>0;i--)
209 2 {
210 3 dis_temp(get_temp());
211 3 }
212 2 }
213 1 }
214
215
216
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 542 ----
CONSTANT SIZE = 23 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 14 5
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -