导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→请教有关DS1307与C51进行IIC通信的问题[darkang]

 *第34567篇: 请教有关DS1307与C51进行IIC通信的问题

  
楼 主:darkang 2005年9月20日22:25
 请教有关DS1307与C51进行IIC通信的问题
我在读写时钟芯片DS1307时,C51与其进行IIC通信没有应答,芯片地址码没问题,是什么原因,清高手指点一下,谢谢!
我的程序是:
unsigned char IICCheckAcknowledge()    /*IIC总线检测从机应答位*/
{
    unsigned char SDAState;
    SDA=1;        /*SDA=1; 线与吗?应为SDA=0?*/
 SCL=0;
    _nop_();
 _nop_();
 SCL=1;
    IICAckFlag=0;
    SDAState=SDA;
    if(SDAState==0)     /*应答正常*/
      {
    SCL=0;
    _nop_();
    _nop_();
    return(IICAckFlag);
      }
  else 
   {
       IICAckFlag=1;      /*应答不正常*/
    SCL=0;
       _nop_();
    _nop_();
    return(IICAckFlag);
   } 

就是当SCL高电平时,检测到SDA低电平就算是DS1307应答了 
IICAckFlag=0;是应答标志,先置0,如果没有应答则置1
SDAState=SDA;是采样时钟脉冲为高电平时的SDA状态,如果为高则没有应答,为低,则有应答。
这个程序有问题吗?
会不会跟电气特性不稳定有关系?
 
  
2楼:applet_sona 2005年9月21日13:23
 顶一下,也遇到相似问题。
顶一下,也遇到相似问题。
  
3楼:jackedison84 2005年11月22日10:11
 我也是一个51刚上手不久的新手
发一个DS1307汇编程序给你参考一下:

ORG 000H
AJMP PK
ORG 03H
AJMP TION1
ORG 000BH
INC 20H ;
MOV TH0,#00H
MOV TL0,#00H ;
MOV R3,20H
CJNE R3,#29H,OUTT
MOV 20H,#00H
SETB EX0
CLR ET0
OUTT:
RETI

PK:
SDA BIT P1.1
SCL BIT P1.0
SECONDS EQU 70H
MINUTES EQU 71H
HOURS EQU 72H
DAY EQU 73H
DATE EQU 74H
MONTH EQU 75H
YEAR EQU 76H
CONTROL EQU 77H
SETADDR EQU 7AH
R10 EQU 41H
R11 EQU 42H
R12 EQU 43H
R13 EQU 44H
R14 EQU 45H
MOV R14,#00H
MOV TH0,#0D8H
MOV TL0,#0EFH
MOV TMOD,#01H
SETB TR0
SETB 38H     ;
SETB 39H     ;
MOV 61H,#00H ;
mov R1,#00H
SETB SDA
SETB SCL
ACALL TIME
ACALL RECR
MOV SETADDR,#00H
MOV A,SECONDS
ANL A,#7FH
MOV R4,A
MOV R5,MINUTES
ACALL SENDSET
ACALL TIME
MOV SETADDR,#07H ;
MOV R4,#10H
MOV R5,#00H
ACALL SENDSET
SETB IT0
SETB EA
SETB EX0
MOV 51H,MINUTES
MOV 50H,HOURS
;--------------------------
;程序入口
;--------------------------
DISPLAY:
ACALL DISPLAY2
ACALL KEY
AJMP DISPLAY
;--------------------
;中断子程序入口
;--------------------
TION1:
CPL 38H
CPL 39H
INC R14
MOV R3,R14
CJNE R3,#01bH,VBT
CLR EX0
SETB ET0
CLR 38H
SETB 39H
MOV 51H,DATE
MOV A,MONTH
MOV 50H,A
VBT:CJNE R3,#01aH,VBB
CLR EX0
SETB ET0
SETB 38H
SETB 39H
MOV 51H,YEAR
MOV 50H,#20H
VBB:CJNE R3,#01cH,VOUT
CLR EX0
SETB ET0
SETB 38H
SETB 39H
MOV a,DAY
XRL A,#0F0H
MOV 51H,A
MOV 50H,#0CCH
VOUT:CJNE R3,#01dH,VVT
CLR ET0
SETB EX0
MOV 51H,MINUTES
MOV 50H,HOURS
MOV R14,#00H
VVT:NOP
NOP
ACALL RECR
RETI
;-------------------
;显示子程序入口
;-------------------
DISPLAY2:
MOV DPTR,#TAB
MOV A,51H; 分钟显示.
ANL A,#0FH
MOVC A,@A+DPTR
MOV P1,A
SETB P3.7
ACALL TIME
MOV A,R7
MOV DPTR,#TAB1
MOVC A,@A+DPTR
CLR P3.7
MOV P1,A
INC R7
ACALL TIME1
SETB P3.7
ACALL TIME
MOV DPTR,#TAB
MOV A,51H ;10分钟显示.
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P1,A
MOV C,39H
MOV P1.7,C
SETB P3.7
ACALL TIME
MOV A,R7
MOV DPTR,#TAB1
MOVC A,@A+DPTR
CLR P3.7
MOV P1,A
INC R7
ACALL TIME1
SETB P3.7
ACALL TIME

MOV DPTR,#TAB
MOV A,50H 
ANL A,#0FH
MOVC A,@A+DPTR
MOV P1,A
MOV C,38H
MOV P1.7,C
SETB P3.7
ACALL TIME
MOV A,R7
MOV DPTR,#TAB1
MOVC A,@A+DPTR
CLR P3.7
MOV P1,A
INC R7
ACALL TIME1
SETB P3.7
ACALL TIME
MOV DPTR,#TAB
MOV A,50H
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P1,A
SETB P3.7
ACALL TIME
MOV A,R7
MOV DPTR,#TAB1
MOVC A,@A+DPTR
CLR P3.7
MOV P1,A
MOV R7,#00H
ACALL TIME1
SETB P3.7
ACALL TIME
RET
;-----------------------
;键盘扫描子程序入口
;-----------------------
KEY:
JB P3.4,K1   ;
ACALL TIME1
JB P3.4,K1
CLR 38H
SETB 39H
CLR EX0
MOV 50H,MONTH
MOV 51H,DATE
ACALL DISPLAY2
JNB P3.4,KEY
MOV 51H,MINUTES
MOV 50H,HOURS
CLR 39H
SETB EX0
K1:JB P3.3,K2;
ACALL TIME1
SETB 38H
SETB 39H
CLR EX0
MOV 38H,#1B
MOV 50H,#20H
MOV 51H,YEAR
ACALL DISPLAY2
JNB P3.3,K1
MOV 51H,MINUTES
MOV 50H,HOURS
SETB EX0
K2:JB P3.1,K4
ACALL TIME1
JB P3.1,K3
INC R0
CJNE R0,#01H,SET1;
MOV R6,#00
MOV R1,#12
RIUR:
CJNE R6,#60,OTT
MOV R6,#00H
OTT:
CJNE R1,#24,TTO
MOV R1,#00H
TTO:ACALL SETTIME
ACALL OOT
JB P3.0,RIUR
ACALL SEMINUT;
MOV SETADDR,#01H
ACALL SENDSET


SET1:CJNE R0,#02H,K3;
MOV R6,#30
MOV R1,#12
CLR 38H
SETB 39H
CLR EX0
RIUY:
CJNE R6,#32,POO
MOV R6,#00H
POO:
CJNE R1,#13,PPO
MOV R1,#01H
PPO:ACALL SETTIME
ACALL OOT
JB P3.0,RIUY
CLR 39H
MOV SETADDR,#04H
ACALL SENDSET
SETB EX0
K3:CJNE R0,#03H,K4;
MOV R6,#00
SETB 38H
SETB 39H
CLR EX0
ERI:
CJNE R6,#60,PPP
MOV R6,#00H
PPP:ACALL SETTIME
MOV R1,#20
ACALL OOT
JB P3.0,ERI
MOV R0,#00H
ACALL START1
MOV A,#11010000B
ACALL SEND
ACALL ACK
MOV A,#06H
ACALL SEND
ACALL ACK
MOV A,R4
ACALL SEND
ACALL ACK
ACALL STOP
SETB EX0
K4:
RET
;--------------------------

;--------------------------
OOT:
MOV A,R6
MOV DPTR,#TAB2
MOVC A,@A+DPTR
MOV R4,A
MOV A,R1
MOVC A,@A+DPTR
MOV R5,A
RET
;-------------------

;-------------------
SETTIME:
MOV 51H,R4
MOV 50H,R5
ACALL DISPLAY2
JB P3.4,K5
ACALL TIME1
JB P3.4,K5
INC R6
SETMIN:
ACALL DISPLAY2
JNB P3.4,SETMIN
K5:
JB P3.3,SETOUT
ACALL TIME1
JB P3.3,SETOUT
INC R1
SETMIN1:
ACALL DISPLAY2
JNB P3.3,SETMIN1
SETOUT:
RET
;--------------------

;--------------------
SENDSET:
ACALL START1
MOV A,#11010000B
ACALL SEND
ACALL ACK
MOV A,SETADDR
ACALL SEND 
ACALL ACK
MOV A,R4
ACALL SEND
ACALL ACK
MOV A,R5
ACALL SEND
ACALL ACK
ACALL STOP
RET
;-------------------

;-------------------
RECR:
ACALL START1
MOV A,#11010000B
ACALL SEND
ACALL ACK

MOV A,#00H
ACALL SEND
ACALL ACK
ACALL STOP

ACALL START1
MOV A,#11010001B
ACALL SEND
ACALL ACK
CLR A
ACALL RCIER  ;
MOV SECONDS,A
ACALL ACK1
CLR A
ACALL RCIER
MOV MINUTES,A
ACALL ACK1
CLR A
ACALL RCIER
MOV HOURS,A
ACALL ACK1
CLR A
ACALL RCIER
MOV DAY,A
ACALL ACK1
CLR A
ACALL RCIER
MOV DATE,A
ACALL ACK1
CLR A
ACALL RCIER
MOV MONTH,A
ACALL ACK1
CLR A
ACALL RCIER
MOV YEAR,A
CLR A
ACALL STOP
RET
;-------------------

;-------------------
START1:
SETB SDA
SETB SCL
ACALL TIME
CLR SDA
ACALL TIME
CLR SCL
ACALL TIME
RET
;------------------
;;
;------------------
SEND:
MOV R3,#08H  
Y1:RLC A
MOV SDA,C
ACALL TIME
SETB SCL
ACALL TIME
CLR SCL
DJNZ R3,Y1
RET
;-------------------

;-------------------
RCIER:
MOV R3,#08H
OOP:SETB SCL
ACALL TIME
MOV C,SDA
RLC A
CLR SCL
DJNZ R3,OOP
RET
;-------------------

;-------------------
ACK:SETB SDA 
ACALL TIME
SETB SCL
ACALL TIME
TRE:MOV C,SDA
JC TRE
CLR SCL
RET
;--------------------

;--------------------
STOP:SETB SDA
ACALL TIME
CLR SCL
NOP
NOP
CLR SDA
ACALL TIME
SETB SCL
ACALL TIME
SETB SDA
ACALL TIME
RET
;-------------------------

;-------------------------
ACK1:CLR SDA
ACALL TIME
SETB SCL
ACALL TIME
CLR SCL
SETB SDA
RET
;-------------------------
;;-------------------------
SEMINUT:
ACALL START1
MOV A,#11010000B
ACALL SEND
ACALL ACK
MOV A,#10H
ACALL SEND
ACALL ACK
ACALL STOP
RET
;---------------------
;;---------------------
TIME:NOP  
NOP
NOP
NOP
NOP
NOP
NOP
RET

TIME1:MOV 60H,#63H
NOP
DJNZ 60H,$
RET
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H
DB 0F8H,80H,90H,0C0H,0BFH,0FFH
TAB1:DB 00H,04H,08H,0CH

TAB2:DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H
DB 10H,11H,12H,13H,14H,15H,16H,17H,18H,19H
DB 20H,21H,22H,23H,24H,25H,26H,27H,28H,29H
DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H,48H,49H
DB 50H,51H,52H,53H,54H,55H,56H,57H,58H,59H

END


>>>>>>对该主题发表你的看法

本主题贴数3,分页: [第1页]


[上一篇主题]:求援MC68332单片机中文说明书

[下一篇主题]:[原创] 我自己写的多线程调度器更新了~针对2410