哪位大神能帮忙给个PIC单片机两路模拟量的编程例子学习一下啊,谢谢
要汇编的还是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
二、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 编辑
tWord adc10_conv(tByte ad_ch)