注释: 微控制器 DAC芯片 PORTB,COLD_OUT 连接 CLR PORTB,CS_RTD 连接 LATCH PORTB,CLK_RTD 连接 SCLK PORTB,DO_RTD 连接 DIN PORTB,DI_RTD 连接 SDO ;======================================================================================== ;= SPI 初始化更新 子程序 = = ;= = ;= 读寄存器地址:ADD_REG_RD = ;= = ;= = ;= = ; 节点 ======== 命令 ========== 系数 ========== 注解 =================================== SPI_Initinal BTFSC LED_1,DA_TRANS ; LED_1,DA_TRANS =? 1 判断是否完成配置? GOTO SPI_LOD ; 完成转到 SPI_LOD,对寄存器读取进行验证 ; - - - - - - - - - - - - - - - SPI寄存器配置 - - - - - - - - - - - - - - - - - - - - - - - CALL SPI_Contorl_reg ; 调用 控制寄存器 子程序 BSF LED_1,DA_TRANS ; 置:配置完成标志 RETURN ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SPI_LOD MOVLW H'02' ; MOVWF ADD_REG_RD ; CALL SPI_Read_reg ; 调用 读数据 子程序 RETURN ;======================================================================================== ;= SPI 写 控制寄存器 更新 子程序 = = ;= 入口参数:无 = ;= 出口参数:无 = ;= 数据格式:0X55+输出电压清零位+电压增10%+外部电流设置电阻使能位+使能位+ = ;= 压摆率控制时钟+压摆率步长+压摆率使能+菊花链使能+输出范围 = ; 节点 ======== 命令 ========== 系数 ========== 注解 =================================== SPI_Contorl_reg BCF PORTB,CS_RTD ; 清:CS MOVLW H'55' ; H'55' -> W CALL DAC_Write1B ; 调用 写子程序 MOVLW B'00110000' ; B'00010000' -> W 输出使能,外部设置电阻使能 CALL DAC_Write1B ; 调用 写子程序 MOVLW B'00000001' ; B'00010000' -> W 电压范围0-10V CALL DAC_Write1B ; 调用 写子程序 BSF PORTB,CS_RTD ; 清:CS MOVLW D'250' CALL DELAY_1 ; 调用 延时子程序 BCF PORTB,DO_RTD ; MOVLW D'250' CALL DELAY_1 ; 调用 延时子程序 RETURN ;======================================================================================== ;= SPI 读更新 子程序 = = ;= 入口参数:ADD_REG_RD(读取的寄存器地址) = ;= 出口参数:T1S_09_H:T1S_09_L(寄存器数据) = ;= = ;= = ; 节点 ======== 命令 ========== 系数 ========== 注解 =================================== SPI_Read_reg ; - - - - - - - - - - - - - - - 写读取寄存器地址 - - - - - - - - - - - - - - - - - - - - - BCF PORTB,CS_RTD ; 清:CS MOVLW H'02' ; H'02' -> W CALL DAC_Write1B ; 调用 写子程序 MOVLW H'00' ; B'00010000' -> W CALL DAC_Write1B ; 调用 写子程序 MOVF ADD_REG_RD,W ; ADD_REG_RD -> W CALL DAC_Write1B ; 调用 写子程序 BSF PORTB,CS_RTD ; 清:CS MOVLW D'250' CALL DELAY_1 ; 调用 延时子程序 BCF PORTB,DO_RTD ; MOVLW D'250' CALL DELAY_1 ; 调用 延时子程序 ; - - - - - - - - - - - - - - - 读取寄存器数据 - - - - - - - - - - - - - - - - - - - - - - BCF PORTB,CS_RTD ; 清:CS_RTD = 低电平 MOVLW D'250' CALL DELAY_1 ; 调用 延时子程序 CALL DAC_Read1B ; 调用 单字节读 子程序 CALL DAC_Read1B ; 调用 单字节读 子程序 MOVWF T1S_09_H ; 高八位数据 CALL DAC_Read1B ; 调用 单字节读 子程序 MOVWF T1S_09_L ; 低八位数据 BSF PORTB,DO_RTD ; 置:DO_RTD = 高电平 MOVLW D'250' CALL DELAY_1 ; 调用 延时子程序 BSF PORTB,CS_RTD ; 置:CS_RTD = 高电平 MOVLW D'250' CALL DELAY_1 ; 调用 延时子程序 BCF PORTB,DO_RTD ; 清:DO_RTD = 低电平 MOVLW D'250' CALL DELAY_1 ; 调用 延时子程序 RETURN ;======================================================================================== ;= DAC_Write1B 向DAC写入一个字节数据 子程序 = ;= = ;= 函数功能 : 写DAC数据 = ;= 入口参数 : W = ;= 出口参数 : 无 = ;= = ;= 振荡器:40.000MHz ( 0.100uS/步 ) 平均耗时约:xx.xmS ( 约:xxxxx步 ) = ;= = ; 节点 ======== 命令 ========== 系数 ========== 注解 ==================================== DAC_Write1B MOVWF DA_BUFFER ; 装:数据 收发 缓存器 MOVLW D'8' ; 设:发送一个字节数据左移8次 MOVWF DA_COUNT ; 装:AD 1字节循环 计数器 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DAC_Write1B_1 BTFSC DA_BUFFER,7 ; 查:"数据 收发 缓存器,7" 位是 "L" 吗? BSF PORTB,DO_RTD ; 置:DO_RTD = "H" BTFSS DA_BUFFER,7 ; 查:"数据 收发 缓存器,7" 位是 "H" 吗? BCF PORTB,DO_RTD ; 清:DO_RTD = "L" BCF PORTB,CLK_RTD ; 清:CLK_RTD = "H" MOVLW D'250' CALL DELAY_1 ; 调用 延时子程序 BSF PORTB,CLK_RTD ; 置:CLK_RTD = "L" MOVLW D'250' CALL DELAY_1 ; 调用 延时子程序 RLNCF DA_BUFFER,F ; 发送 8位数据 "DA_BUFFER" 左移一位 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DECFSZ DA_COUNT,F ; 查:已经左移8次了吗? GOTO DAC_Write1B_1 ; 没有8次,返:"DAC_Write1B_1" 处,继续发送 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BCF PORTB,CLK_RTD ; 清:CLK_RTD = 低 MOVLW D'250' CALL DELAY_1 ; 调用 延时子程序 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RETURN ; 子程序结束,返回到原来调用处 ;======================================================================================== ;= DAC_Read1B 读取一个字节数据 子程序 = ;= = ;= 函数功能 : 读取一个字节数据 = ;= 入口参数 : 无 = ;= 出口参数 : W = ;= DIN常态:高电平 = = ;= = ;= 振荡器:40.000MHz ( 0.100uS/步 ) 平均耗时约:xx.xmS ( 约:xxxxx步 ) = ;= = ; 节点 ======== 命令 ========== 系数 ========== 注解 ==================================== DAC_Read1B MOVLW D'8' ; 设:发送一个字节数据左移8次 MOVWF DA_COUNT ; 装:AD 1字节循环 计数器 CLRF DA_BUFFER ; 清:数据 收发 缓存器 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DAC_Read1B_1 BCF PORTB,CLK_RTD ; 清:CLK_RTD = 低电平 MOVLW D'250' CALL DELAY_1 ; 调用 延时子程序 BSF PORTB,CLK_RTD ; 置:CLK_RTD = 高电平 MOVLW D'250' CALL DELAY_1 ; 调用 延时子程序 BTFSC PORTB,DI_RTD ; 查:DI_RTD = "L" 吗? BSF DA_BUFFER,0 ; 置:"数据 收发 缓存器,‘0位’ = "H" RLNCF DA_BUFFER,F ; 接收 8位数据 "DA_BUFFER" 左移一位 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DECFSZ DA_COUNT,F ; 查:已经左移8次了吗? GOTO DAC_Read1B_1 ; 没有8次,返:"DAC_Read1B_1" 处,继续 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BCF PORTB,CLK_RTD ; 清:CLK_RTD = 低 MOVLW D'250' CALL DELAY_1 ; 调用 延时子程序 MOVF DA_BUFFER,W ; DA_BUFFER -> W ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RETURN ; 子程序结束,返回到原来调用处 ;======================================================================================== ;= DELAY_1 子程序 = = ;= 延时时间:T = ;= 入口参数: W = ;= 出口参数:无 = ;= = ; 节点 ======== 命令 ========== 系数 ========== 注解 =================================== DELAY_1 MOVWF T40uS_N ; W -> T40uS_N DELAY_11 NOP NOP DECFSZ T40uS_N ; T40uS_N - 1 =? 0 GOTO DELAY_11 ; ≠0 继续 RETURN