/*引脚:
* RA0即AN0配置为模拟输入,接力传感器
* RA3即AN3配置为模拟输入,接红外传感器
* RB4配置为数字输出,接LED灯
*/
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
void Init(); //IO口初始化函数
void Ad_Init(); //ADC初始化函数
uint DataProces(); //数据处理函数
void main()
{
uint vf=0,vr=0;
Init();
Ad_Init();
ADCON0bits.GO=1; //启动第一次AD转换
while(1)
{
while(PIR1bits.ADIF==0); //等待ADC转换完成
PIR1bits.ADIF=0; /*ADC中断标志位清零*/
switch (ADCON0bits.CHS) //判断是哪个通道转换完成
{
case 0: //如果是AN0通道
vf=DataProces(); //力传感器电压mV
ADCON0bits.CHS=0x03; //配置到AN3通道
break;
case 1: break;
case 2: break;
case 3: //如果是AN3通道
vr=DataProces(); //红外传感器电压值mV
ADCON0bits.CHS=0x00; //配置到AN0通道
break;
}
if(vf<=1600 && vr<=38) //对两个电压值mV进行判定
{
RB4=1; //点亮LED
}
else
RB4=0; //熄灭LED
ADCON0bits.GO=1; //启动AD转换
}
}
void Init()//输出io口初始化
{
TRISBbits.TRISB4=0; /*设置RB4为输出*/
ANSELHbits.ANS11=0; /*设置AN11为数字通道*/
}
void Ad_Init()//ad转换IO寄存器设置
{
TRISA|=0x09; /*设置RA0,RA3为输入*/
ANSEL|=0x09; /*设置RA0,RA3为模拟通道*/
ADCON0=0x41; //Fosc/8,ADON,AN0
ADCON1=0x00; //结果左对齐,参考电压为VDD,VSS
PIR1bits.ADIF=0; /*ADC中断标志位清零*/
}
uint DataProces()//把AD采样值处理为电压值(mV)
{
uint temp=0;
float v=0;
temp=ADRESH; //从ADC中取出12位的采样值
temp=(temp<<2)+(ADRESL>>6);
v=(float)(temp+1)/204.8; //采样值转换成电压V
v=v*1000; //将电压值转换为mV单位
return (int)v;
} |