[求助] PIC单片机两路模拟量编程求助

czwukun   2016-8-24 13:44 楼主
哪位大神能帮忙给个PIC单片机两路模拟量的编程例子学习一下啊,谢谢

回复评论 (6)

帮你呼叫丁丁版主
@dingzy_2002
点赞  2016-8-24 16:45
要汇编的还是C的?
一、汇编例程(PIC16F883):
①主程序(节选自我自己的一款车用仪表程序)
;-----------------
;油量AD转换及累加
        MOVLW        FUEL_CH       
        CALL        AD_CONV
        ADDWF        FUEL_DA_COMPL        ;数据与上50MS平均数据进行平均
        MOVFW        ADRESH
        BTFSC        STATUS,C
        INCF        ADRESH,W
        ADDWF        FUEL_DA_COMPH
        RRF        FUEL_DA_COMPH
        RRF        FUEL_DA_COMPL

        MOVFW        FUEL_DA_COMPL        ;平均后的数据进行累加
        ADDWF        FUEL_DAL
        MOVFW        FUEL_DA_COMPH
        BTFSC        STATUS,C
        INCF        FUEL_DA_COMPH,W
        ADDWF        FUEL_DAH
②子程序
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;32微秒延时,并开启AD转换,检测AD转换成功子程序
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
AD_CONV:        MOVWF        ADCON0
        BSF        ADCON0,ADON
        CLRF        R7
        DECFSZ        R7
        GOTO        $-1
        BSF        ADCON0,GO_DONE
        BTFSC        ADCON0,GO_DONE
        GOTO        $-1
        BSF        STATUS,RP0
        MOVFW        ADRESL
        CLRF        STATUS
        BCF        ADCON0,ADON
        RETURN
点赞  2016-8-25 09:24
二、C语言版: ①运算函数 void ad_opt(void) { uint8_t ang_da,comp_da,ang_value=0,count; uint16_t i; //油量AD转换并累加: i=adc10_conv(fuel_ch); fuel_data_add+=i; if(fuel_ad_maxi) fuel_ad_min=i; } ②子函数: /*--------------------------------------------- 函数名: uint16_t adc10_conv(uint8_t ad_ch) 描述: AD转换函数(10位结果) 输入: 要进行转换的通道 输出: 转换后的数据 ---------------------------------------------*/ uint16_t adc10_conv(uint8_t ad_ch) { uint16_t ad_value; ADFM = 1; //结果右对齐 ADCON0 = ad_ch; // ADON = 1; //打开AD模块 delay_5us; GO = 1; //启动转换 while(GO) ; //等待转换完成 ADON = 0; //关闭AD模块 ad_value = (uint16_t)(ADRESL | (ADRESH << 8)); //注意是10位的转换精度 value、temph应为unsigned int 变量 return(ad_value); } /*--------------------------------------------- 函数名: uint16_t adc8_conv(uint8_t ad_ch) 描述: AD转换函数(8位结果) 输入: 要进行转换的通道 输出: 转换后的数据 ---------------------------------------------*/ uint8_t adc8_conv(uint8_t ad_ch) { ADFM = 0; //结果左对齐 ADCON0 = ad_ch; // ADON = 1; //打开AD模块 delay_5us; GO = 1; //启动转换 while(GO) ; //等待转换完成 ADON = 0; //关闭AD模块 return(ADRESH); } /*---------------------------------------------*/ /*文件结束*/ 本帖最后由 dingzy_2002 于 2016-8-25 09:28 编辑
点赞  2016-8-25 09:26
我这个程序可以显示两路AD采集,希望对你有所帮助
点赞  2016-11-24 23:35
谢谢分享!正在学习.....
点赞  2016-12-12 10:19
tWord adc10_conv(tByte ad_ch)
点赞  2016-12-30 22:12
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复