仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- ;AD轉換的數據在20H-25H,讀出的數據在24H
- ACK BIT 20H.0 ;應答標志位ACK=0表示無應答
- SCL BIT P2.0 ;時鐘線
- SDA BIT P2.1 ;數據線
- WADD EQU 21H ;器件地址(從地址)
- SUBD EQU 22H ;器件內部地址(子地址)
- NUMBR EQU 23H ;需讀取的字節數
- RDATA EQU 25H ;讀出數據的存放首地址
-
-
- QJCSH: MOV 20H,#00H
- MOV 21H,#00H
- MOV 22H,#00H
- MOV 23H,#00H
- MOV 24H,#00H
- MOV 25H,#00H
- MOV 30H,#00H
- MOV 31H,#00H
- MOV 32H,#00H
- MOV 33H,#00H
- MOV TMOD,#51H
- MOV TL0,#00H
- MOV TH0,#4CH
- MOV TL1,#00H
- MOV TH1,#00H
- SETB EA
- SETB ET0
- SETB ET1
- RET
- LJMP START
- ORG 000BH
- LJMP IT0P
- ORG 001BH
- LJMP IT1P
- ORG 0100H
- START: MOV SP,#60H
- MOV SCON,#00H
- LCALL QJCSH;???
-
- ;ad轉換子程序
- DQAD: MOV WADD,#90H ;寫入PCF8591的地址
- MOV SUBD,#40H ;寫入PCF8591的控制字
- MOV NUMBR,#1 ;寫入需讀取的字節數
- MOV RDATA,#24H ;送入首地址
- LCALL READI2C ;讀PCF8591子程序
- MOV A,24H
- ;從I2C總線讀取N個字節數據子程序
- READI2C:LCALL STARTI2C ;啟動I2C總線
- MOV A,WADD ;送入器件地址
- LCALL WI2C ;向I2C總線發送一個字節數據子程序
- LCALL RACK ;讀取從機應答子程序
- JNB ACK,ROUT ;判斷從機有無應答ACK=0則無應答
- MOV A,SUBD ;?送入器件內部地址
- LCALL WI2C
- LCALL RACK
- LCALL STARTI2C
- MOV A,WADD
- INC A
- LCALL WI2C
- LCALL RACK
- JNB ACK,READI2C
- MOV R0,RDATA
- RI2C2: LCALL RI2C
- MOV @R0,A
- DJNZ NUMBR,RI2C1
- LCALL NMACK
- ROUT: LCALL STOPI2C
- MOV RDATA,#24H
- RET
- RI2C1: LCALL MACK
- INC R0
- SJMP RI2C2
- ;I2C?總線啟動子程序
- STARTI2C:SETB SDA
- SETB SCL
- NOP
- NOP
- NOP
- NOP
- NOP
- CLR SDA
- NOP
- NOP
- NOP
- NOP
- NOP
- CLR SCL
- RET
- ;I2C總線停止子程序
- STOPI2C:CLR SDA
- SETB SCL
- NOP
- NOP
- NOP
- NOP
- NOP
- SETB SDA
- RET
- ;主機應答子程序
- MACK: CLR SDA
- SETB SCL
- NOP
- NOP
- NOP
- NOP
- NOP
- CLR SCL
- RET
- ;主機非應答子程序
- NMACK: SETB SDA
- SETB SCL
- NOP
- NOP
- NOP
- NOP
- NOP
- CLR SCL
- RET
- ;向I2C總線發送一個字節數據子程序
- WI2C: MOV R7,#8
- WLP: RLC A
- MOV SDA,C
- NOP
- SETB SCL
- NOP
- NOP
- NOP
- NOP
- NOP
- CLR SCL
- DJNZ R7,WLP
- RET
- ;從I2C總線讀取一個字節數據子程序
- RI2C: MOV R7,#8
- CLR A
- SETB SDA
- NOP
- RLP: SETB SCL
- NOP
- NOP
- MOV C,SDA
- NOP
- CLR SCL
- RLC A
- NOP
- NOP
- NOP
- NOP
- DJNZ R7,RLP
- NOP
- RET
-
- ;讀取從機應答子程序
- RACK: SETB SDA
- NOP
- NOP
- SETB SCL
- CLR ACK
- NOP
- NOP
- MOV C,SDA
- JC ACKEND
- SETB ACK
- ACKEND: NOP
- CLR SCL
- NOP
- RET
-
- ;DA轉換程序
- ORG 1000H ;000000000000000000000
- DAZH: CLR P2.4
- SETB P2.5
- CLR P2.6
- MOV R0,#0FEH
- MOVX @R0,A
- RET
-
- ;測速程序
- ORG 0000H
- RESET: LJMP CESU
- CESU: MOV SP,#60H
- MOV B,#14H
- MOV R0,#00H
- MOV R1,#70H
- MOV TMOD,#51H
- MOV TL0,#00H
- MOV TH0,#4CH
- MOV TL1,#00H
- MOV TH1,#00H
- SETB ET0
- SETB ET1
- SETB EA
- SETB TR0
- SETB TR1
- HERE: SJMP HERE
- IT0P: MOV TL0,#00H
- MOV TH0,#4CH
- DJNZ B,RTURN
- CLR TR0
- SETB F0
- IT1P: MOV R1,TH1
- MOV R0,TL1
- MOV B,3CH ;60的16進制
- MOV A,R0
- MUL AB ;1s轉速轉換成1min轉速
- MOV R1,B
- MOV R0,A
- MOV A,R0
- ANL A,#0FH
- MOV 30H,A
- MOV A,R0
- SWAP A
- ANL A,#0FH
- MOV 31H,A
- MOV A,R1
- ANL A,#0FH
- MOV 32H,A
- MOV A,R1
- SWAP A
- ANL A,#0FH
- MOV 33H,A
- CLR TR1
- SETB F0
- RTURN: RETI
- ;顯示程序
- XS: CLR TI
- MOV R0,#30
- MOV R1,#4
- SEND: MOV A,@R0
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- CPL A
- MOV SBUF,A
- JNB TI,$
- CLR TI
- INC R0
- DJNZ R1,SEND
- RET
- TAB: DB 0C0H,0F9H,0A4H,0B0H,99H
- DB 92H,82H,0F8H,80H,90H
- END
復制代碼
全部資料51hei下載地址:
1.rar
(141.45 KB, 下載次數: 13)
2019-1-10 09:22 上傳
點擊文件名下載附件
|