📄 ds18b20.lst
字号:
C51 COMPILER V7.50 DS18B20 11/08/2007 10:15:28 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN DS18B20.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DS18B20.C BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg51.h>
2 #include<intrins.h> //_nop_();延时函数用;
3 #define Disdata P0 //段码输出口
4 #define discan P2 //扫描口
5 #define uchar unsigned char
6 #define uint unsigned int
7 sbit DQ=P1^0; //温度输入口
8 sbit DIN=P0^7; //led 小数点控制
9 sbit P20=P2^0;
10 sbit P37=P3^7;
11 uint h,count,jingjie1,jingjie2,jingjie;
12 uchar sound;
13 //****温度小数部分用查表法***//
14 uchar code ditab[16]=
15 {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,
16 0x08,0x08,0x09,0x09};
17 uchar code dis_7[12]=
18 {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
19 /*"0","1", "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"*/
20 uchar code scan_con[4]={0x80,0x40,0x20,0x10}; //位控
21 uchar data temp_data[2]={0x00,0x00}; //读出温度暂放
22 uchar data display[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个,一个运算暂存用
23
24 /***11us延时函数****/
25 void delay(uint t)
26 {
27 1 for(;t>0;t--);
28 1 }
29
30 /***显示扫描函数***/
31 scan()
32 {
33 1 char k;
34 1 for(k=0;k<4;k++)
35 1 {
36 2 Disdata =dis_7[display[k]];
37 2 if(k==1){DIN=0;}
38 2 discan=scan_con[k];delay(90);discan=0x00;
39 2 }
40 1 }
41
42 /****DS18B20复位函数***/
43 ow_reset(void)
44 {
45 1 char presence =1;
46 1 while(presence)
47 1 {
48 2 while(presence)
49 2 {
50 3 DQ=1;_nop_();_nop_();
51 3 DQ=0;
52 3 delay(50);
53 3 DQ=1;
54 3 delay(6);
55 3 presence=DQ;
C51 COMPILER V7.50 DS18B20 11/08/2007 10:15:28 PAGE 2
56 3 }
57 2 delay(45);
58 2 presence=~DQ;
59 2 }
60 1 DQ=1;
61 1 }
62
63 /****DS18B20写命令函数****/
64 void write_byte(uchar val)
65 {
66 1 uchar i;
67 1 for(i=8;i>0;i--)
68 1 {
69 2 DQ=1;_nop_();_nop_();
70 2 DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();//延时5us
71 2 DQ=val&0x01; //取出最低位
72 2 delay(6);
73 2 val=val/2;
74 2 }
75 1 DQ=1;
76 1 delay(1);
77 1 }
78
79 /******DS18B20读1字节函数****/
80 uchar read_byte(void)
81 {
82 1 uchar i;
83 1 uchar value =0;
84 1 for(i=8;i>0;i--)
85 1 {
86 2 DQ=1;_nop_();_nop_();
87 2 value>>=1;
88 2 DQ=0;
89 2 _nop_();_nop_();_nop_();_nop_();
90 2 DQ=1;_nop_();_nop_();_nop_();_nop_();
91 2 if(DQ) value|=0x80;
92 2 delay(6);
93 2 }
94 1 DQ=1;
95 1 return(value);
96 1 }
97
98 /*****读出温度函数****/
99 read_temp()
100 {
101 1 ow_reset();
102 1 write_byte(0xcc);
103 1 write_byte(0xbe);
104 1 temp_data[0]=read_byte();
105 1 temp_data[1]=read_byte();
106 1 ow_reset();
107 1 write_byte(0xcc);
108 1 write_byte(0x44);
109 1 }
110
111 /****温度数据处理函数*****/
112 work_temp()
113 {
114 1 uchar n=0;
115 1 if(temp_data[1]>127)
116 1 //以下一行是负温度求补码
117 1 {temp_data[1]=(256-temp_data[1]);temp_data[0]=(256-temp_data[0]);n=1;}
C51 COMPILER V7.50 DS18B20 11/08/2007 10:15:28 PAGE 3
118 1
119 1 display[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]];
120 1 //显示小数一位,由于小数是16进制,所以要简化成10进制--ditab
121 1 jingjie2=display[4];
122 1 display[4]= ((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
123 1 //右移4位变成低四位 "或合并" 左移4位变成高四位
124 1 jingjie1=display[4];
125 1 jingjie=(jingjie1<<4)|(jingjie2);
126 1 display[3]= display[4]/100;
127 1 display[1]= display[4]%100;
128 1 display[2]= display[1]/10;
129 1 display[1]= display[1]%10;
130 1 if(! display[3]){ display[3]=0x00;if(! display[2]){display[2]=0x00;}}
131 1 //最高位为0时都不显示
132 1 if(n){display[3]=0x40;}
133 1 }
134 /****中断获得发声频率*****/
135 void initial()
136 {
137 1 TMOD=0x01;
138 1 TH0=(65536-500)/256;
139 1 TL0=(65536-500)%256;
140 1 EA=1;
141 1 ET0=1;
142 1 TR0=0;
143 1 }
144 /****主函数*****/
145 main()
146 {initial();
147 1 P37=0;
148 1 Disdata=0x00;
149 1 discan=0x00; //初始化端口
150 1 for(h=0;h<4;h++){ display[h]=8;} //开机显示888
151 1 ow_reset(); //开机先转换一次
152 1 write_byte(0xcc);
153 1 write_byte(0x44);
154 1 for(h=0;h<500;h++)
155 1 {scan();}
156 1 while(1)
157 1 {TR0=0;
158 2 P37=0;
159 2 read_temp();
160 2 work_temp();
161 2 for(h=0;h<250;h++) //显示温度1s
162 2 {scan();
163 3 if((jingjie1>=25&jingjie2>=1)|jingjie1>=26){TR0=1;}
164 3 //只要温度超过25.1度就会响铃
165 3 }
166 2 }
167 1 }
168
169 void tO(void) interrupt 1
170 {TH0=(65536-100)/256;
171 1 TL0=(65536-100)%256;
172 1 P37=~P37;
173 1 }
174
175
176
177
178
179
C51 COMPILER V7.50 DS18B20 11/08/2007 10:15:28 PAGE 4
180
181
182
183
184
185
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 564 ----
CONSTANT SIZE = 32 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 18 ----
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 + -