我用到死stc15w401as单片机。现在用p11作为ad输入引脚,输入变化的电压0-5v。p10引脚控制一个led闪烁,要求p11电压越大闪烁频率越大,可是我用下面的程序做不到,不知道为什,请大神给分析下,,,
#include"stc15.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
unsigned long x;
uint ADC_DATA;
void delay(uint ms)//延时
{
uchar i;
while(ms--)
for(i=0;i<120;i++);
}
void ADC_init(void)
{
P1=0xff;
P1ASF=0x02; //P1ASF的哪一位为1,对于的P1脚位ADC输入模式,为0是普通IO模式,p11设置成ad 模拟通道
CLK_DIV |= 0x20; //CLK_DIV的D5位为0,转换结果高8位存ADC_RES,低2位存ADC_RESL的低两位;
//CLK_DIV的D5位为1,转换结果低8位存ADC_RESL,高2位存ADC_RES的低两位;
ADC_CONTR |=0x80; //开AD转换电源 1000 0000
delay(80);
P1M0=0x02; //0000 0100
P1M1=0x00; //0000 0100 //设置P1.1为AD转换输入模式,模式为高阻态
}
uint ADC()
{
unsigned char DATA_H,DATA_L;
ADC_DATA =0; //清除转换结果
ADC_CONTR =0xE0; //保持电源开,设置转换速度 1110 0000
_nop_();
_nop_();
_nop_();
_nop_();
ADC_CONTR =0xE1; //保持电源开,保持转换速度,并选择P1.1输入 1110 0001
delay(10);
ADC_CONTR =0xE9; // 开转换开关 ,开始转换 1110 1001
while(ADC_CONTR & 0x10==0);//查询转换是否结束,结束后读取结果
ADC_CONTR &=0xE7;//清除转换结果标志位,关闭转换
DATA_H=ADC_RES;
DATA_L=ADC_RESL;
ADC_DATA=DATA_H;
ADC_DATA=ADC_DATA<<2;
ADC_DATA |=ADC_RESL;
ADC_CONTR=0x00;
return(ADC_DATA); //返回转化结果
}
void main(void)
{
ADC_init();
while(1)
{
ADC();
x=ADC_DATA;
x=x/1024*250000;
P10=0;
delay(x);
P10=1;
delay(x);
}
}
#include"stc15.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
unsigned long x;
uint ADC_DATA;
void delay(uint ms)//延时
{
uchar i;
while(ms--)
for(i=0;i<120;i++);
}
void ADC_init(void)
{
P1=0xff;
P1ASF=0x02; //P1ASF的哪一位为1,对于的P1脚位ADC输入模式,为0是普通IO模式,p11设置成ad 模拟通道
CLK_DIV |= 0x20; //CLK_DIV的D5位为0,转换结果高8位存ADC_RES,低2位存ADC_RESL的低两位;
//CLK_DIV的D5位为1,转换结果低8位存ADC_RESL,高2位存ADC_RES的低两位;
ADC_CONTR |=0x80; //开AD转换电源 1000 0000
delay(80);
P1M0=0x02; //0000 0100
P1M1=0x00; //0000 0100 //设置P1.1为AD转换输入模式,模式为高阻态
}
uint ADC()
{
unsigned char DATA_H,DATA_L;
ADC_DATA =0; //清除转换结果
ADC_CONTR =0xE0; //保持电源开,设置转换速度 1110 0000
_nop_();
_nop_();
_nop_();
_nop_();
ADC_CONTR =0xE1; //保持电源开,保持转换速度,并选择P1.1输入 1110 0001
delay(10);
ADC_CONTR =0xE9; // 开转换开关 ,开始转换 1110 1001
while(ADC_CONTR & 0x10==0);//查询转换是否结束,结束后读取结果
ADC_CONTR &=0xE7;//清除转换结果标志位,关闭转换
DATA_H=ADC_RES;
DATA_L=ADC_RESL;
ADC_DATA=DATA_H;
ADC_DATA=ADC_DATA<<2;
ADC_DATA |=ADC_RESL;
ADC_CONTR=0x00;
return(ADC_DATA); //返回转化结果
}
void main(void)
{
ADC_init();
while(1)
{
ADC();
x=ADC_DATA;
x=x/1024*250000;
P10=0;
delay(x);
P10=1;
delay(x);
}
}