📄 main.lst
字号:
248 {
249 1 SDA = 1;
250 1 _nop_();
251 1 SCL = 1;
252 1 _nop_();
253 1 SCL = 0;
254 1 }
255 /*******************************************************************************
256 *** 函 数 名: static void IIC_Stop(void)
257 *** 功能描述: 终止IIC传输;
258 *** 全局变量: NO !
259 *** 输 入: NO !
260 *** 输 出: NO !
261 *** 创 建 人:huangtiexiong 日期:2006-11-28
262 *** 修 改 人: 日期:2006-11-28
263 *** 函数说明: 操作完成后保证SCL为1,同时打开中断;
264 /******************************************************************************/
265 void IIC_Stop(void)
266 {
267 1 SDA = 0; //to stop IIC;
268 1 SCL = 0;
269 1 _nop_();
270 1 SCL = 1;
271 1 _nop_();
272 1 SDA = 1; //IIC Stoped !! 结束IIC之后传输线全部置1;
273 1 EA = 1; //Set EA.
274 1 }
275 void init_serialcomm(void)
276
277 {
278 1 SCON=0x50; //在11.0592MHz下,设置串行口波特率为9600,方式1,并允许接收
279 1 PCON=0x00;
280 1 ES=1;
281 1 TMOD=0x21; //定时器工作于方式2,自动装载方式
282 1 TH0=(65536-1000)%256;
283 1 TL0=(65536-1000)/256;
284 1 TL1=0xfd;
285 1 TH1=0xfd;
286 1 ET0=1;
287 1 TR0=1;
288 1 TR1=1;
289 1 //TI=0;
290 1 // EA=1;
291 1 //TI=1;
292 1 }
293
294 void serial () interrupt 4 using 3
295
296 {
297 1
298 1 /* if(RI)
299 1
300 1 { RI=0;
301 1
302 1 ch=SBUF;
303 1
C51 COMPILER V8.08 MAIN 02/14/2008 16:13:50 PAGE 6
304 1 TI=1; //置SBUF空
305 1
306 1 switch(ch)
307 1
308 1 {
309 1
310 1 case 0x01 :printf("A"); TI=0;break;
311 1
312 1 case 0x02 :printf("B"); TI=0;break;
313 1
314 1 case 0x03 :printf("C"); TI=0;break;
315 1
316 1 case 0x04 :printf("D"); TI=0;break;
317 1
318 1 default :printf("fg"); TI=0;break;
319 1 }
320 1 }*/
321 1 }
322 //向串口发送一个字符
323 void send_char_com(unsigned char ch)
324 {
325 1 SBUF=ch; while(TI==0); TI=0;
326 1 }//向串口发送一个字符串,strlen为该字符串长度
327 void send_string_com(unsigned char *str,unsigned int strlen){
328 1 unsigned int k=0;
329 1 do { send_char_com(*(str + k)); k++; }
330 1 while(k < strlen);
331 1 }
332
333
334 void PCF8583_ReadDat(unsigned char addrInter,unsigned char num,unsigned char *buff)
335 {
336 1 unsigned char i;
337 1 IIC_Start(); //启动IIC Bus;
338 1 IIC_TxByte(0xa0); //PCF8583设备寻址;命令:写;
339 1 IIC_WaitAck(); //等待Ack信号;
340 1 IIC_TxByte(addrInter); //发送内部寄存器地址;
341 1 IIC_WaitAck(); //等待Ack信号;
342 1
343 1 IIC_Start(); //参考PCF读Read Mode时序;
344 1 IIC_TxByte(0xa1); //PCF8583设备寻址,命令:读;
345 1 IIC_WaitAck();
346 1
347 1 for(i=0;i<num-1;i++)
348 1 {
349 2 buff[i] = IIC_RxByte(); //读一个字节;
350 2 IIC_SendAck(); //发送应答信号;
351 2 }
352 1 buff[num-1] = IIC_RxByte();
353 1 IIC_SendNoAck(); //最后一个字节发送非应答信号;
354 1 IIC_Stop(); //终止本次传输,IIC Bus空闲;
355 1 }
356 /*******************************************************************************
357 *** 函 数 名: extern void PCF8583_WriteDat(unsigned char addrInter,unsigned char num,unsigned char *buff)
358 *** 功能描述: 对PCF8583写;
359 *** 全局变量: NO !
360 *** 输 入: addrInter:内部寻址;num:数据长度;buff:数据缓存;
361 *** 输 出: NO !
362 *** 创 建 人:huangtiexiong 日期:2006-11-28
363 *** 修 改 人: 日期:2006-11-28
364 *** 函数说明: IIC Start至Stop间传输的字节数不限;
365 PCF8583内部寄存器地址附自增功能;
C51 COMPILER V8.08 MAIN 02/14/2008 16:13:50 PAGE 7
366 /******************************************************************************/
367 void PCF8583_WriteDat(unsigned char addrInter,unsigned char num,unsigned char *buff)
368 {
369 1 unsigned char i;
370 1
371 1 IIC_Start();
372 1 IIC_TxByte(0xa0);
373 1 IIC_WaitAck();
374 1
375 1 IIC_TxByte(addrInter);
376 1 IIC_WaitAck();
377 1
378 1 for(i=0;i<num;i++)
379 1 {
380 2 IIC_TxByte(buff[i]);
381 2 IIC_WaitAck();
382 2 }
383 1
384 1 IIC_Stop();
385 1 }
386 /*******************************************************************************
387 *** 函 数 名: extern void PCF8583_WriteByte(unsigned char addrInter,unsigned char val)
388 *** 功能描述: 对PCF8583写一个字节;
389 *** 全局变量: NO !
390 *** 输 入: addrInter:内部寻址;val:待写字节数据;
391 *** 输 出: NO !
392 *** 创 建 人:huangtiexiong 日期:2006-11-28
393 *** 修 改 人: 日期:2006-11-28
394 *** 函数说明: 参照PCF8583读时序;
395 /******************************************************************************/
396 void PCF8583_WriteByte(unsigned char addrInter,unsigned char val)
397 {
398 1 IIC_Start();
399 1
400 1 IIC_TxByte(0xa0);
401 1 IIC_WaitAck();
402 1
403 1 IIC_TxByte(addrInter);
404 1 IIC_WaitAck();
405 1 IIC_TxByte(val);
406 1 IIC_WaitAck();
407 1
408 1 IIC_Stop();
409 1 }
410
411 void PCF8583_Init(void)
412 {
413 1 PCF8583_WriteByte(0x00,0x00); //Control reg. Alarm disabled。
414 1 }
415
416
417
418
419 /**************************************************************************************************
420 名称:SentByte
421 描述:字节数据传送子程序发送一个字节数据或地址给被控器PCF8574
422 **************************************************************************************************/
423 void sentbyte(unsigned char sentd)
424 {
425 1 unsigned char i;
426 1 for(i=0;i<8;i++) //要传送的数据长度为8 位
427 1 {
C51 COMPILER V8.08 MAIN 02/14/2008 16:13:50 PAGE 8
428 2 sentd<<=1; //要发送的数据左移
429 2 SDA=CY;
430 2 _nop_();
431 2 _nop_();
432 2 SCL=1; //置时钟线为高通知被控器开始接收数据位
433 2 _nop_(); //保证时钟高周期大于4 us
434 2 _nop_();
435 2 _nop_();
436 2 _nop_();
437 2 _nop_();
438 2 SCL=0; //钳住总线准备接收下一个数据位
439 2 }
440 1 _nop_();
441 1 _nop_();
442 1 SDA=1; //8 位发送完后释放数据线准备收应答位
443 1 _nop_();
444 1 _nop_();
445 1 SCL=1; //开始接收应答信号
446 1 _nop_();
447 1 _nop_();
448 1 _nop_();
449 1 _nop_();
450 1 _nop_(); //判断是否接收到应答信号正常转AckEnd
451 1 _nop_();
452 1 SCL=0; //发送结束钳住总线准备下一步发送或接收数据或进行其它处理
453 1 }
454 //*************************************************************************************************
455 //名称:SendData
456 //描述:发送1个字节数据给PCF8574
457 //************************************************************************************************
458 void senddata(unsigned char ucI)
459 {
460 1 unsigned char datauci=0;
461 1 IIC_Start();
462 1 sentbyte(slvadr);
463 1 datauci=ucI;
464 1 sentbyte(datauci);
465 1 IIC_Stop();
466 1 //delay_1ms(10);
467 1 }
468 unsigned char getbyte(void)
469 {
470 1
471 1 unsigned char temp,rbyte=0;
472 1 for(temp=8;temp!=0;temp--) {
473 2 SCL=1;
474 2 rbyte=rbyte<<1;
475 2 rbyte=rbyte|((unsigned char)(SDA));
476 2 SCL=0;
477 2 }
478 1 return(rbyte);
479 1 /*unsigned char i,read;
480 1
481 1
482 1
483 1
484 1 SDA=1;
485 1 for(i=0;i<8;i++) //要传送的数据长度为8 位
486 1 {
487 1 SCL=1;
488 1 //_nop_();
489 1 //_nop_();
C51 COMPILER V8.08 MAIN 02/14/2008 16:13:50 PAGE 9
490 1 //_nop_();
491 1
492 1 CY=SDA;
493 1 read<<=1; //要发送的数据左移
494 1 //_nop_();
495 1 //_nop_();
496 1 //SCL=1; //置时钟线为高通知被控器开始接收数据位
497 1 //_nop_(); //保证时钟高周期大于4 us
498 1 //_nop_();
499 1 //_nop_();
500 1 //_nop_();
501 1 //_nop_();
502 1 SCL=0; //钳住总线准备接收下一个数据位
503 1 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -