📄 ds18b20.lst
字号:
C51 COMPILER V8.02 DS18B20 03/08/2009 14:29:22 PAGE 1
C51 COMPILER V8.02, 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 /*****************************************************************/
2 /* */
-
3 /*名称: 测温+显示程序 */
-
-
4 /*功能: 读取当前18B20温度,由数码管显示出来。 */
-
5 /*难度等级: 中 */
-
6 /* E-mail:hbyuan2007@sina.com */
7 /*编写日期: 2009.03.07 */
-
-
8 /*****************************************************************/
9
10
11 #include<reg52.h>
12 #define uchar unsigned char
13
14 sbit DQ =P3^7;//18B20数据线引脚
15
16 //行扫描数组
17 uchar code scan[4] = {0x7f,0xbf,0xdf,0xef};//row0--row4
18 //数码管显示的段码表
19 uchar code table[20] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,// 0,1,2,3,4,5 ,6,7,8,9,
20 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,};// 0.,1.,2.,3.,4.,5.,6.,
-7.,8.,9.
21
22 uchar dispbuf[4]; //显示缓冲区
23 uchar temper[2];//存放温度的数组
24
25 /*****************************延时函数**************************/
26
27 void delay (unsigned int us)
28 {
29 1 while(us--);
30 1 }
31
32 void reset(void) //复位
33 {
34 1 uchar x=0;
35 1 DQ = 1;
36 1 delay(8); //稍做延时
37 1 DQ = 0;
38 1 delay(80); //精确延时 大于 480us
39 1 DQ = 1; //拉高总线
40 1 delay(14);
41 1 x=DQ;
42 1 delay(20);
43 1 }
44 /**********************从DS18B20读一字节***************/
45 uchar readbyte(void) //读1字节
46 {
47 1 uchar i=0;
C51 COMPILER V8.02 DS18B20 03/08/2009 14:29:22 PAGE 2
48 1 uchar dat=0;
49 1 for (i=8;i>0;i--)
50 1 {
51 2 DQ = 0;
52 2 dat>>=1;
53 2 DQ = 1;
54 2 if(DQ)
55 2 dat|=0x80;
56 2 delay(4);
57 2 }
58 1 return(dat);
59 1 }
60 /***********************向DS18B20写一字节***********************/
61 void writebyte(unsigned char dat) //写1字节
62 {
63 1 uchar i=0;
64 1 for (i=8; i>0; i--)
65 1 {
66 2 DQ = 0;
67 2 DQ = dat&0x01;
68 2 delay(5);
69 2 DQ = 1;
70 2 dat>>=1;
71 2 }
72 1 delay(4);
73 1 }
74 /***********************CPU读取温度值***************************/
75 void readtemp(void) //读取温度
76 {
77 1 uchar a=0,b=0;
78 1 reset();
79 1 writebyte(0xCC); // 跳过序列号
80 1 writebyte(0x44); // 启动温度转换
81 1 reset();
82 1 writebyte(0xCC);
83 1 writebyte(0xBE); //读9个寄存器,前两个为温度
84 1 a=readbyte(); //低位
85 1 b=readbyte(); //高位
86 1 temper[0]=a&0x0f;
87 1 a=a>>4; //低位右移4位,舍弃小数部分
88 1 temper[1]=b<<4; //高位左移4位,舍弃符号位
89 1 temper[1]=temper[1]|a;
90 1 }
91
92 /******************************显示+读键*************************/
93
94 void vLedKey_Scan()
95 { unsigned char i,value;
96 1
97 1 for(i=0;i<=3;i++){
98 2
99 2 value =table[dispbuf[i]]; //取一行显示数据
100 2 if(i==0)
101 2 value &= 0x7f;
102 2 P0 = value;
103 2
104 2 P2 = scan[i];//取row0--row7行扫描数据
105 2 delay(100); //延时50us
106 2 P2 = 0xff;//关显示
107 2 }
108 1 }
109
C51 COMPILER V8.02 DS18B20 03/08/2009 14:29:22 PAGE 3
110 /*******************************主函数***********************/
111
112 main()
113 { uchar i;
114 1 uchar temp;
115 1 float backbit;
116 1 for(i=0;i<=3;i++)
117 1 dispbuf[i] = 17;
118 1 while(1){
119 2 vLedKey_Scan(); //显示,读键扫描
120 2
121 2 readtemp();//读18B20
122 2 backbit = temper[0];//换成浮点数
123 2 backbit = backbit * 6.25;//乘以0.0625*100
124 2 temp = backbit;//取低2位整数部分
125 2 dispbuf[3] = temp%10 ;
126 2
127 2 temp = temp/10;
128 2 dispbuf[2] = temp%10 ;
129 2
130 2 temp = temper[1];//取整数部分
131 2 dispbuf[1] = temp%10;
132 2 dispbuf[1]+=10;
133 2 temp = temp/10;
134 2 dispbuf[0]= temp%10;
135 2 }
136 1 }
137
138 /********************************结束************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 312 ----
CONSTANT SIZE = 24 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 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 + -