📄 ad.lst
字号:
C51 COMPILER V8.02 AD 09/28/2011 09:35:49 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE AD
OBJECT MODULE PLACED IN ad.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ad.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 * AD PCF8591
3 *
4 * 旋转电位器,串口助手将收到不同的数据
5 */
6
7 #include <reg51.h>
8 #include <intrins.h>
9
10 typedef unsigned char uint8;
11 typedef unsigned int uint16;
12
13 #define SLAVEADDR 0x90
14 #define nops() do{_nop_();_nop_();_nop_();_nop_();_nop_();} while(0) //定义空指令
15
16
17 sbit SCL = P3^7; //I2C 时钟
18 sbit SDA = P3^6; //I2C 数据
19
20 void delay(uint16 n)
21 {
22 1 while (n--);
23 1 }
24 /**
25 * 函数: i2c_start()
26 * 功能: 启动i2c
27 */
28 void i2c_start()
29 {
30 1 SCL = 1;
31 1 nops();
32 1 SDA = 1;
33 1 nops();
34 1 SDA = 0;
35 1 nops();
36 1 SCL = 0;
37 1 }
38
39 /**
40 * 函数: i2c_stop()
41 * 功能: 停止i2c
42 */
43 void i2c_stop()
44 {
45 1 SCL = 0;
46 1 nops();
47 1 SDA = 0;
48 1 nops();
49 1 SCL = 1;
50 1 nops();
51 1 SDA = 1;
52 1 nops();
53 1 }
54
55 /**
C51 COMPILER V8.02 AD 09/28/2011 09:35:49 PAGE 2
56 * 函数: i2c_ACK(bit ck)
57 * 功能: ck为1时发送应答信号ACK,
58 * ck为0时不发送ACK
59 */
60 void i2c_ACK(bit ck)
61 {
62 1 if (ck)
63 1 SDA = 0;
64 1 else
65 1 SDA = 1;
66 1 nops();
67 1 SCL = 1;
68 1 nops();
69 1 SCL = 0;
70 1 nops();
71 1 SDA = 1;
72 1 nops();
73 1 }
74
75 /**
76 * 函数: i2c_waitACK()
77 * 功能: 返回为0时收到ACK
78 * 返回为1时没收到ACK
79 */
80 bit i2c_waitACK()
81 {
82 1 SDA = 1;
83 1 nops();
84 1 SCL = 1;
85 1 nops();
86 1 if (SDA)
87 1 {
88 2 SCL = 0;
89 2 i2c_stop();
90 2 return 1;
91 2 }
92 1 else
93 1 {
94 2 SCL = 0;
95 2 return 0;
96 2 }
97 1 }
98
99 /**
100 * 函数: i2c_sendbyte(uint8 bt)
101 * 功能: 将输入的一字节数据bt发送
102 */
103 void i2c_sendbyte(uint8 bt)
104 {
105 1 uint8 i;
106 1
107 1 for(i=0; i<8; i++)
108 1 {
109 2 if (bt & 0x80)
110 2 SDA = 1;
111 2 else
112 2 SDA = 0;
113 2 nops();
114 2 SCL = 1;
115 2 bt <<= 1;
116 2 nops();
117 2 SCL = 0;
C51 COMPILER V8.02 AD 09/28/2011 09:35:49 PAGE 3
118 2 }
119 1 }
120
121 /**
122 * 函数: i2c_recbyte( )
123 * 功能: 从总线上接收1字节数据
124 */
125 uint8 i2c_recbyte()
126 {
127 1 uint8 dee, i;
128 1
129 1 for (i=0; i<8; i++)
130 1 {
131 2 SCL = 1;
132 2 nops();
133 2 dee <<= 1;
134 2 if (SDA)
135 2 dee = dee | 0x01;
136 2 SCL = 0;
137 2 nops();
138 2 }
139 1
140 1 return dee;
141 1 }
142
143 /**
144 * 函数: i2c_readbyte
145 * 输入: addr
146 * 功能: 读出一字节数据
147 * 返回值: 0->成功 1->失败
148 */
149 bit i2c_readbyte(uint8 com, uint8 *dat)
150 {
151 1 i2c_start();
152 1 i2c_sendbyte(SLAVEADDR); //地址
153 1 if (i2c_waitACK())
154 1 return 1;
155 1 i2c_sendbyte(com); //控制字节
156 1 if (i2c_waitACK())
157 1 return 1;
158 1 i2c_start();
159 1 i2c_sendbyte(SLAVEADDR+1); //地址
160 1 if (i2c_waitACK())
161 1 return 1;
162 1 *dat = i2c_recbyte(); //读数据
163 1 i2c_ACK(0); //因为只读一字节数据,不发送ACK信号
164 1 i2c_stop();
165 1
166 1 return 0;
167 1 }
168
169 /**
170 * UART初始化
171 * 波特率:9600
172 */
173 void uart_init(void)
174 {
175 1 ET1=0;
176 1 TMOD = 0x21; // 定时器1工作在方式2(自动重装)
177 1 SCON = 0x50; // 10位uart,允许串行接受
178 1
179 1 TH1 = 0xFD;
C51 COMPILER V8.02 AD 09/28/2011 09:35:49 PAGE 4
180 1 TL1 = 0xFD;
181 1
182 1 TR1 = 1;
183 1 }
184
185 /**
186 * UART 发送一字节
187 */
188 void UART_Send_Byte(uint8 dat)
189 {
190 1 SBUF = dat;
191 1 while (TI == 0);
192 1 TI = 0;
193 1 }
194
195
196 main()
197 {
198 1 uint8 ans;
199 1
200 1 uart_init();
201 1
202 1 while(1)
203 1 {
204 2
205 2 i2c_readbyte(0x40, &ans);
206 2
207 2 UART_Send_Byte(ans);
208 2 delay(50000);
209 2 }
210 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 302 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 1
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -