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