发表于:2007/9/27 8:54:00
#0楼
小弟是新手,最近开发仪表用到CS5532,但是用的不是很明白。那位大虾用过,望指教。最好那位大虾给点参考程序,小弟感激不尽。这是小弟的程序,大虾们帮忙看看。
MAIN:
LCALL LONG_DELAY1
LCALL CS5532_INIT ;调用系统复位程序
MAIN1:
LCALL CS5532_ZH ;调用转换程序 ,数据存在30H(高) ~33H中
LCALL SBIN_BCD ;调用二十进制转换程序
LCALL XIANSHI ;调用显示子程序
LJMP MAIN
READ_REG:
CLR CS5532_CS
SETB CS5532_SDO
CLR CS5532_SCLK ;读寄存器程序
CLR CS5532_SDI ;数据存在以R0为首地址的4个内存单元中
MOV R1,#010H
DJNZ R1,$ ;适当延时
MOV R1,#20H ;设置移位次数
DL1:
SETB CS5532_SCLK
MOV R3,#10H ;适当延时
DJNZ R3,$
CLR CS5532_SCLK
MOV C,CS5532_SDO
MOV R3,#10H ;适当延时
DJNZ R3,$
MOV A,@R0; ;左移
RLC A
MOV @R0,A
INC R0
MOV A,@R0
RLC A
MOV @R0,A
INC R0
MOV A,@R0
RLC A
MOV @R0,A
INC R0
MOV A,@R0
RLC A
MOV @R0,A
DEC R0
DEC R0
DEC R0
DJNZ R1, DL1
RET
READ_DATA:
CLR CS5532_CS
SETB CS5532_SDO
CLR CS5532_SCLK ;读寄存器程序
CLR CS5532_SDI
NOP
NOP
NOP
MOV R1,#08H
DL2:
SETB CS5532_SCLK
MOV R3,#10H ;适当延时
DJNZ R3,$
CLR CS5532_SCLK
MOV R3,#10H ;适当延时
DJNZ R3,$
DJNZ R1,DL2
MOV R1,#20H ;设置移位次数
DL3:
SETB CS5532_SCLK
MOV R3,#10H ;适当延时
DJNZ R3,$
CLR CS5532_SCLK
MOV C,CS5532_SDO
MOV R3,#10H ;适当延时
DJNZ R3,$
MOV A,@R0 ;循环左移
RLC A
MOV @R0,A
INC R0
MOV A,@R0
RLC A
MOV @R0,A
INC R0
MOV A,@R0
RLC A
MOV @R0,A
INC R0
MOV A,@R0
RLC A
MOV @R0,A
DEC R0 ;恢复R0的值
DEC R0
DEC R0
DJNZ R1, DL3
SETB CS5532_CS
NOP
RET
SENDBYTE:
CLR CS5532_SCLK ;数据要先放到R0中
CLR CS5532_CS
MOV R1,#08H
DL4:
MOV A,R0
RLC A
MOV R0,A
MOV CS5532_SDI,C
SETB CS5532_SCLK
MOV R2,#10H
DJNZ R2,$
CLR CS5532_SCLK
MOV R2,#10H
DJNZ R2,$
DJNZ R1,DL4
CLR CS5532_SDI
RET
CS532_TXD_INIT:
CLR CS5532_SCLK ;数据要先放到R0中
CLR CS5532_CS
MOV R1,#08H
DL5:
MOV A,R0
RLC A
MOV R0,A
MOV CS5532_SDI,C
SETB CS5532_SCLK
MOV R2,#10H
DJNZ R2,$
CLR CS5532_SCLK
MOV R2,#10H
DJNZ R2,$
DJNZ R1,DL5
RET
CS5532_INIT:
SETB CS5532_CS ;系统复位
MOV R1,#10H
DJNZ R1,$
CLR CS5532_CS
CLR CS5532_SDI
MOV R1,#10H
DJNZ R1,$
MOV R5,#0FH ;发送15个字节的FFH和一个字节的FEH
DL6:
MOV R0,#0FFH
LCALL CS532_TXD_INIT
DJNZ R5,DL6
MOV R0,#0FEH
LCALL CS532_TXD_INIT ;复位完成
;写通道设置寄存器
MOV R0,#05H ;通道一,增益64,,单极
LCALL SENDBYTE ;
MOV R0,#22H
LCALL SENDBYTE
MOV R0,#00H
LCALL SENDBYTE
MOV R0,#22H
LCALL SENDBYTE
MOV R0,#00H
LCALL SENDBYTE
;写配置寄存器
MOV R0,#03H
LCALL SENDBYTE
MOV R0,#00H
LCALL SENDBYTE
MOV R0,#40H
LCALL SENDBYTE
MOV R0,#00H
LCALL SENDBYTE
MOV R0,#00H
LCALL SENDBYTE
RET
CS5532_ZH:
NOP
DL8:
SETB CS5532_CS
NOP
NOP
CLR CS5532_CS
CLR CS5532_SCLK
CLR CS5532_SDI
SETB CS5532_SDO
MOV R1,#10H
DJNZ R1,$
MOV R0,#0C0H
LCALL SENDBYTE ;连续转换命令
DL7:
JB CS5532_SDO, DL7
MOV R0,#0CH
LCALL SENDBYTE ;读转换数据命令
MOV R0,#30H ;数据存储首地址
LCALL READ_DATA
RET
MAIN:
LCALL LONG_DELAY1
LCALL CS5532_INIT ;调用系统复位程序
MAIN1:
LCALL CS5532_ZH ;调用转换程序 ,数据存在30H(高) ~33H中
LCALL SBIN_BCD ;调用二十进制转换程序
LCALL XIANSHI ;调用显示子程序
LJMP MAIN
READ_REG:
CLR CS5532_CS
SETB CS5532_SDO
CLR CS5532_SCLK ;读寄存器程序
CLR CS5532_SDI ;数据存在以R0为首地址的4个内存单元中
MOV R1,#010H
DJNZ R1,$ ;适当延时
MOV R1,#20H ;设置移位次数
DL1:
SETB CS5532_SCLK
MOV R3,#10H ;适当延时
DJNZ R3,$
CLR CS5532_SCLK
MOV C,CS5532_SDO
MOV R3,#10H ;适当延时
DJNZ R3,$
MOV A,@R0; ;左移
RLC A
MOV @R0,A
INC R0
MOV A,@R0
RLC A
MOV @R0,A
INC R0
MOV A,@R0
RLC A
MOV @R0,A
INC R0
MOV A,@R0
RLC A
MOV @R0,A
DEC R0
DEC R0
DEC R0
DJNZ R1, DL1
RET
READ_DATA:
CLR CS5532_CS
SETB CS5532_SDO
CLR CS5532_SCLK ;读寄存器程序
CLR CS5532_SDI
NOP
NOP
NOP
MOV R1,#08H
DL2:
SETB CS5532_SCLK
MOV R3,#10H ;适当延时
DJNZ R3,$
CLR CS5532_SCLK
MOV R3,#10H ;适当延时
DJNZ R3,$
DJNZ R1,DL2
MOV R1,#20H ;设置移位次数
DL3:
SETB CS5532_SCLK
MOV R3,#10H ;适当延时
DJNZ R3,$
CLR CS5532_SCLK
MOV C,CS5532_SDO
MOV R3,#10H ;适当延时
DJNZ R3,$
MOV A,@R0 ;循环左移
RLC A
MOV @R0,A
INC R0
MOV A,@R0
RLC A
MOV @R0,A
INC R0
MOV A,@R0
RLC A
MOV @R0,A
INC R0
MOV A,@R0
RLC A
MOV @R0,A
DEC R0 ;恢复R0的值
DEC R0
DEC R0
DJNZ R1, DL3
SETB CS5532_CS
NOP
RET
SENDBYTE:
CLR CS5532_SCLK ;数据要先放到R0中
CLR CS5532_CS
MOV R1,#08H
DL4:
MOV A,R0
RLC A
MOV R0,A
MOV CS5532_SDI,C
SETB CS5532_SCLK
MOV R2,#10H
DJNZ R2,$
CLR CS5532_SCLK
MOV R2,#10H
DJNZ R2,$
DJNZ R1,DL4
CLR CS5532_SDI
RET
CS532_TXD_INIT:
CLR CS5532_SCLK ;数据要先放到R0中
CLR CS5532_CS
MOV R1,#08H
DL5:
MOV A,R0
RLC A
MOV R0,A
MOV CS5532_SDI,C
SETB CS5532_SCLK
MOV R2,#10H
DJNZ R2,$
CLR CS5532_SCLK
MOV R2,#10H
DJNZ R2,$
DJNZ R1,DL5
RET
CS5532_INIT:
SETB CS5532_CS ;系统复位
MOV R1,#10H
DJNZ R1,$
CLR CS5532_CS
CLR CS5532_SDI
MOV R1,#10H
DJNZ R1,$
MOV R5,#0FH ;发送15个字节的FFH和一个字节的FEH
DL6:
MOV R0,#0FFH
LCALL CS532_TXD_INIT
DJNZ R5,DL6
MOV R0,#0FEH
LCALL CS532_TXD_INIT ;复位完成
;写通道设置寄存器
MOV R0,#05H ;通道一,增益64,,单极
LCALL SENDBYTE ;
MOV R0,#22H
LCALL SENDBYTE
MOV R0,#00H
LCALL SENDBYTE
MOV R0,#22H
LCALL SENDBYTE
MOV R0,#00H
LCALL SENDBYTE
;写配置寄存器
MOV R0,#03H
LCALL SENDBYTE
MOV R0,#00H
LCALL SENDBYTE
MOV R0,#40H
LCALL SENDBYTE
MOV R0,#00H
LCALL SENDBYTE
MOV R0,#00H
LCALL SENDBYTE
RET
CS5532_ZH:
NOP
DL8:
SETB CS5532_CS
NOP
NOP
CLR CS5532_CS
CLR CS5532_SCLK
CLR CS5532_SDI
SETB CS5532_SDO
MOV R1,#10H
DJNZ R1,$
MOV R0,#0C0H
LCALL SENDBYTE ;连续转换命令
DL7:
JB CS5532_SDO, DL7
MOV R0,#0CH
LCALL SENDBYTE ;读转换数据命令
MOV R0,#30H ;数据存储首地址
LCALL READ_DATA
RET