| 
 
| #include<stc12.h> #include<intrins.h>
 
 #define uchar unsigned char
 #define uint  unsigned int
 
 
 sbit LCD1602_E=P2^7;
 sbit LCD1602_RW=P2^5;
 sbit LCD1602_RS=P2^6;
 
 void Lcd1602_Delay1ms(uint c);    //误差 0us
 void LcdWriteCom(uchar com);   //LCD1602写入8位命令子函数
 void LcdWriteData(uchar dat);   //LCD1602写入8位数据子函数
 void LcdInit();       //LCD1602初始化子程序
 void adInit(void);
 unsigned int getAd(unsigned char channel);
 
 
 unsigned char Num[]="the AD result :";
 
 
 void main()
 {
 uint ad,a1,a2,a3,a;
 LcdInit();
 adInit();
 for(a=0;a<15;a++)
 LcdWriteData(Num[a]);
 while(1)
 {
 ad=getAd(0);
 ad=(ad*5)/1024;
 a1=ad/100;
 a2=ad%100/10;
 a3=ad%10;
 LcdWriteCom(0x80+0x40);
 LcdWriteData('0');
 LcdWriteData(0x30+a2);
 LcdWriteData(0x30+a3);
 }
 
 
 }
 void adInit(void)
 {
 P1ASF=0x07; //P1.0/P1.1/P1.2口全部作为模拟功能AD使用
 P1M0 = 0xff;
 P1M1 = 0xff;
 ADC_RES=0;   //清零转换结果寄存器高8位
 ADC_RESL=0; //清零转换结果寄存器低2位
 ADC_CONTR=0x80;//开启AD电源
 Lcd1602_Delay1ms(1);   //等待1ms,让AD电源稳定
 }
 unsigned int getAd(unsigned char channel)
 {
 ADC_CONTR=0x88|channel;    //开启AD转换1000 1000 即POWER SPEED1 SPEED0 ADC_FLAG   ADC_START CHS2 CHS1 CHS0
 _nop_();
 _nop_();
 _nop_();
 _nop_();//要经过4个CPU时钟的延时,其值才能够保证被设置进ADC_CONTR 寄存器
 
 while(!(ADC_CONTR&0x10));    //等待转换完成
 ADC_CONTR&=0xe7;      //关闭AD转换,ADC_FLAG位由软件清0
 return(ADC_RES*4+ADC_RESL);   //返回AD转换完成的10位数据(16进制)
 }
 
 
 
 其中我省略了1602显示的函数,那几个子函数没有问题的。 每次给单片机上电,P1口滞空,1602就会显示一个值,但是当采集电压的时候,显示的值又不会改变。
 | 
 |