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

2019-03-25 18:55发布

哪位大神能帮忙给个PIC单片机两路模拟量的编程例子学习一下啊,谢谢
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
nmg
1楼-- · 2019-03-26 00:54
帮你呼叫丁丁版主
@dingzy_2002
dingzy_2002
2楼-- · 2019-03-26 04:14
要汇编的还是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
dingzy_2002
3楼-- · 2019-03-26 07:29
本帖最后由 dingzy_2002 于 2016-8-25 09:28 编辑

二、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_max<i)
                fuel_ad_max=i;
        if(fuel_ad_min>i)
                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);
}
/*---------------------------------------------*/
/*文件结束*/
809930477
4楼-- · 2019-03-26 09:50
 精彩回答 2  元偷偷看……
jinhai4385
5楼-- · 2019-03-26 14:44
谢谢分享!正在学习.....
ysyhj
6楼-- · 2019-03-26 17:54
tWord adc10_conv(tByte ad_ch)

一周热门 更多>