📄 hehe.lst
字号:
C51 COMPILER V7.50 HEHE 01/10/2006 11:16:02 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE HEHE
OBJECT MODULE PLACED IN hehe.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\Bin\c51.exe hehe.c DB SB OE ROM(LARGE) SMALL OT(6,SPEED) WL(2) RB(0)
line level source
1 #include<reg52.h>
2 #include<absacc.h>
3 #include<intrins.h>
4
5 #define unit unsigned int
6 #define uchar unsigned char
7 #define FALSE 0
8 #define TRUE 1
9 #define DS18B20MAX 10
10
11 sbit LED=P1^6;
12 sbit DQ=P1^7;
13
14 uchar ROMID[8]={0x28,0xCB,0x81,0xC2,0x00,0x00,0x00,0x41};
15 // 该DS18B20的ROMID是 28 CB 81 C2 00 00 00 41
16 uchar scratchPad[9];
17 uchar TH=0x64; // 温度监测系统设定的温度报警上限值
18 // 0 1100100 设为100摄氏度
19 uchar TL=0xd8; // 温度监测系统设定的温度报警下限值
20 // 1 1011000 设为零下40摄氏度
21 uchar confgReg=0x3f; // 温度监测系统设定的配置寄存器数据值
22 // 0 01 111111 分辨率为10位,最大转换时间187.5秒
23 void initial(void)
24 {
25 1 IE=0x00;
26 1 TMOD=0x20;
27 1 PCON=0x00;
28 1 SCON=0x40;
29 1 TH1=0xfd;
30 1 TL1=0xfd;
31 1 LED=1;
32 1
33 1
34 1 }
35
36
37 void delay_1s(void)
38 {
39 1 unsigned char i;
40 1 unsigned int j;
41 1 for(i=0;i<250;i++)
42 1 for(j=0;j<672;j++);
43 1 }
44
45
46 void delay(int time) // 延时子程序
47 { // 系统采用的是11.059MHz的晶振,所以该延时程序产生16*time+24μs 的延时
48 1 int i;
49 1 for(i=0;i<time;i++);
50 1 }
51
52
53 bit bus_reset(void) // 产生单总线系统的总线复位信号,并返回总线上是否存在单总线器件信息
54 { // 若返回0表明总线上存在单总线器件,若返回1表明总线上不存在单总线器件
55 1 bit presence;
C51 COMPILER V7.50 HEHE 01/10/2006 11:16:02 PAGE 2
56 1 DQ=0; // 拉低DQ总线开始复位
57 1 delay(28); // 保持DQ低480μs
58 1 DQ=1; // 释放DQ
59 1 delay(5); // 等待大于60us,等待从设备将总线拉低,如果有从设备就拉低,否则就是高电平
60 1 presence=DQ; // 获取应答信号
61 1 delay(25); // 等待总线初始化过程结束
62 1 return(presence); // 返回应答信号,有芯片应答presence=0
63 1 // 无芯片应答presence=1
64 1 }
65
66
67 bit read_bit(void) // 从总线上读取一个数据位
68 {
69 1 DQ=0; // 将总线DQ拉低启动读时隙
70 1 DQ=1; // 释放DQ信号线,等待从机返回数据位
71 1 _nop_(); // 延时4μs再读数据
72 1 _nop_();
73 1 _nop_();
74 1 _nop_();
75 1 return DQ;
76 1
77 1 }
78
79
80 uchar read_byte(void) // 从单总线上读取一个字节
81 {
82 1 uchar i;
83 1 uchar value=0; // 将返回值初始化为0
84 1 for(i=0;i<8;i++)
85 1 {
86 2 if(read_bit())
87 2 value|=0x01<<i; // 读一字节数据,一个读时序中读一位,并做移位处理
88 2
89 2 delay(3); // 延时60μs以完成此次读时序,之后再读下一位数据
90 2 }
91 1 return(value);
92 1 }
93
94
95 void write_bit(uchar bitval) // 向单总线上写一个数据位
96 {
97 1 DQ=0; // 拉低DQ以开始一个写时序
98 1 if(bitval==1)
99 1 DQ=1; // 如要写"1"则将总线置高
100 1 delay(3); // 延时60μs供DS18B20采样
101 1 DQ=1; // 释放DQ总线
102 1
103 1 }
104
105
106 void write_byte(uchar val) // 向单总线上写一个数据字节
107 {
108 1 uchar i;
109 1 uchar temp=0; // 将返回值初始化为0
110 1 for(i=0;i<8;i++) // 写一字节数据,一次写一位
111 1 {
112 2 temp=val>>i; // 移位操作,将本次要写的位移到最低位
113 2 temp&=0x01;
114 2 write_bit(temp); // 向总线写该位
115 2 }
116 1 delay(5); // 等待时隙结束
117 1 }
C51 COMPILER V7.50 HEHE 01/10/2006 11:16:02 PAGE 3
118
119 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
120
121 uchar send_matchRom() // 系统主机向总线发出匹配ROM命令
122 { // ROM ID是编号为DS18B20No的温度传感器的ROM序列号
123 1 uchar i;
124 1 write_byte(0x55); // 向总线写匹配命令0x55
125 1 for(i=0;i<8;i--) // 连续写入8个字节的ROMID
126 1 {
127 2 write_byte(ROMID[i]); // 向总线写ROMID的第i个字节
128 2 }
129 1 return TRUE;
130 1 }
131
132
133 /*void read_scratchPad(uchar DTNo) // 系统主机从指定的DS18B20中读取便笺存储器的所有字节
134 { // 读取的结果放到全局变量scratchPad[9]中
135 uchar i;
136 send_matchRom(DTNo); // 向总线发出匹配ROM命令,使编号为DTNo的器件处于选中状态
137 write_byte(0xBE); // 向总线发出读便笺存储器命令
138 for(i=0;i<9;i++) // 连续读入9个字节的便笺存储器单元
139 {
140 scratchPad[i]=read_byte(); // 从总线读取1个字节存入scratchPad[i]
141 }
142
143 }*/
144
145
146 void write_scratchPad() // 系统主机向指定的DS18B20中写入TH、TL及配置寄存器数据
147 {
148 1 send_matchRom(); // 向总线发出匹配ROM命令,使编号为DTNo的器件处于选中状态
149 1 write_byte(0x4E); // 向总线发出写便笺存储器命令
150 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -