📄 18b20.lst
字号:
C51 COMPILER V7.06 18B20 10/25/2006 16:41:27 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE 18B20
OBJECT MODULE PLACED IN 18b20.OBJ
COMPILER INVOKED BY: D:\keil\C51\BIN\C51.EXE 18b20.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2 #include <reg52.h> //DS18B20温度传感器程序
3 code unsigned char seg7code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
4 0x82,0xf8,0x80,0x90,0xff}; //不带小数点的共阳数码管段码
5 code unsigned char seg7codeB[]={0x40,0x79,0x24,0x30,0x19,0x12,
6 0x02,0x78,0x00,0x10,0xff}; //带小数点的共阳数码管段码
7
8 sbit DQ=P3^6; //数据传输线接单片机的相应的引脚
9 unsigned char tempL=0; //设全局变量
10 unsigned char tempH=0;
11 unsigned int sdata;//测量到的温度的整数部分
12 unsigned char xiaoshu1;//小数第一位
13 unsigned char xiaoshu2;//小数第二位
14 unsigned char xiaoshu;//两位小数
15 bit fg=1; //温度正负标志
16
17
18
19 //******************延时子程序 *******************************
20
21 //这个延时程序的具体延时时间是time=i*8+10,适用于小于2ms的延时
22
23 //************************************************************
24 void delay(unsigned char i)
25 {
26 1 for(i;i>0;i--);
27 1 }
28
29
30 //***********************************************************
31
32 // 延时子程序
33
34 //************************************************************
35 void delay1ms()
36 {
37 1 unsigned char i;
38 1 for(i=124;i>0;i--); //延时124*8+10=1002us
39 1 }
40
41
42
43 //*****************************初始化程序 *********************************//
44
45 Init_DS18B20(void)
46 {
47 1 unsigned char x=0;
48 1 DQ=1; //DQ先置高
49 1 delay(8); //稍延时
50 1 DQ=0; //发送复位脉冲
51 1 delay(80); //延时(>480us)
52 1 DQ=1; //拉高数据线
53 1 delay(5); //等待(15~60us)
54 1 x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
55 1 delay(20);
C51 COMPILER V7.06 18B20 10/25/2006 16:41:27 PAGE 2
56 1 }
57
58
59 //**********读一个字节************//
60
61 ReadOneChar(void) //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
62 {
63 1 unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
64 1 unsigned char dat=0;
65 1 for (i=8;i>0;i--) //一个字节有8位
66 1 {
67 2 DQ=1;
68 2 delay(1);
69 2 DQ=0;
70 2 dat>>=1;
71 2 DQ=1;
72 2 if(DQ)
73 2 dat|=0x80;
74 2 delay(4);
75 2 }
76 1 return(dat);
77 1 }
78
79
80
81 //*********************** **写一个字节**************************//
82
83 WriteOneChar(unsigned char dat)
84 {
85 1 unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,
86 1 for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。
87 1 {
88 2 DQ=0; //在开始另一个写周期前必须有1us以上的高电平恢复期。
89 2 DQ=dat&0x01;
90 2 delay(5);
91 2 DQ=1;
92 2 dat>>=1;
93 2 }
94 1 delay(4);
95 1 }
96
97
98 //读温度值(低位放tempL;高位放tempH;)
99 ReadTemperature(void)
100 {
101 1 Init_DS18B20(); //初始化
102 1 WriteOneChar(0xcc); //跳过读序列号的操作
103 1 WriteOneChar(0x44); //启动温度转换
104 1 delay(125); //转换需要一点时间,延时
105 1 Init_DS18B20(); //初始化
106 1 WriteOneChar(0xcc); //跳过读序列号的操作
107 1 WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
108 1 tempL=ReadOneChar(); //读出温度的低位LSB
109 1 tempH=ReadOneChar(); //读出温度的高位MSB
110 1
111 1 if(tempH>0x7f) //最高位为1时温度是负
112 1 {
113 2 tempL=~tempL; //补码转换,取反加一
114 2 tempH=~tempH+1;
115 2 fg=0; //读取温度为负时fg=0
116 2 }
117 1 sdata = tempL/16+tempH*16; //整数部分
C51 COMPILER V7.06 18B20 10/25/2006 16:41:27 PAGE 3
118 1 xiaoshu1 = (tempL&0x0f)*10/16; //小数第一位
119 1 xiaoshu2 = (tempL&0x0f)*100/16%10;//小数第二位
120 1 xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位
121 1 }
122
123
124 //********************显示函数****************
125 void Led(unsigned int date)
126 {
127 1 if(fg==1)
128 1 {
129 2 P1=0xfe; //P1.0=0,选通第一位
130 2 P2=seg7code[date/10]; //十位数,查表,输出
131 2 delay1ms();
132 2 P2=0xff; //消隐
133 2
134 2 P1=0xfd; //P1.1=0,选通第二位,个位数
135 2 P2=seg7codeB[date%10];
136 2 delay1ms();
137 2 P2=0xff; //消隐
138 2
139 2 P1=0xfb; //P1.3=0,选通第三位,小数点第一位
140 2 P2=seg7code[xiaoshu1];
141 2 delay1ms();
142 2 P2=0xff; //消隐
143 2
144 2 P1=0xf7; //P1.3=0,选通第四位,小数点第二位
145 2 P2=seg7code[xiaoshu2];
146 2 delay1ms();
147 2 P2=0xff; //消隐
148 2 }
149 1
150 1 if(fg==0) //温度为负时显示的数据
151 1 {
152 2 P1=0xfe; //P1.0=0,选通第一位
153 2 P2=seg7code[11]; //显示负号
154 2 delay1ms();
155 2 P2=0xff; //消隐
156 2
157 2 P1=0xfd; //P1.1=0,选通第二位,十位数
158 2 P2=seg7code[date/10];
159 2 delay1ms();
160 2 P2=0xff; //消隐
161 2
162 2 P1=0xfb; //P1.3=0,选通第三位,个位数
163 2 P2=seg7codeB[date%10];
164 2 delay1ms();
165 2 P2=0xff; //消隐
166 2
167 2 P1=0xf7; //P1.3=0,选通第四位,小数点第一位
168 2 P2=seg7code[xiaoshu1];
169 2 delay1ms();
170 2 P2=0xff; //消隐
171 2 }
172 1 }
173
174
175 //**************************** //主程序
176
177
178 main()
179 {
C51 COMPILER V7.06 18B20 10/25/2006 16:41:27 PAGE 4
180 1 while(1)
181 1 {
182 2 ReadTemperature();
183 2 Led(sdata);
184 2 }
185 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 414 ----
CONSTANT SIZE = 22 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 ----
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 + -