📄 od2101.lst
字号:
C51 COMPILER V7.10 OD2101 04/27/2009 16:02:33 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE OD2101
OBJECT MODULE PLACED IN od2101.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE od2101.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //#include "reg52.h"
2 #include <STC12C2052AD.h>
3 #include "intrins.h"
4
5 #ifndef uchar
6 #define uchar unsigned char
7 #endif
8
9 #ifndef uint
10 #define uint unsigned int
11 #endif
12
13
14 #define WR 0x00
15 #define RD 0x00
16 #define UARTBUF 0x01
17 #define I2CBUF 0x02
18 #define CTRL 0x03
19 #define OD2101 0x5e //A0 H A1 H A2 H
20
21 #define ACKCNT 150
22
23 sbit VI2C_SDA=P1^1;
24 sbit VI2C_SCL=P1^2;
25 sbit IRQ=P3^2;
26 sbit LED=P1^0; //用来监测IRQ脚的电平
27 bit data ack; //*应答标志位*/
28
29
30 bit data IRQ_VALUE=0;
31
32
33 uchar data in_dat,in_dat1,PC_COMMAND;
34 uchar data RAM_buff[8];
35
36 enum{UART_9600,UART_300,UART_600,UART_900,
37 UART_1200,UART_1800,UART_2400,UART_3600,
38 UART_4800,UART_7200,UART_14400,UART_19200,
39 UART_28800,UART_38400,UART_57600,UART_115200};
40
41 bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no);
42
43
44
45 //50ms延时
46 void delay5ms(void)
47 {
48 1 unsigned char TempCyc = 250;
49 1 while(TempCyc--);
50 1 }
51
52 //串行口初始化
53 void init_serialcomm(void)
54 {
55 1 SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
C51 COMPILER V7.10 OD2101 04/27/2009 16:02:33 PAGE 2
56 1 //TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
57 1 TMOD=0x21; //time1 work mode 2 auto replace time0 work mode 1 16 bit
58 1 PCON |= 0x80; //SMOD=1;
59 1 //baud_setup(eeprom_read(sector1));
60 1
61 1 TH1 = 0xFA; // fosc=11.0592MHz
62 1 IE |= 0x90; //Enable Serial Interrupt
63 1 TR1 = 1; // timer 1 run
64 1 // TI=1;
65 1 }
66
67 //串行数据发送,查询模式
68 //向串口发送一个字符
69 void serial_out(unsigned char ch)
70 {
71 1 SBUF=ch;
72 1 while(TI==0);
73 1 TI=0;
74 1 }
75
76 void send_string_com(unsigned char *str,unsigned int strlen)
77 {
78 1 unsigned int i=0;
79 1 do
80 1 {
81 2 serial_out(*(str + i));
82 2 i++;
83 2 } while(i < strlen);
84 1 }
85
86
87
88
89
90
91 void DelayNs(unsigned int i)
92 {
93 1 for(;i>0;i--) ;
94 1 }
95
96 /************************************************************************/
97 //1:定义如下函数
98 unsigned char TestSCL()
99 {
100 1 uint i ;
101 1 for( i = 0 ; i < 0xffff ; i++ ) {
102 2 if ( VI2C_SCL == 1 ) return 1 ;
103 2 }
104 1 return 0 ;
105 1 }
106 //2:在每一个SCL=1;这句话后加入此函数就可以用了。 如下所示:
107 //SCL=1;
108 //TestSCL();
109 /************************************************************************/
110
111
112 /*******************************************************************
113 起动总线函数
114 函数原型: void Start_I2c();
115 功能: 启动I2C总线,即发送I2C起始条件.
116
117 ********************************************************************/
C51 COMPILER V7.10 OD2101 04/27/2009 16:02:33 PAGE 3
118 void Start_I2c()
119 {
120 1 VI2C_SDA=1; /*发送起始条件的数据信号*/
121 1
122 1 _nop_();
123 1
124 1 VI2C_SCL=1; TestSCL();
125 1 _nop_(); /*起始条件建立时间大于4.7us,延时*/
126 1 _nop_();
127 1 _nop_();
128 1 _nop_();
129 1 _nop_();
130 1
131 1 VI2C_SDA=0; /*发送起始信号*/
132 1 _nop_(); /* 起始条件锁定时间大于4μs*/
133 1 _nop_();
134 1 _nop_();
135 1 _nop_();
136 1 _nop_();
137 1
138 1 VI2C_SCL=0; /*钳住I2C总线,准备发送或接收数据 */
139 1 _nop_();
140 1 _nop_();
141 1 }
142
143 /*******************************************************************
144 结束总线函数
145 函数原型: void Stop_I2c();
146 功能: 结束I2C总线,即发送I2C结束条件.
147
148 ********************************************************************/
149 void Stop_I2c()
150 {
151 1 VI2C_SDA=0; /*发送结束条件的数据信号*/
152 1 _nop_(); /*发送结束条件的时钟信号*/
153 1 VI2C_SCL=1; /*结束条件建立时间大于4μs*/TestSCL();
154 1 _nop_();
155 1 _nop_();
156 1 _nop_();
157 1 _nop_();
158 1 _nop_();
159 1
160 1 VI2C_SDA=1; /*发送I2C总线结束信号*/
161 1 _nop_();
162 1 _nop_();
163 1 _nop_();
164 1 _nop_();
165 1 }
166
167
168
169
170 /*******************************************************************
171 字节数据传送函数
172 函数原型: void SendByte(uchar c);
173 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
174 此状态位进行操作.(不应答或非应答都使ack=0 假)
175 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
176 ********************************************************************/
177 void SendByte(uchar c)
178 {
179 1 uchar data BitCnt,i;
C51 COMPILER V7.10 OD2101 04/27/2009 16:02:33 PAGE 4
180 1
181 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
182 1 {
183 2 if((c<<BitCnt)&0x80)VI2C_SDA=1; /*判断发送位*/
184 2 else VI2C_SDA=0;
185 2 _nop_();
186 2
187 2 VI2C_SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/TestSCL();
188 2 _nop_();
189 2 _nop_(); /*保证时钟高电平周期大于4μs*/
190 2 _nop_();
191 2 _nop_();
192 2 _nop_();
193 2
194 2
195 2
196 2 VI2C_SCL=0;
197 2 }
198 1
199 1 _nop_();
200 1 _nop_();
201 1
202 1 VI2C_SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
203 1 _nop_();
204 1 _nop_();
205 1
206 1 VI2C_SCL=1; TestSCL();
207 1 _nop_();
208 1 _nop_();
209 1 _nop_();
210 1
211 1
212 1 while((VI2C_SDA==1)&&(i<ACKCNT)){i++;}
213 1 if(i>ACKCNT) ack=0;
214 1 else ack=1; /*判断是否接收到应答信号*/
215 1 VI2C_SCL=0;
216 1 _nop_();
217 1 _nop_();
218 1
219 1 DelayNs(50); //cfy
220 1 }
221
222
223
224
225
226
227 /*******************************************************************
228 字节数据传送函数
229 函数原型: uchar RcvByte();
230 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
231 发完后请用应答函数。
232 ********************************************************************/
233 uchar RcvByte()
234 {
235 1 uchar data retc;
236 1 uchar data BitCnt;
237 1
238 1 retc=0;
239 1 VI2C_SDA=1; /*置数据线为输入方式*/
240 1 for(BitCnt=0;BitCnt<8;BitCnt++)
241 1 {
C51 COMPILER V7.10 OD2101 04/27/2009 16:02:33 PAGE 5
242 2 _nop_();
243 2 VI2C_SCL=0; /*置时钟线为低,准备接收数据位*/
244 2 _nop_();
245 2 _nop_(); /*时钟低电平周期大于4.7μs*/
246 2 _nop_();
247 2 _nop_();
248 2 _nop_();
249 2
250 2
251 2 VI2C_SCL=1; /*置时钟线为高使数据线上数据有效*/ TestSCL();
252 2 _nop_();
253 2 _nop_();
254 2
255 2 retc=retc<<1;
256 2 if(VI2C_SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
257 2 _nop_();
258 2 _nop_();
259 2 }
260 1 VI2C_SCL=0;
261 1 _nop_();
262 1 _nop_();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -