#include<pic.h>
#include<eeprom_routines.h>
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0xFF32);
uint initnum; //定义一个溢出中断的变量
uchar receive;
uchar SJ; //eeprom数据
uchar AD_HIGH,AD_LOW; //AD转换结果
uint adval; //16位AD转换结果
bit flag;
bit flag_write;
//-------------------------------------------------------
//延时子程序
void delay(uint dat)
{
unsigned int k;
for(k=0;k<dat;k++);
}
//--------------------------------------------------------------------------------
void init()
{
//-----------普通I/O口设置---------------------------------------------------------
// ADCON0=0X00; //关闭PORTA及E口AD功能
// ADCON1=0X06; //PORTA口及E口全设置为I/O口
//--------------------------------------------------------------------------------
//----------AD口设置---------------------------------------------------------------
ADCON0=0X41; //转换速度FOSC/8,选择模拟通道0(RA0/AN0),使能AD功能
ADCON1=0X84; //右对齐,端口配置RA0/RA1/RA3为A口,其余为D口
AD_HIGH=0X00;
AD_LOW=0X00;
adval=0x0000;
delay(1200);
//---------------------------------------------------------------------------------
CMCON=0x07; //比较器关闭,RA0-RA3为IO
CVRCON=0x00; //比较器电源关闭
TRISA=0B00001011; //RA0/AN0/RA1/RA3口作为模拟口,设置为输入
TRISB=0x00;
TRISC=0XCF; //串口用时 RC7/RC6必须是输入
TRISD=0X00;
TRISE=0X00;
PORTA=0X3F;
PORTB=0XFF;
PORTC=0XFF;
PORTD=0XFF;
PORTE=0X07;
INTCON=0xc0; //设置中断控制寄存器为11000000,始终只用到两个位开总中断,开第一外设允许中断
PIE1=0x01; //使能定时器1为00000001开中断,始终只用一最后一个其他的不用理会
TMR1L=(65536-50000)%256; //装初傎,因为定时器1是16位的,要装满65536个数后才满加1(也就是65536us),如果设50ms(50000us)就加1,则要先装一个初值65536-50000
TMR1H=(65536-50000)/256; //又因为要将初值分开装在低八位和高位里,而八位只有256个数,所以对256求模得整数看有多少个256装在高八位,余下的属于低八位的就求余
T1CON=0x01; //00000001在初始化中只用到最后一位就是开始启到动定时器1(设置预分频器和后分频器)
flag=0;
SJ=0xFF;
flag_write=0;
SPBRG=71; //设置波特率为9600BPS
TXSTA=0X24; //使能串口发送,选择高速波特率 //0010 0100
RCSTA=0X90; //使能串口工作,连续接收 //1001 0000
RCIE=1; //使能接收中断 //0000 0001
RC5=0;
receive=0xff;
}
//-----------AD转换------------------------------------------
void AD_ZH(void)
{
GO_DONE=1;
while(GO_DONE);
AD_HIGH=ADRESH;
AD_LOW=ADRESL;
adval=AD_HIGH;
adval=adval<<8|AD_LOW;
}
//-------------------------中断-----------------------------------------------------
void interrupt time1() //定时器的程序,后面不用写和51单片机那样的序号,也不用就算写在主函数的后面也不用声明
{
if(TMR1IF)
{
TMR1IF=0; //先清零,同时知道是用TMR1定时器
TMR1L=(65536-50000)%256; //也要重新装一次初值,从这个初值的基础上加
TMR1H=(65536-50000)/256;
initnum++; //加一
if(initnum==60) //它每50ms产生溢出中断,20次则是一秒
{
initnum=0; //到了1s后清零
flag=1; //取反,再到第二次溢出又取反电平
}
}
if(RCIE&&RCIF) //判断是否为串口接收中断
{
RCIF=0;
receive=RCREG; //接收数据并存储
flag_write=1;
RC5=1;
TXREG=receive;
while(!TRMT);
RC5=0;
}
}
//-------------------------------------------------------------------------------
void main()
{
init();
SJ=EEPROM_READ(0);
RC4=0;
delay(10000);
RC4=1;
while(1)
{
PORTB=SJ;
//-------------------------------------------------
if(adval>512) RE0=0;
else RE0=1;
//--------------------------------------------------
if((flag_write==1)&&(RC0==0))
{
flag_write=0;
EEPROM_WRITE(0,receive);
RC4=0;
delay(10000);
SJ=EEPROM_READ(0);
RC4=1;
//-------------------------------------------------
ADCON0=0X41;
AD_ZH();
RC5=1;
TXREG=AD_HIGH;
while(!TRMT);
TXREG=AD_LOW;
while(!TRMT);
RC5=0;
//-----------------------------------------------
ADCON0=0X49;
AD_ZH();
RC5=1;
TXREG=AD_HIGH;
while(!TRMT);
TXREG=AD_LOW;
while(!TRMT);
RC5=0;
}
if(flag==1)
{
flag=0;
// RA1=!RA1;
RA2=!RA2;
// RA3=!RA3;
RA4=!RA4;
RA5=!RA5;
RE1=!RE1;
RE2=!RE2;
PORTD=~PORTD;
}
}
}
本人是PIC初学者,学习AD转换时,当只设置RA0口为A口时,AD转换功能正常,当按如上程序设计时,RA0和RA1转换时,结果就有相互影响,不知道为什么,请教大侠们什么问题,研究了很久,无果!! |