下面是程序
#include<pic.h>
#define uint unsigned int
#define uchar unsigned char
__CONFIG(0x3BE4);//0x3b34
void reset();
void delayus(uint x ,uchar y);
void delay(uint x);
uchar getad();//获取函数选择AN11 ADCON0=0X2D;
uchar getad1();//获取函数选择AN10 ADCON0=0X29;
//uchar k;
void main()
{
// k=1;
uchar r,g,n,f;
r=0;
g=0;
n=0;
f=0;
reset();
PORTC=0X30;
r=getad();
while(!(r<180&&r>80));
r=getad();
while(!(r<180&&r>80));
r=getad();
while(!(r<180&&r>80));
PORTB=0X40;
delay(2);
r=getad1();
if(r<4) n++;//短路检测
r=getad1();
if(r<4) n++;//短路检测
r=getad1();
if(r<4) n++;//短路检测
while(n==3)
{
PORTB=0;
}
r=getad1();
if(r>89) f++;//开路检测1
r=getad1();
if(r>89) f++;//开路检测2
r=getad1();
if(r>89) f++;//开路检测3
r=getad1();
if(r>89) f++;//开路检测4
r=getad1();
if(r>89) f++;//开路检测5
r=getad1();
if(r>89) f++;//开路检测6
while(f>=4)
{
PORTB=0;
}
delay(30);
INTCON=0XC0;//中断配置设置
TMR1IE=1;//开启中断
TMR1L=(65536-2000)%256;//中断初始值高位设置
TMR1H=(65536-2000)/256;//中断初始值低位设置
T1CON=0X01;//定时器开启时间设置是2ms切换一次
g=getad1();//测试函数
r=getad();//测试函数
while((r>80&&r<180)&&(g>4&&g<89))
{
g=getad1();//测试函数
r=getad();//测试函数
}
PORTB=0;
}
void reset()
{
OSCCON=0x61; //晶振选择4M 默认选项可以不写
TRISA=0XFF; //A端口全部选择输入
TRISB=0X30; //RB6\RB7是输出控制端口RB4\RB5是AD端口检测脚位B端口引脚只有4位全部使用完
TRISC=0; //C端口RC4\RC5\RC6\RC7控制,其他端口不使用选择输出
PORTB=0;//示波器测试出现瞬态高电平点测试是否配置位导致的
ADRESH=0; //AD转换高位数值清零
ADRESL=0; //AD转换低位数值清零
ANSELH=0X0C;//AN10、AN11模拟输入(xxxx1111)XXXX AN11\AN10\AN9\AN8
}
/**毫秒级延时**/
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=108;b>0;b--);
}
/**微秒级延时**/
void delayus(uint x ,uchar y)
{
uint i;
uchar j;
for(i=x;i>0;i--);
for(j=y;j>0;j--);
}
uchar getad1()//高电压点测试函数
{
uchar adval;
ADCON1=0X10;//ADCON1=0X10;//选择fosc/8 //ADCON1=0X50;fosc/16先设置后开启
ADCON0=0X29;//选择AN10 ADCON0=0X29;选择AN11 ADCON0=0X2D;先设置后开启
delay(1);//采样电容稳定时间
GO=1;//启动转换
while(GO);//等待标志位清零
adval=ADRESH;//读取高位数据
ADON=0;//关闭AD的上电
return(adval);
}
uchar getad()//输入电压测试函数
{
uchar adval;
ADCON1=0X10;//ADCON1=0X10;//选择fosc/8 //ADCON1=0X50;fosc/16
ADCON0=0X2D;//选择AN10 ADCON0=0X29;选择AN11 ADCON0=0X2D;
delay(1);//采样电容稳定时间
GO=1;//启动转换
while(GO);//等待标志位清零
adval=ADRESH;//读取高位数据
ADON=0;//关闭AD的上电
return(adval);
}
void interrupt kk()//切换脉冲
{
T1IF=0;//定时器标志位清零
TMR1L=(65536-2000)%256;//定时延迟2ms
TMR1H=(65536-2000)/256;
PORTC=~PORTC;//按位去反方波
}
现象是只要我的两个AD转换程序一调用,B端口的输出(PORTB=0X40;)电平就会发生变化。
AD转换会影响其它引脚的输出电平吗?
|