/**************** STC12c56 AD转换 入口参数:通道数(0,1,2,3,4,5,6,7) 返回值: AD转换结果 *****************/ #include<reg51.h> sfr ADC_CONTR=0xc5; //AD转换寄存器 sfr ADC_DATA=0xc6; //AD转换结果寄存器,为10位 sfr P1M0=0x91; sfr P1M1=0x92; /*************************** 微秒延时函数 ********************************/ void delay_us(unsigned int i)//延时 如果需要高精度延时 请嵌入汇编 { unsigned char a; if (i == 0) { return ; } for (a = 1; a < i; a++) { ; } } /*************************** 毫秒延时函数 ********************************/ void delay_ms(int num) { int x,y; for(y=0;y<num;y++) { for(x = 0;x <5000;x) x++; } } /********************* 入口参数:通道数(0,1,2,3,4,5,6,7) 返回值: AD转换结果 **************************/ unsigned char AD(unsigned char Channel) { unsigned char ADResult; ADC_CONTR|=0x80; //开AD转换电源 delay_ms(1); //延时1ms switch(Channel) { case 0: P1M0|=0x01;P1M1|=0x01; //设置开漏 ADC_CONTR=0xe0; //选择AD转换通道 break; case 1: P1M0|=0x02;P1M1|=0x02; ADC_CONTR=0xe1; break; case 2: P1M0|=0x04;P1M1|=0x04; ADC_CONTR=0xe2; break; case 3: P1M0|=0x08;P1M1|=0x08; ADC_CONTR=0xe3; break; case 4: P1M0|=0x10;P1M1|=0x10; ADC_CONTR=0xe4; break; case 5: P1M0|=0x20;P1M1|=0x20; ADC_CONTR=0xe5; break; case 6: P1M0|=0x40;P1M1|=0x40; ADC_CONTR=0xe6; break; case 7: P1M0|=0x80;P1M1|=0x80; ADC_CONTR=0xe7; break; } delay_us(100); ADC_DATA=0x00; ADC_CONTR|=0x08; //启动AD转换 delay_us(200); //等待转换完成 ADC_CONTR&=0xe7; //清0 ADC_FLAG,ADC_START 位,停止AD转换 ADResult=ADC_DATA; //保存转换结果 switch(Channel) { case 0: P1M0&=0xfe;P1M1&=0xfe; //设置普通IO break; case 1: P1M0&=0xfd;P1M1&=0xfd; break; case 2: P1M0&=0xfb;P1M1&=0xfb; break; case 3: P1M0&=0xf7;P1M1&=0xf7; break; case 4: P1M0&=0xef;P1M1&=0xef; break; case 5: P1M0&=0xdf;P1M1&=0xdf; break; case 6: P1M0&=0xbf;P1M1&=0xbf; break; case 7: P1M0&=0x7f;P1M1&=0x7f; break; } return ADResult; }