MMA7455发送资料
源代码在线查看: function.lst
C51 COMPILER V7.06 FUNCTION 06/22/2010 11:50:31 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE FUNCTION
OBJECT MODULE PLACED IN function.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE function.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include
2 #include
3 sbit IICSDA = P1^6;
4 sbit IICSCL = P1^7;
5 bit ack; /*应答标志位*/
6
7 unsigned char Para[2]={0x45,0x80};
8 /****************************************
9 延时函数,用于IIC通讯延时
10 *****************************************/
11 void _Nop()
12 {
13 1 unsigned char i;
14 1 for(i=0;i 15 1 {
16 2 _nop_();
17 2 }
18 1 }
19
20
21 /*******************************************************************
22 起动总线函数
23 函数原型: void Start_I2c();
24 功能: 启动I2C总线,即发送I2C起始条件.
25 ********************************************************************/
26 void Start_I2c()
27 {
28 1 IICSDA=1; /*发送起始条件的数据信号 */
29 1 _Nop();
30 1 IICSCL=1;
31 1 _Nop(); /*起始条件建立时间大于4.7us,延时 */
32 1 _Nop();
33 1 _Nop();
34 1 _Nop();
35 1 _Nop();
36 1 IICSDA=0; /*发送起始信号 */
37 1 _Nop(); /* 起始条件锁定时间大于4μs*/
38 1 _Nop();
39 1 _Nop();
40 1 _Nop();
41 1 _Nop();
42 1 IICSCL=0; /*钳住I2C总线,准备发送或接收数据 */
43 1 _Nop();
44 1 _Nop();
45 1 }
46 /*******************************************************************
47 结束总线函数
48 函数原型: void Stop_I2c();
49 功能: 结束I2C总线,即发送I2C结束条件.
50 ********************************************************************/
51 void Stop_I2c()
52 {
53 1 IICSDA=0; /*发送结束条件的数据信号 */
54 1 _Nop(); /*发送结束条件的时钟信号 */
55 1 IICSCL=1; /*结束条件建立时间大于4μs*/
C51 COMPILER V7.06 FUNCTION 06/22/2010 11:50:31 PAGE 2
56 1 _Nop();
57 1 _Nop();
58 1 _Nop();
59 1 _Nop();
60 1 _Nop();
61 1 IICSDA=1; /*发送I2C总线结束信号 */
62 1 _Nop();
63 1 _Nop();
64 1 _Nop();
65 1 _Nop();
66 1 }
67 /*******************************************************************
68 字节数据发送函数
69 函数原型: void SendByte(uchar c);
70 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
71 此状态位进行操作.(不应答或非应答都使ack=0)
72 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
73 ********************************************************************/
74 void SendByte(unsigned char c)
75 {
76 1 unsigned char BitCnt;
77 1
78 1 for(BitCnt=0;BitCnt 79 1 {
80 2 if((c 81 2 else IICSDA=0;
82 2 _Nop();
83 2 IICSCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
84 2 _Nop();
85 2 _Nop(); /*保证时钟高电平周期大于4μs*/
86 2 _Nop();
87 2 _Nop();
88 2 _Nop();
89 2 IICSCL=0;
90 2 }
91 1
92 1 _Nop();
93 1 _Nop();
94 1 IICSDA=1; /*8位发送完后释放数据线,准备接收应答位*/
95 1 _Nop();
96 1 _Nop();
97 1 IICSCL=1;
98 1 _Nop();
99 1 _Nop();
100 1 _Nop();
101 1 if(IICSDA==1)ack=0;
102 1 else ack=1; /*判断是否接收到应答信号*/
103 1 IICSCL=0;
104 1 _Nop();
105 1 _Nop();
106 1 }
107 /*******************************************************************
108 字节数据接收函数
109 函数原型: uchar RcvByte();
110 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
111 发完后请用应答函数应答从机。
112 ********************************************************************/
113 unsigned char RcvByte()
114 {
115 1 unsigned char retc;
116 1 unsigned char BitCnt;
117 1
C51 COMPILER V7.06 FUNCTION 06/22/2010 11:50:31 PAGE 3
118 1 retc=0;
119 1 IICSDA=1; /*置数据线为输入方式 */
120 1 for(BitCnt=0;BitCnt 121 1 {
122 2 _Nop();
123 2 IICSCL=0; /*置时钟线为低,准备接收数据位*/
124 2 _Nop();
125 2 _Nop(); /*时钟低电平周期大于4.7μs*/
126 2 _Nop();
127 2 _Nop();
128 2 _Nop();
129 2 IICSCL=1; /*置时钟线为高使数据线上数据有效*/
130 2 _Nop();
131 2 _Nop();
132 2 retc=retc 133 2 if(IICSDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
134 2 _Nop();
135 2 _Nop();
136 2 }
137 1 IICSCL=0;
138 1 _Nop();
139 1 _Nop();
140 1 return(retc);
141 1 }
142 /********************************************************************
143 应答子函数
144 函数原型: void Ack_I2c(bit a);
145 功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
146 ********************************************************************/
147 void Ack_I2c(bit a)
148 {
149 1
150 1 if(a==0)IICSDA=0; /*在此发出应答或非应答信号 */
151 1 else IICSDA=1;
152 1 _Nop();
153 1 _Nop();
154 1 _Nop();
155 1 IICSCL=1;
156 1 _Nop();
157 1 _Nop(); /*时钟低电平周期大于4μs*/
158 1 _Nop();
159 1 _Nop();
160 1 _Nop();
161 1 IICSCL=0; /*清时钟线,钳住I2C总线以便继续接收 */
162 1 _Nop();
163 1 _Nop();
164 1 }
165
166 /*******************************************************************
167 向有子地址器件发送多字节数据函数
168 函数原型: bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no);
169 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
170 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
171 如果返回1表示操作成功,否则操作有误。
172 注意: 使用前必须已结束总线。
173 ********************************************************************/
174 bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
175 {
176 1 unsigned char i;
177 1
178 1 Start_I2c(); /*启动总线 */
179 1 SendByte(sla); /*发送器件地址 */
C51 COMPILER V7.06 FUNCTION 06/22/2010 11:50:31 PAGE 4
180 1 if(ack==0)return(0);
181 1 SendByte(suba); /*发送器件子地址 */
182 1 if(ack==0)return(0);
183 1
184 1 for(i=0;i 185 1 {
186 2 SendByte(*s); /*发送数据 */
187 2 if(ack==0)return(0);
188 2 s++;
189 2 }
190 1 Stop_I2c(); /*结束总线 */
191 1 return(1);
192 1 }
193 /*******************************************************************
194 向有子地址器件读取多字节数据函数
195 函数原型: bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no);
196 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
197 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
198 如果返回1表示操作成功,否则操作有误。
199 注意: 使用前必须已结束总线。
200 ********************************************************************/
201 bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
202
203 {
204 1 unsigned char i;
205 1
206 1 Start_I2c(); /*启动总线 */
207 1 SendByte(sla); /*发送器件地址 */
208 1 if(ack==0)return(0);
209 1 SendByte(suba); /*发送器件子地址 */
210 1 if(ack==0)return(0);
211 1
212 1 Start_I2c(); /*重新启动总线 */
213 1 SendByte(sla+1);
214 1 if(ack==0)return(0);
215 1 for(i=0;i 216 1 {
217 2 *s=RcvByte(); /*发送数据 */
218 2 Ack_I2c(0); /*发送就答位*/
219 2 s++;
220 2 }
221 1 *s=RcvByte();
222 1 Ack_I2c(1); /*发送非应位*/
223 1 Stop_I2c(); /*结束总线 */
224 1 return(1);
225 1 }
226
227 /*********************************
228 串口初始化
229 *********************************/
230 void UART_Init()
231 {
232 1 P1M1=0x0C0;
233 1 P1M2=0x0C0; //端口初始化
234 1 SCON=0x50; //使能接收选择串口模式1
235 1 SSTAT=0xE0; //选择独立的Tx/Rx中断
236 1 BRGR0=0x0f0; //9600 baud @ 7.373MHz
237 1 BRGR1=0x02;
238 1 BRGCON =0x03; //使能BRG
239 1 ES=1; //ESR=Enable Serial Recieve
240 1 //EA=1; //使能中断
241 1 }
C51 COMPILER V7.06 FUNCTION 06/22/2010 11:50:31 PAGE 5
242 //---------------------------
243 /*********************************
244 按键端口初始化
245 *********************************/
246 void IO_Init()
247 {
248 1 P0M1=0x00;
249 1 P0M2=0x00; //端口初始化
250 1 P0=0x0FF;
251 1 /*
252 1 KBPATN = 0x00;//赋初值 ,KBI0=0
253 1 KBCON = 0x00;//值不同时中断
254 1 KBMASK = 0x01; //KBI0使能
255 1 EKBI = 1;
256 1 */
257 1 }
258 /*********************************
259 MMA7455L初始化
260 *********************************/
261 void MMA7455L_Init()
262 {
263 1 ISendStr(0x3A,0x16,&Para[0],1);//2g ,Measurement Mode
264 1 _Nop();
265 1 ISendStr(0x3A,0x18,&Para[1],1);//125HZ,x,y,z axis enable,INR1 is use ,P/N threshold value
266 1 _Nop();
267 1
268 1 }
269 /////////////调试用,用户可以屏蔽////////////////
270 /*********************************
271 发送数据
272 *********************************/
273 void SendData (char temp)
274 {
275 1 SBUF=temp; //发送数据
276 1 while(TI==0); //当TI为1时发送完毕
277 1 TI=0; //TI清0准备下一次发送
278 1 }
279 //////////////////////////////////////////////////
280 /*********************************
281 初始化定时器
282 *********************************/
283 void InitTimer()
284 {
285 1 TMOD=0X01;
286 1 TAMOD=0X00;
287 1 TH0=0X00;
288 1 TL0=0X00;
289 1 ET0=1;
290 1 TR0=1;
291 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 445 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 12
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)