📄 remote.lst
字号:
C51 COMPILER V8.05a REMOTE 08/15/2008 12:15:21 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE REMOTE
OBJECT MODULE PLACED IN remote.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE remote.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h>
2 #include <intrins.h>
3
4 sbit SDA=P1^1; // 将p1.1口模拟数据口
5 sbit SCL=P1^0; // 将p1.0口模拟时钟口
6
7 #define uchar unsigned char
8 #define uint unsigned int
9 #define disdata P0 //显示数据码输出口
10 #define PCF8591_WRITE 0x90
11 #define PCF8591_READ 0x91
12 #define NUM 4 //接收和发送缓存区的深度
13 uchar idata receivebuf[NUM]; //数据接收缓冲区
14
15 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
16 bit bdata SystemError; //从机错误标志位
17
18
19 unsigned char key_s, key_v, tmp;
20
21 char code str[] = "welcome! www.willar.com \n\r";
22
23
24 void send_str();
25 bit scan_key();
26 void proc_key();
27 void delayms(unsigned char ms);
28 void send_char(unsigned char txd);
29
30 sbit K1 = P1^4;
31
32
33 //-------------------------------------------------------------------
34 // 函数名称: iic_start()
35 // 函数功能: 启动I2C总线子程序
36 //-------------------------------------------------------------------
37 void iic_start(void)
38 { //时钟保持高,数据线从高到低一次跳变,I2C通信开始
39 1 SDA = 1;
40 1 SCL = 1;
41 1 delayNOP(); // 延时5us
42 1 SDA = 0;
43 1 delayNOP();
44 1 SCL = 0;
45 1 }
46 //-------------------------------------------------------------------
47 // 函数名称: iic_stop()
48 // 函数功能: 停止I2C总线数据传送子程序
49 //-------------------------------------------------------------------
50 void iic_stop(void)
51 {
52 1 SDA = 0; //时钟保持高,数据线从低到高一次跳变,I2C通信停止
53 1 SCL = 1;
54 1 delayNOP();
55 1 SDA = 1;
C51 COMPILER V8.05a REMOTE 08/15/2008 12:15:21 PAGE 2
56 1 delayNOP();
57 1 SCL = 0;
58 1 }
59 //------------------------------------------------------------------
60 // 函数名称: iicInit_()
61 // 函数功能: 初始化I2C总线子程序
62 //------------------------------------------------------------------
63 void iicInit(void)
64 {
65 1 SCL = 0;
66 1 iic_stop();
67 1 }
68 //-------------------------------------------------------------------
69 // 函数名称: slave_ACK
70 // 函数功能: 从机发送应答位子程序
71 //-------------------------------------------------------------------
72 void slave_ACK(void)
73 {
74 1 SDA = 0;
75 1 SCL = 1;
76 1 delayNOP();
77 1 SCL = 0;
78 1 }
79 //-------------------------------------------------------------------
80 // 函数名称: slave_NOACK
81 // 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束
82 //-------------------------------------------------------------------
83 void slave_NOACK(void)
84 {
85 1 SDA = 1;
86 1 SCL = 1;
87 1 delayNOP();
88 1 SDA = 0;
89 1 SCL = 0;
90 1 }
91 //-------------------------------------------------------------------
92 // 函数名称: check_ACK
93 // 函数功能: 主机应答位检查子程序,迫使数据传输过程结束
94 //-------------------------------------------------------------------
95 void check_ACK(void)
96 {
97 1 SDA = 1; // 将p1.1设置成输入,必须先向端口写1
98 1 SCL = 1;
99 1 F0 = 0;
100 1 delayNOP();
101 1 if(SDA == 1) // 若SDA=1表明非应答,置位非应答标志F0
102 1 F0 = 1;
103 1 SCL = 0;
104 1 }
105 //-------------------------------------------------------------------
106 // 函数名称: IICSendByte
107 // 入口参数: ch
108 // 函数功能: 发送一个字节
109 //-------------------------------------------------------------------
110 void IICSendByte(uchar ch)
111
112 {
113 1 unsigned char idata n=8; // 向SDA上发送一位数据字节,共八位
114 1
115 1 while(n--)
116 1 {
117 2 if((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1
C51 COMPILER V8.05a REMOTE 08/15/2008 12:15:21 PAGE 3
118 2 {
119 3 SDA = 1; // 传送位1
120 3 SCL = 1;
121 3 delayNOP();
122 3 // SDA = 0;
123 3 SCL = 0;
124 3 }
125 2 else
126 2 {
127 3 SDA = 0; // 否则传送位0
128 3 SCL = 1;
129 3 delayNOP();
130 3 SCL = 0;
131 3 }
132 2 ch = ch<<1; // 数据左移一位
133 2 }
134 1 }
135 //-------------------------------------------------------------------
136 // 函数名称: IICreceiveByte
137 // 返回接收的数据
138 // 函数功能: 接收一字节子程序
139 //-------------------------------------------------------------------
140 uchar IICreceiveByte(void)
141 {
142 1 uchar idata n=8; // 从SDA线上读取一上数据字节,共八位
143 1 uchar tdata=0;
144 1 while(n--)
145 1 {
146 2 SDA = 1;
147 2 SCL = 1;
148 2 tdata =tdata<<1; //左移一位
149 2 if(SDA == 1)
150 2 tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1
151 2 else
152 2 tdata = tdata&0xfe; // 否则数据的最后一位置0
153 2 SCL = 0;
154 2 }
155 1
156 1 return(tdata);
157 1 }
158
159 //-------------------------------------------------------------------
160 // 函数名称: ADC_PCF8591
161 // 入口参数: controlbyte控制字
162 // 函数功能: 连续读入4路通道的A/D转换结果到receivebuf
163 //-------------------------------------------------------------------
164 void ADC_PCF8591(uchar controlbyte)
165 {
166 1 uchar idata receive_da,i=0;
167 1
168 1 iic_start();
169 1
170 1 IICSendByte(PCF8591_WRITE); //控制字
171 1 check_ACK();
172 1 if(F0 == 1)
173 1 {
174 2 SystemError = 1;
175 2 return;
176 2 }
177 1
178 1 IICSendByte(controlbyte); //控制字
179 1 check_ACK();
C51 COMPILER V8.05a REMOTE 08/15/2008 12:15:21 PAGE 4
180 1 if(F0 == 1)
181 1 {
182 2 SystemError = 1;
183 2 return;
184 2 }
185 1
186 1 iic_start(); //重新发送开始命令
187 1 IICSendByte(PCF8591_READ); //控制字
188 1 check_ACK();
189 1 if(F0 == 1)
190 1 {
191 2 SystemError = 1;
192 2 return;
193 2 }
194 1
195 1 IICreceiveByte(); //空读一次,调整读顺序
196 1 slave_ACK(); //收到一个字节后发送一个应答位
197 1
198 1 while(i<4)
199 1 {
200 2 receive_da=IICreceiveByte();
201 2 receivebuf[i++]=receive_da;
202 2 slave_ACK(); //收到一个字节后发送一个应答位
203 2 }
204 1 slave_NOACK(); //收到最后一个字节后发送一个非应答位
205 1 iic_stop();
206 1 }
207
208
209 main()
210 {
211 1 TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
212 1 TH1 = 0xFD; // 波特率9600
213 1 TL1 = 0xFD;
214 1
215 1 SCON = 0x50; // 设定串行口工作方式
216 1 PCON &= 0xef; // 波特率不倍增
217 1
218 1 TR1 = 1; // 启动定时器1
219 1 IE = 0x0; // 禁止任何中断
220 1
221 1 while(1)
222 1 {
223 2 if(RI) // 是否有数据到来
224 2 {
225 3 RI = 0;
226 3 tmp = SBUF; // 暂存接收到的数据
227 3 P0 = tmp; // 数据传送到P0口
228 3 //send_char(tmp); // 回传接收到的数据
229 3 }
230 2 if(P0==0x30)
231 2 while(1)
232 2 { iicInit(); //I2C总线初始化
233 3 ADC_PCF8591(0x04);
234 3 send_char(receivebuf[1]);
235 3 //delayms(5);
236 3 if(RI) // 是否有数据到来
237 3 {
238 4 RI = 0;
239 4 tmp = SBUF; // 暂存接收到的数据
240 4 P0 = tmp; // 数据传送到P0口
241 4 //send_char(tmp); // 回传接收到的数据
C51 COMPILER V8.05a REMOTE 08/15/2008 12:15:21 PAGE 5
242 4 }
243 3 //if(P0==0)
244 3
245 3 if(P0==0xff)
246 3 break;
247 3 }
248 2 }
249 1 }
250
251
252 void send_char(unsigned char txd)
253 // 传送一个字符
254 {
255 1 SBUF = txd;
256 1 while(!TI); // 等特数据传送
257 1 TI = 0; // 清除数据传送标志
258 1 }
259
260 /*void send_str()
261 // 传送字串
262 {
263 unsigned char i = 0;
264 while(str[i] != '\0')
265 {
266 SBUF = str[i];
267 while(!TI); // 等特数据传送
268 TI = 0; // 清除数据传送标志
269 i++; // 下一个字符
270 }
271 }
272
273 void delayms(unsigned char ms)
274 // 延时子程序
275 {
276 unsigned char i;
277 while(ms--)
278 {
279 for(i = 0; i < 120; i++);
280 }
281 } */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 323 ----
CONSTANT SIZE = 27 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 ----
IDATA SIZE = 4 4
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 + -