STC12C5A60S2的AD系统问题,各位朋友给检查一下看问题出在哪里了啊
#include <STC-NEW-8051.h>#indlude <intrins.h>
#define ADC_POWER 0x80; //ADC 电源控制位
#define ADC_FLAG 0x10; //ADC 转换完成标识
#define ADC_START 0x08; //ADC 开始转换 控制
#define ADC_SPEEDLL 0x00; //540 clocks
#define ADC_SPEEDL 0x20; //360 clocks
#define ADC_SPEEDH 0x40; //180 clocks
#define ADC_SPEEDHH 0x60; //90 clocks
unsigned char Vin={0x80,0x81};
unsigned char TEMP,TEMPL;
unsigned int TEMP_value;
unsigned charGetADCResult(unsigned charchannel)
{
unsigned char AD_finished=0;
ADC_RES = 0;
channel &= 0x07;
ADC_CONTR = ADC_SPEEDL;
_nop_();
_nop_();
_nop_();
_nop_();
ADC_CONTR |= channel;
_nop_();
_nop_();
_nop_();
_nop_();
ADC_CONTR |= 0x80;
_nop_();
_nop_();
_nop_();
_nop_();
ADC_CONTR |= 0x08;
AD_finished = 0;
while (AD_finished ==0 )
{
AD_finished = (ADC_CONTR & 0x10);
}
ADC_CONTR &= 0xE7;
return (ADC_RES);
}
/*初始化 ADC 特殊功能寄存器 */
void InitADC(unsigned char n)
{
unsigned char TEMP;
TEMP=0;
P1ASF=n; //打开几个通道ADC功能
ADC_RES=0;
ADC_RESL=0; //清除以前的转换结果
TEMP|=ADC_POWER;
TEMP|=ADC_SPEEDLL;
ADC_CONTR = TEMP;
ADC_Delay(2); //ADC上电延时
}
/* 延时 */
void ADC_Delay(unsigned int n)
{
unsigned int x;
while(n--)
{
x=5000;
while(x--);
}
}
void main()
{
EA=1; //开总中断
ET1=1; //开定时器中断1
P1M0=0xff;
P1M1=0xff; //设置开漏模式
InitADC(0xff); //初始化AD1
LCD_init(); //初始化LCD
delay_ms(10);
// LCD_clear(colors);
AUXR1&= ~0x41;
while(1)
{ unsigned char i;
for(i=0;i<10;i++)
{
TEMP=GetADCResult(1);
TEMP_value=TEMP*19.53+TEMP_value;
delay_ms(50);
}
Vin=TEMP_value/10;
LCD_ShowChar(10,56,colors,colors,(Vin/100+48));
// delay_ms(10);
LCD_ShowChar(18,56,colors,colors,(Vin%100/10+48));
// delay_ms(10);
LCD_ShowChar(26,56,colors,colors,(Vin%10+48));
delay_ms(50);
}
}
P11口连接的是GP2D12红外测距,问题是不管怎么阻挡,显示屏上的数字就自个儿的在那里从小到大的跳(大概从0到256的样子),各位朋友给检查下看问题出在哪里了啊,我是自学的单片机,新手,望各位见谅啊,谢谢 各位朋友不给看看吗?
页:
[1]