📄 w012.lst
字号:
C51 COMPILER V8.02 W012 06/07/2007 21:45:00 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE W012
OBJECT MODULE PLACED IN w012.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE w012.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************************
2 * 实验名称: 数字温度表(DS18B20)数码管显示 *
3 ********************************************************************************
4 * 实验描述: 四位数码管显示测量的温度 *
5 * 实验说明: 数码管从左到右依次显示温度的百位十位个位小数部分 *
6 * DS18B20没有安装时,数码管显示FFF.F *
7 * 实验前要在J7上安装DS18B20 *
8 * 1:接DS18B20的GND端 *
9 * 2:接DS18B20的DQ端 *
10 * 3:接DS18B20的VDD端 *
11 *******************************************************************************/
12
13 #include <reg52.h>
14 #include <intrins.h>
15
16 sbit DQ = P3^7; //定义DS18B20端口DQ
17
18 bit presence; //DS18B20初始化成功标志位
19
20 unsigned char digit=0; //数码管显示位
21
22 /* 段码表 */
23 unsigned char code seg_code[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, // 0-9
24 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x00}; // A, b, C, d, E, F, off
25
26 /*温度小数部分查表*/
27 unsigned char code ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
28 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
29
30 unsigned char data temp_data[2] = {0x00,0x00}; //温度数据缓存
31 unsigned char data dis_data[5]={0,0,0,0,0}; //温度值百十个小数位及一个数据缓存
32
33
34 void Delay( int num) //us级延时函数
35 {
36 1 while( --num );
37 1 }
38
39 void WriteSegData(unsigned char seg) //写段码数据函数
40 {
41 1
42 1 if(seg > 16)
43 1 seg = 16;
44 1 seg = seg_code[seg];
45 1
46 1 if(digit == 2)
47 1 seg = seg+0x80; //小数点的位置
48 1
49 1 P0 = seg;
50 1 _nop_();
51 1 _nop_();
52 1
53 1 P2 &= 0x1F;
54 1 _nop_();
55 1 _nop_();
C51 COMPILER V8.02 W012 06/07/2007 21:45:00 PAGE 2
56 1
57 1 P2 |= 0xE0;
58 1 }
59
60 void WriteDigitData(unsigned char dig) //写位选数据函数
61 {
62 1
63 1 dig &= 0x0F;
64 1 P0 = ~dig;
65 1 _nop_();
66 1 _nop_();
67 1
68 1 P2 &= 0x3F;
69 1 _nop_();
70 1 _nop_();
71 1
72 1 P2 |= 0xE0;
73 1 }
74
75 DS18B20_Init(void) //DS18B20初始化函数
76 {
77 1 DQ = 1;
78 1 Delay(8);
79 1
80 1 DQ = 0; //将DQ拉低
81 1 Delay(95); //延时 大于480us
82 1
83 1 DQ = 1; //拉高总线
84 1 Delay(8);
85 1
86 1 presence = DQ; //如果 presence=0则初始化成功 presence=1则初始化失败
87 1 Delay(100);
88 1 DQ = 1;
89 1
90 1 return(presence); //返回presence
91 1 }
92
93 ReadOneChar(void) //读一个字节数据函数
94 {
95 1 unsigned char i = 0;
96 1 unsigned char dat = 0;
97 1
98 1 for (i = 8; i >0; i--)
99 1 {
100 2 DQ = 0;
101 2 dat >>= 1;
102 2 DQ = 1; //给脉冲信号
103 2
104 2 if(DQ)
105 2 dat |= 0x80;
106 2 Delay(4);
107 2 }
108 1
109 1 return(dat);
110 1 }
111
112
113 void WriteOneChar(unsigned char dat) //写一个字节数据函数
114 {
115 1 unsigned char i = 0 ;
116 1 for (i = 8; i>0; i--)
117 1 {
C51 COMPILER V8.02 W012 06/07/2007 21:45:00 PAGE 3
118 2 DQ = 0;
119 2 DQ = dat&0x01;
120 2 Delay(4);
121 2
122 2 DQ = 1;
123 2 dat>>=1;
124 2 }
125 1 }
126
127 void ReadTemperature(void) //读取温度函数
128 {
129 1 presence = 1;
130 1 while(presence == 1)
131 1 DS18B20_Init();
132 1
133 1 WriteOneChar(0xCC); //跳过读序号列号的操作
134 1 WriteOneChar(0x44); //启动温度转换
135 1
136 1 presence = 1;
137 1 while(presence == 1)
138 1 DS18B20_Init();
139 1
140 1 WriteOneChar(0xCC); //跳过读序号列号的操作
141 1 WriteOneChar(0xBE); //读取温度寄存器
142 1
143 1 temp_data[0] = ReadOneChar(); //读温度低8位
144 1 temp_data[1] = ReadOneChar(); //读温度高8位
145 1 }
146
147 void TemperatureConvert() //温度数据转换函数
148 {
149 1 dis_data[4]=temp_data[0]&0x0f; //temp_data[0]低4为有效
150 1 dis_data[3]=ditab[dis_data[4]]; //查表得小数位的值
151 1 dis_data[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
152 1 dis_data[0]=(dis_data[4])/100; //百位
153 1 dis_data[1]=(dis_data[4]%100)/10; //十位
154 1 dis_data[2]=(dis_data[4])%10; //个位
155 1
156 1 if(dis_data[0]==0) //百位为0,不显示
157 1 {
158 2 dis_data[0]=16;
159 2
160 2 if(dis_data[1]==0) //十位为0,不显示
161 2 dis_data[1]=16 ;
162 2 }
163 1
164 1 }
165
166 void Timer0_Init(void) //T0初始化函数
167 {
168 1 TMOD = 0x01;
169 1 TH0 = 0xEE;
170 1 TL0 = 0x00;
171 1 EA = 1;
172 1 ET0 = 1;
173 1 }
174 void main() //主函数
175 {
176 1 P0 = 0xFF;
177 1 P2 = 0xFF;
178 1
179 1 Timer0_Init();
C51 COMPILER V8.02 W012 06/07/2007 21:45:00 PAGE 4
180 1 TR0 = 1;
181 1
182 1 while(1)
183 1 {
184 2 DS18B20_Init();
185 2
186 2 if(presence==0)
187 2 {
188 3 ReadTemperature();
189 3 TemperatureConvert();
190 3 }
191 2
192 2 if(presence==1)
193 2 {
194 3 DS18B20_Init();
195 3
196 3 dis_data[0]=dis_data[1]=dis_data[2]=dis_data[3]=15 ;
197 3 dis_data[4]=0 ;
198 3 }
199 2 }
200 1 }
201
202
203 void timer0() interrupt 1 using 1 //中断程序
204 {
205 1 TH0 = 0xEE;
206 1 TL0 = 0x00;
207 1 if(digit > 3)
208 1 digit = 0;
209 1 else
210 1 digit++;
211 1 WriteSegData(dis_data[digit]);
212 1 WriteDigitData(1<<digit);
213 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 415 ----
CONSTANT SIZE = 33 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -