仿真原理图如下(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)
|