void ADC_Init()
{
ADC0MX = 0x12; //P2.2模拟输入
ADC0CF = 0x00; //转换时间周期控制,右对齐,复位值0xF0;
ADC0CN = 0x02; //AD0EN=0,ADC0 Burst Mode Closed,写CNV启动中断
ADC0TK = 0xF9; //Pre-tracking mode F8 3个 F9 4个
}
void Port_IO_Init()
{
P0MDIN = 0xFD; //P0.1 模拟输入 MISO 0.5不能配置成模拟输出,否则接收不到数据
P1MDIN = 0xFB; //P1.2 Vref模拟输入
P2MDIN = 0xFB; //P2.2 ADC电压采集输入
P0MDOUT = 0x9D; //P0.3,P0.4Tx,P0.7LYreset P0.0(SCK),P0.2(MOSI)推免输出
P1MDOUT = 0x40; //P1.6 SPI CS 推免输ru
P2MDOUT = 0x1B; //P2.0 SHT11 HTSCK,P2.1 SHT11 HTDATA,P2.3 GATE,P2.4 LY WK
P1SKIP = 0x07; //X1,X2,Vref跳过
P2SKIP = 0x04; //跳过P2.2 ADC输入
XBR0 = 0x03; //UART0连接到端口
XBR1 = 0x50; //使能
}
/******晶振初始化*******/
void Oscillator_Init()
{
OSCXCN = 0x20; //有源晶振2分频,11059200/2
CLKSEL = 0x01; //选择外部时钟
OSCICN = 0x00; //关闭内部时钟
}
/********中断初始化********/
void Interrupts_Init()
{
EIE1 = 0x08; //ADC转换结束中断使能
IE = 0x10; //UART0中断使能
ES0=1;
}
void UART_Init()
{
SCON0 = 0x10;
}
/********CPU初始化********/
void Init_Device(void)
{
Timer_Init();
UART_Init();
SPI_Init();
ADC_Init();
Port_IO_Init();
Oscillator_Init();
Interrupts_Init();
lcd_config();
}
void task()
{
switch(UARTCmd)
{
case 0x36: if(Flag){
Gate=0;
AD0INT=0; //ADC中断完成标志
for(i=0;i<200;i++){}///时间长了进不去中断
AD0EN=1;
Gate=1;
Flag=0;
}
else{
Gate=0;
AD0EN=0;
}break;
default : break;
}
}
//UART0中断
void UART0_ISR(void) interrupt 4
{
uint i;
if(RI0)
{
UARTCmd = SBUF0; //读缓冲区数据
Delayms(10); //不加延时会出错
RI0=0;
Flag=1;
}
}
void ADC_INTI(void) interrupt 10
{
AD0INT=0;
Gate=0;
ADCtemp=(ADC0H|0xFFFF)<<8|ADC0L;
ADCtemp=ADCtemp>>4; //每次为连续转换1次结果8位结果
DataTable[1]=ADCtemp;
data_convertor( ADCtemp); //液晶屏显示
Display();
Gate=1;
Delayms(10);
}
|