高手哇,现身吧! 我用PIC处理横流的问题脉宽不调整,帮忙看看程序吧: org 0x1ff movlw 0x1e org 0x00 movwf OSCCAL ;时钟校准同时GP2设为数字IO main ;主程序由此开始 MOVLW 0x00 ;初始化IO MOVWF GPIO movlw 0xcf ;设置禁止弱上拉,禁止引脚电平变化唤醒,预分频器指向WDT,1:128倍分频,看门狗周期2.3秒 OPTION ;GP2设为数字IO movlw 0xc5 ;配置ADCON0为GP0模拟输入,GP1为数字IO,模拟输入通道为GP0,使能AD转换 movwf ADCON0 movlw 0x0b ;设置I/O方向,GP0、GP3输入,GP1、GP2输出 TRIS GPIO clrf buffer_old ;把模数转换结果寄存器清零 clrf buffer_new movlw 0x03 ;比较次数计数器送初值 movwf comp_count movlw 0xff ;起始充电时间循环次数寄存器送初值60次 movwf tim_5min clrf low_level ;相关变量送初值 clrf var_4 movlw 0xff ;电池数量计算初值 movwf bat_no_ movlw 0x08 ;起始充电时连续检测到8次(约16秒)电压无变化 movwf var_equ_tim ;-------------------电池检测阶段,无电池或电池电压过低则在此等候,电池完好充电开始------------------------------ movlw 0x55 movwf low_level goto circle org 0x70 circle bsf ADCON0,CHS0 MOVLW 0X04 MOVWF GPIO call samp_flit ;bsf ADCON0,1 ;启动AD转换 ;call ad_simp_dela ;btfsc ADCON0,1 ;测试转换是否完成,完成则取值比较,否则继续等待 ;goto $-1 movlw 0x19 subwf buffer_new,0 btfsc STATUS,Z goto _low btfss STATUS,C goto $+2 goto $+3 incf low_level,1 GOTO _low decf low_level,1 GOTO _low clrwdt _low MOVLW 0X00 MOVWF GPIO movf low_level,0 movwf var_2 decfsz var_2,1 goto $-1 clrwdt ;decfsz var_1,1 GOTO circle return org 0x8f ;------------------电池电压采样,数字滤波程序段----------------------------------------------------- samp_flit ;BCF ADCON0,CHS0 movlw 0x4 movwf ad_count ad_sigle bsf ADCON0,1 ;启动AD转换 call ad_simp_dela btfsc ADCON0,1 ;测试转换是否完成,完成则取值比较,否则继续等待 goto $-1 movf ADRES,0 ;取本次转换结果 addwf ad_temp_l,1 btfsc STATUS,C incf ad_temp_h decfsz ad_count,1 goto ad_sigle bcf STATUS,C movlw 0x03 movwf div_count div_sigle btfss ad_temp_h,0 goto $+3 bsf STATUS,C GOTO $+2 bcf STATUS,C rrf ad_temp_l,1 rrf ad_temp_h,1 decfsz div_count,1 goto div_sigle movf ad_temp_l,0 movwf buffer_new clrwdt return end |