您的当前位置:首页正文

ADS1256多路采集汇编程序

来源:个人技术集锦
;;;;;;;;;;;;;;;;;ADS1256汇编驱动程序;;;;;;;;;;;;;;;;;;;;;;;;;;作者蔡雄略;;;;;;;;;;;;;;;;;;;;;;;使用说明;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;使用时只需在程序初始化时调用初始化函数LCALLADS1256_INIT;;然后在主循环中调用读数据函数即可LCALLADS1256READDATE;;注意调用读数据前需要确定好是读取哪一路的数据,对R4赋值0-7分别对应1-8路,赋值后再调用ADS1256READDATE;;即可读出数据,读出的数据保存在DATA_HI----DATA_MID----DATA_LOW中;;调用例子如下:;;LCALLADS1256_INIT;;------;;------;;------;;;;MOVR4,#1;;读取第二路数据LCALLADS1256READDATE;;------调用完成后数据已经保存在DATA_HI----DATA_MID----DATA_LOW这是24位数据将其乘以0.00000059453即是所采样电压;;------备注:若采样AD值大于7FFFFF,则AD值=0X1000000-AD,再乘以0.00000059453即是所采样电压;;------;;------;;END;;---------------------------------------------------------------------------------;;以下子程序请拷贝到程序中;;---------------------------------------------------------------------------------;;----------------------------------------;;SPI_READ占用通用寄存器R1,R5;;出口R5;;----------------------------------------SPI_READ:MOVR1,#08H;置循环次数SPIIN1:SETBCLK;使使时钟输出为1LCALLSPI_DELAYCLRCLK;使时钟输出为0NOPNOPMOVC,D_OUT;从机输出SPISO送进位CRLCA;左移至累加器ACC;LCALLSPI_DELAYNOPNOPDJNZR1,SPIIN1;判断是否循环8次(8位数据)MOVR5,A;8位数据送R0RET;;----------------------------------------;;SPI_WRITE数据入口R0;;占用寄存器R0,R1,A;;ADS1256要求SCL高电平和低电平持续时间最小200ns;;----------------------------------------SPI_WRITE:;SETBCLK;使P1.1(时钟)输出为1MOVR1,#08H;置循环次数MOVA,R0;8位数据送累加器ACCSPIOUT1:RLCA;左移至累加器ACC最高位至CMOVD_IN,C;进位C送从机输入SPISI线上SETBCLK;时钟输出为1;CALLSPI_DELAYNOPNOPCLRCLK;使时钟输出为0维持50nS;CALLSPI_DELAYDJNZR1,SPIOUT1;判是否循环8次(8位数据)RET;;----------------------------------------;;SPI延时;;----------------------------------------SPI_DELAY:MOVR0,#78HDELAY_LOOP:DJNZR0,DELAY_LOOPRET;;------------------------------------------;;向ADS1256中地址为regaddr的寄存器写入一个字节databyte;;入口R2-寄存器地址;;入口R3-待写入数据;;------------------------------------------ADS1256WREG:CLRCSJBDRDY,$;ADS1256是在SCK下降沿采样D_OUT数据,数据必须MOVA,#0FHANLA,R2;;;;;;;;;ORLA,#ADS1256_CMD_WREG;;;;;;;;;;MOVR0,ALCALLSPI_WRITEMOVR0,#0HLCALLSPI_WRITEMOVA,R3MOVR0,ALCALLSPI_WRITESETBCSRET;;------------------------------------------------;;初始化ADS1256;;------------------------------------------------ADS1256_INIT:;;---------------------------自校准JBDRDY,$CLRCSMOVR0,#ADS1256_CMD_SELFCALLCALLSPI_WRITEJBDRDY,$SETBCS;;-------------------------MOVR2,#ADS1256_STATUSMOVR3,#06H;高位在前、校准、使用缓冲LCALLADS1256WREG;MOVR2,#ADS1256_STATUS;MOVR3,#04H;LCALLADS1256WREG;高位在前、不使用缓冲;MOV#R2,#ADS1256_MUX;MOVR3,#08H;初始化端口A0为‘+’,AINCOM位‘-’;LCALLADS1256WREGMOVR2,#ADS1256_ADCONJBGAIN_CHO,NEXT;放大倍数16MOVR3,#ADS1256_GAIN_16JMPNEXT1NEXT:MOVR3,#ADS1256_GAIN_1NEXT1:LCALLADS1256WREGMOVR2,#ADS1256_DRATEMOVR3,#ADS1256_DRATE_PSLCALLADS1256WREG;放大倍数1MOVR2,#ADS1256_IOMOVR3,#0HLCALLADS1256WREG;;---------------------------自校准JBDRDY,$CLRCSMOVR0,#ADS1256_CMD_SELFCALLCALLSPI_WRITEJBDRDY,$SETBCSMOVDATA_HI,#0MOVDATA_MID,#0MOVDATA_LOW,#0MOVC,GAIN_CHOMOVIO_BUF,CRET;;-----------------------------------------;;R4输入CHANNEL;;采集后的数据R5,R6,R7;;-----------------------------------------ADS1256READDATE:JBIO_BUF,BIT_1JMPBIT_0BIT_1:JBGAIN_CHO,NORMALJMPNOEQUALBIT_0:JNBGAIN_CHO,NORMALNOEQUAL:LCALLADS1256_INITMOVC,GAIN_CHOMOVIO_BUF,CNORMAL:JBDRDY,$MOVR2,#ADS1256_MUXMOVA,R4RLCARLCARLCARLCAORLA,#ADS1256_MUXN_AINCOMMOVR3,ALCALLADS1256WREGCLRCSMOVR0,#ADS1256_CMD_SYNCLCALLSPI_WRITEMOVR0,#ADS1256_CMD_WAKEUPLCALLSPI_WRITEMOVR0,#ADS1256_CMD_RDATALCALLSPI_WRITELCALLSPI_READMOVDATA_HI,R5;BYTE1LCALLSPI_READMOVDATA_MID,R5;BYTE2LCALLSPI_READMOVDATA_LOW,R5;BYTE3SETBCSRET;;--------------------------------------------------------

因篇幅问题不能全部显示,请点此查看更多更全内容