📄 ds1631.lst
字号:
C51 COMPILER V7.50 DS1631 12/18/2006 13:06:56 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE DS1631
OBJECT MODULE PLACED IN C:\DOCUME~1\GMLTT\桌面\WENDU\DS1631.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE C:\DOCUME~1\GMLTT\桌面\WENDU\DS1631.C DB SB OE
line level source
1
2 #include <reg52.h> // 引用标准库的头文件
3 #include <intrins.h>
4
5 #define uchar unsigned char
6 #define uint unsigned int
7 #define READ 1
8 #define WRITE 0
9
10 sbit SDA = P1^4; // 串行数据
11 sbit SCL = P1^6; // 串行时钟
12
13 uchar idata SLAdd; // 从器件地址
14 uchar idata SLAdd1;
15 uchar idata sbuf[8]; // 数据发送缓冲区
16 uchar idata rbuf[8]; // 数据接收缓冲区
17 bit bdata NACK; // 器件坏或错误标志位
18 bit bdata nackFlag; // 非应答标志位
19 bit ackFlag; //应答标志
20 float temp_c; // temperature in deg. C
21 float temp_f; // temperature in deg. F
22 unsigned char MSB; // temp byte MSB
23 unsigned char LSB; // temp byte LSB
24 unsigned char Config;
25
26 /* 延时约5微秒,对于12M时钟 */
27 void delay5us()
28 {
29 1 uint i;
30 1 for (i=0;i<5;i++)
31 1 _nop_();
32 1 }
33 /*延时约3微秒,对12M时钟*/
34 void delay3us()
35 {
36 1 uint i;
37 1 for(i=0;i<3;i++)
38 1 _nop_();
39 1 }
40
41 /* 起始条件子函数:SCL为高电平,SDA产生一个下降沿*/
42 void start(void)
43 {
44 1 SDA = 1; // 启动I2C总线
45 1 SCL = 1;
46 1 delay5us();
47 1 SDA = 0; //SCL为高,SDA出现下降沿后起始条件成立
48 1 delay5us();
49 1 SCL = 0;
50 1 delay3us();
51 1 }
52
53 /* 停止条件子函数:SCL为高电平,SDA产生一个上升沿 */
54 void stop(void)
55 {
C51 COMPILER V7.50 DS1631 12/18/2006 13:06:56 PAGE 2
56 1 SDA = 0; // 停止I2C总线数据传送
57 1 SCL = 1;
58 1 delay5us();
59 1 SDA = 1; //SCL为高,SDA出现上升沿后起停止条件成立
60 1 delay5us();
61 1 SCL = 0;
62 1 delay3us();
63 1 }
64
65 /* 主机发送ACK */
66 void ack(void)
67 {
68 1 SDA = 0; // 主机发送应答位
69 1 SCL = 1;
70 1 delay5us();
71 1 SDA = 1;
72 1 SCL = 0;
73 1 delay3us();
74 1 }
75
76 /* 发送非应答子函数 */
77 void n_ack(void)
78 {
79 1 SDA = 1; // 发送非应答位
80 1 SCL = 1;
81 1 delay5us();
82 1 SDA = 0;
83 1 SCL = 0;
84 1 delay3us();
85 1 }
86
87 /* 应答位检查子函数 */
88 void checkack(void)
89 {
90 1
91 1 SDA = 1; // 应答位检查(将p1.4设置成输入,必须先向端口写1)
92 1 _nop_();
93 1 _nop_();
94 1 SCL = 1;
95 1 _nop_();
96 1 _nop_();
97 1 _nop_();
98 1
99 1 if(SDA == 1) // 若SDA=1表明非应答,置位非应答标志F0(F0是程序状态字PSW.5用户可以根据需要置位或者复位)
100 1 ackFlag = 0;
101 1 else ackFlag = 1; //SDA拉低应答
102 1
103 1 SCL = 0;
104 1 //delay3us();
105 1 }
106
107 void I2CBitDly(void) // wait approximately 4.7uS
108 { // tune to xtal. This works at 11.0592MHz
109 1 unsigned int time_end = 10;
110 1 unsigned int index;
111 1
112 1 for (index = 0; index < time_end; index++);
113 1 return;
114 1 }
115
116 /* 发送一个字节数据子函数 */
117 void sendbyte(uchar idata ch)
C51 COMPILER V7.50 DS1631 12/18/2006 13:06:56 PAGE 3
118 {
119 1 uchar idata n = 8;
120 1 uchar idata temp;
121 1 temp = ch; //8f 1000 1111
122 1 while(n--)
123 1 {
124 2 if((temp&0x80) == 0x80) // 若要temp最高位为1则发送1;否则就发送0
125 2 {
126 3 SDA = 1; //发送1
127 3 SCL = 1;
128 3 delay5us();
129 3 SDA = 0;
130 3 SCL = 0;
131 3 }
132 2 else
133 2 {
134 3 SDA = 0; // 发送0
135 3 SCL = 1;
136 3 delay5us();
137 3 SCL = 0;
138 3 }
139 2 temp = temp<<1; // 数据左移一位
140 2 }
141 1
142 1 }
143
144
145 /* 发送n字节数据子程序
146 void sendnbyte(uchar idata *sla, uchar n)
147 {
148 uchar idata *p;
149 start(); // 发送启动信号
150 sendbyte(sla); // 发送从器件地址字节,控制字
151 checkack(); // 检查应答位
152 if(ackFlag == 0) // 如果非应答
153 {
154 NACK = 1;
155 return; // 若非应答表明器件错误或已坏,置错误标志位NACK
156 }
157 p = sbuf; //发送命令字,数据字节
158
159 while(n--)
160 {
161 sendbyte(p);
162 checkack(); // 检查应答位
163 if (ackFlag == 0)
164 {
165 NACK=1;
166 return; // 若非应答表明器件错误或已坏,置错误标志位NACK
167 }
168 p++;
169 }
170 // stop(); // 全部发完则停止
171 }*/
172
173
174
175 /* 接收一字节子程序 */
176 uchar recbyte()
177 {
178 1 uchar idata n=8; // 从SDA线上读取一位数据字节,共8位
179 1 uchar idata temp = 0;
C51 COMPILER V7.50 DS1631 12/18/2006 13:06:56 PAGE 4
180 1 while(n--)
181 1 {
182 2 SDA = 1;
183 2 SCL = 1;
184 2 temp = temp<<1; // 左移一位
185 2 if(SDA == 1)
186 2 temp = temp|0x01; // 若接收到的数为1,则temp最后一位置1
187 2 else
188 2 temp = temp&0xfe; // 否则temp最后一位置0
189 2 SCL=0; //???
190 2 }
191 1 return(temp);
192 1 }
193
194
195
196 void I2CSCLHigh(void) // Set SCL high, and wait for it to go high
197 {
198 1 register int err;
199 1 SCL = 1;
200 1 while (! SCL)
201 1 {
202 2 err++;
203 2 if (!err)
204 2 {
205 3 return;
206 3 }
207 2 }
208 1 }
209
210
211 void I2CSendByte(unsigned char bt)
212 {
213 1 register unsigned char i;
214 1 for (i=0; i<8; i++)
215 1 {
216 2 if (bt & 0x80) SDA = 1; // Send each bit, MSB first changed 0x80 to 0x01
217 2 else SDA = 0;
218 2 I2CSCLHigh();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -