📄 18b20.lst
字号:
C51 COMPILER V8.02 18B20 05/04/2002 11:07:14 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 18B20
OBJECT MODULE PLACED IN 18b20.OBJ
COMPILER INVOKED BY: D:\keil\新建文件夹\C51\BIN\C51.EXE 18b20.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h>
2 #include<all.h>
3 #define uchar unsigned char
4 #define uint unsigned int
5
6 /*DS18B20功能命令*/
7 #define SEARCH_ROM 0xf0 //搜索ROM
8 #define READ_ROM 0x33 //读DS18B20序列号
9 #define MATCH_ROM 0x55 // 匹配ROM
10 #define SKIP_ROM 0xcc //跳过读序列号的操作
11 #define ALARM_SEARCH 0xec // 报警搜索
12 #define CONVERT_T 0x44 //启动温度转换
13 #define WRITE_SCRATCHPAD 0x4e // 可写3个字节到暂存器,即高温,低温触发器和配置寄存器
14 #define READ_SCRATCHPAD 0xbe //读取温度寄存器
15 #define READ_POWER_SUPPLY 0xb4 //读供电方式,0为寄生方式,1为外部电源
16 #define COPY_SCRATCHPAD 0x48 //拷贝存储器
17
18 sbit DQ =P2^7; //模拟1_Wire总线DQ
19
20 uchar Highlimit=30; //代表初始上限30
21 uchar Lowlimit =27; //代表初始下限27
22 uint temp;
23
24
25 void Wire_delay(uint i) //延时(15+10i)us
26
27 {
28 1 while(i--);
-
29 1
30 1 }
31
32
33 void Reset_DS18B20( ) //初始化函数
34 {
35 1 uchar Reset_flag=0;
36 1
37 1 DQ = 1; //主机拉低DQ至少480us开始时序
38 1 Wire_delay(8);
39 1 DQ = 0; //上拉电阻拉高总线
40 1 Wire_delay(80); //等待DS18B20响应
41 1 DQ = 1;
42 1 Wire_delay(14);
43 1 Reset_flag=DQ; //采样应答信号
44 1 Wire_delay(20);
45 1 }
46
47
48
49 uchar Read_byte( ) //读一个字节
50 {
51 1 uchar i,receive_data;
52 1
53 1 for(i=8;i>0;i--)
54 1 {
C51 COMPILER V8.02 18B20 05/04/2002 11:07:14 PAGE 2
55 2 DQ = 0; // 给脉冲信号
56 2 receive_data>>=1;
57 2 DQ = 1; // 给脉冲信号
58 2 if(DQ)
59 2 receive_data|=0x80;
60 2 Wire_delay(4);
61 2 }
62 1
63 1 return(receive_data);
64 1
65 1 }
66
67
68 Write_byte(uchar write_data) //写一个字节
69 {
70 1 uchar i;
71 1
72 1 for(i=8;i>0;i--)
73 1 {
74 2 DQ = 0;
75 2 DQ = write_data&0x01; //1_wire低位在前传输
76 2 Wire_delay(5);
77 2 DQ = 1;
78 2 write_data>>=1;
79 2
80 2 }
81 1
82 1 Wire_delay(4);
83 1 }
84
85
86 DS18B20_Initial( ) //18b20寄存器初始化
87 {
88 1 Reset_DS18B20( );
89 1 Write_byte(SKIP_ROM ); //跳过读序列号
90 1 Write_byte(WRITE_SCRATCHPAD); // 可连续写3个字节到暂存器,即高温,低温触发器和配置寄存器
91 1 Write_byte(Highlimit); //设置上限温度值
92 1 Write_byte(Lowlimit); //设置下限温度值
93 1 Write_byte(0x7f); //设置为12位分辨率
94 1 Reset_DS18B20( );
95 1 Write_byte(SKIP_ROM ); //跳过读序列号
96 1 Write_byte(COPY_SCRATCHPAD); //拷贝存储器命令????
97 1 }
98
99
100 uint Read_temperature( ) //读取温度
101 {
102 1 uint temp=0;
103 1 uchar tempL=0; //温度值低8位
104 1 uchar tempH=0; //温度值高8位
105 1
106 1 Reset_DS18B20( );
107 1 Write_byte(0xCC ); // 跳过读序号列号的操作
108 1 Write_byte(0x44 ); // 启动温度转换
109 1 Reset_DS18B20( );
110 1 Write_byte(0xCC ); //跳过读序号列号的操作
111 1 Write_byte(0xBE); //读取温度寄存器(共可读9个寄存器),前两个就是温度值
112 1
113 1 tempL=Read_byte( ); //读取温度值低8位
114 1 tempH=Read_byte( ); //读取温度值高8位
115 1
116 1 temp = tempH ;
C51 COMPILER V8.02 18B20 05/04/2002 11:07:14 PAGE 3
117 1 temp<<=8;
118 1 temp |= tempL;
119 1 return(temp);
120 1
121 1 }
122
123
124 /********************************/
125 /**********温度显示**************/
126 /********************************/
127
128 void temperature_display(uint display_data) //显示函数
129 {
130 1 uint Temp,Temp2;
131 1 uchar t[5]; //存放温度值数组
132 1 Temp=display_data*6.25; //最小分辨率0.0625,在此先放大100倍
133 1 t[0]=Temp/1000; //温度十位
134 1 t[1]=Temp%1000/100; //温度个位
135 1 t[2]=11; //小数点
136 1 t[3]=Temp%1000%100/10; //温度十分位
137 1 t[4]=Temp%1000%100%10; //温度百位
138 1 Temp2=Temp/100;
139 1
140 1 LCD_write_shu(5,4,t[0]);
141 1 LCD_write_shu(6,4,t[1]);
142 1 LCD_write_shu(7,4,t[2]);
143 1 LCD_write_shu(8,4,t[3]);
144 1 LCD_write_hanzi(6,4,22); //℃
145 1 }
146
147
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 374 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 7
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 + -