📄 ds18b20.lst
字号:
C51 COMPILER V7.06 DS18B20 03/02/2007 11:18:48 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN ds18b20.OBJ
COMPILER INVOKED BY: E:\Program Files\C51\BIN\C51.EXE ds18b20.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*****************************************************************/
2 /* */
-
3 /*名称: 测温+显示程序 */
-
-
4 /*功能: 读取当前18B20温度,由数码管显示出来。 */
-
5 /*难度等级: 中 */
-
6 /* 作者: zengrenliang */
7 /* 版权: http://www.51kaifa.com */
8 /*编写日期: 2006.05.19 */
-
-
9 /*****************************************************************/
10
11
12 #include<reg52.h>
13 #define uchar unsigned char
14
15 sbit DQ =P3^2;//18B20数据线引脚
16 sbit LED_Disp = P3^3;
17
18 sbit addr0 = P1^4;//系统片选地址线0
19 sbit addr1 = P1^5;//系统片选地址线1
20 sbit addr2 = P1^6;//系统片选地址线2
21 sbit addr3 = P1^7;//系统片选地址线3
22 //行扫描数组
23 uchar code scan[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//row0--row7
24 //数码管显示的段码表
25 uchar code table[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,//0,1,2,3,4,5
26 0x82,0xf8,0x80,0x90,0x88,0x83,//6,7,8,9,a,b
27 0xc6,0xa1,0x86,0x8e,0xbf,0xff};//c,d,e,f,-,空格
28
29 uchar dispbuf[8]; //显示缓冲区
30 uchar temper[2];//存放温度的数组
31
32 /*****************************延时函数**************************/
33
34 void delay (unsigned int us)
35 {
36 1 while(us--);
37 1 }
38
39 void reset(void) //复位
40 {
41 1 uchar x=0;
42 1 DQ = 1;
43 1 delay(8); //稍做延时
44 1 DQ = 0;
45 1 delay(80); //精确延时 大于 480us
46 1 DQ = 1; //拉高总线
47 1 delay(14);
48 1 x=DQ;
C51 COMPILER V7.06 DS18B20 03/02/2007 11:18:48 PAGE 2
49 1 delay(20);
50 1 }
51 /**********************从DS18B20读一字节***************/
52 uchar readbyte(void) //读1字节
53 {
54 1 uchar i=0;
55 1 uchar dat=0;
56 1 for (i=8;i>0;i--)
57 1 {
58 2 DQ = 0;
59 2 dat>>=1;
60 2 DQ = 1;
61 2 if(DQ)
62 2 dat|=0x80;
63 2 delay(4);
64 2 }
65 1 return(dat);
66 1 }
67 /***********************向DS18B20写一字节***********************/
68 void writebyte(unsigned char dat) //写1字节
69 {
70 1 uchar i=0;
71 1 for (i=8; i>0; i--)
72 1 {
73 2 DQ = 0;
74 2 DQ = dat&0x01;
75 2 delay(5);
76 2 DQ = 1;
77 2 dat>>=1;
78 2 }
79 1 delay(4);
80 1 }
81 /***********************CPU读取温度值***************************/
82 void readtemp(void) //读取温度
83 {
84 1 uchar a=0,b=0;
85 1 reset();
86 1 writebyte(0xCC); // 跳过序列号
87 1 writebyte(0x44); // 启动温度转换
88 1 reset();
89 1 writebyte(0xCC);
90 1 writebyte(0xBE); //读9个寄存器,前两个为温度
91 1 a=readbyte(); //低位
92 1 b=readbyte(); //高位
93 1 temper[0]=a&0x0f;
94 1 a=a>>4; //低位右移4位,舍弃小数部分
95 1 temper[1]=b<<4; //高位左移4位,舍弃符号位
96 1 temper[1]=temper[1]|a;
97 1 }
98
99 /******************************显示+读键*************************/
100
101 void vLedKey_Scan()
102 { unsigned char i,value;
103 1
104 1 for(i=0;i<8;i++){
105 2 P2 = 0xff;//关显示
106 2 LED_Disp = 0;
107 2 value =table[dispbuf[i]]; //取一行显示数据
108 2 LED_Disp = 1;
109 2 if(i==2)
110 2 value &= 0x7f;
C51 COMPILER V7.06 DS18B20 03/02/2007 11:18:48 PAGE 3
111 2 P0 = value;
112 2 P2 = scan[i];//取row0--row7行扫描数据
113 2 delay(50); //延时50us
114 2 }
115 1 }
116
117 /*******************************主函数***********************/
118
119 main()
120 { uchar i;
121 1 uchar temp;
122 1 float backbit;
123 1 P1 = 0x80;//"温度"指示灯亮
124 1 for(i=0;i<8;i++)
125 1 dispbuf[i] = 17;
126 1 while(1){
127 2 vLedKey_Scan(); //显示,读键扫描
128 2
129 2 readtemp();//读18B20
130 2 backbit = temper[0];//换成浮点数
131 2 backbit = backbit * 6.25;//乘以0.0625*100
132 2 temp = backbit;//取低2位整数部分
133 2 dispbuf[4] = temp%10 ;
134 2
135 2 temp = temp/10;
136 2 dispbuf[3] = temp%10 ;
137 2
138 2 temp = temper[1];//取整数部分
139 2 dispbuf[2] = temp%10;
140 2
141 2 temp = temp/10;
142 2 dispbuf[1]= temp%10;
143 2 }
144 1 }
145
146 /********************************结束************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 313 ----
CONSTANT SIZE = 26 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 10 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 + -