#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就会显示一个值,但是当采集电压的时候,显示的值又不会改变。 |