标题:
求助STC15W408AS片内ADC的使用问题
[打印本页]
作者:
kelos3000
时间:
2017-7-25 10:35
标题:
求助STC15W408AS片内ADC的使用问题
麻烦大家帮我看看 死活都没数值!
#include<STC15F2K60S2.h>
#include "intrins.h" // 11.0592MHz
sfr ADCCFG = 0xde;
unsigned int va,ADC_DATA;
unsigned int vv[9];
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}
void Delay100ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 5;
j = 52;
k = 195;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void InitADC ()
{
P1=0xff;
P1ASF=0x20;
CLK_DIV|=0x20;
ADC_CONTR =0x80; // ADC 1000 0000
Delay100ms();
P1M0 = 0x20; // 0010 0000 P1.5 ADC
P1M1 = 0x00;//
}
unsigned int GetAD()
{
unsigned char DATA_H,DATA_L;
ADC_DATA=0;
ADC_CONTR = 0x80; //1110 0000 AD ADC_CONTR = 0x8d; // AD
Delay1ms();
ADC_CONTR = 0x85;// 1110 0101
Delay10ms();
ADC_CONTR = 0x8d; //1110 1101
while(ADC_CONTR & 0x10==0);// //while (!(ADC_CONTR & 0x10));
ADC_CONTR &= ~0x10; //ADC_CONTR &=0xE7;
DATA_H=ADC_RES;
DATA_L=ADC_RESL;
ADC_DATA=DATA_H;
ADC_DATA=ADC_DATA<<2; //result=ADC_RES*4+ADC_RESL;
ADC_DATA |=ADC_RESL;
ADC_DATA=ADC_DATA/1024*500;
//ADC_CONTR=0x00;//ADC_CONTR |=0x80;
ADC_CONTR =0x00;
return (ADC_DATA);
}
unsigned int AD_average()
{
unsigned int va1;
unsigned char mi;
va1 = GetAD();
for(mi=0;mi<10;mi++)
{
vv[mi]=GetAD();
}
va=vv[0]+vv[1]+vv[2]+vv[3]+vv[4]+vv[5]+vv[6]+vv[7]+vv[8]+vv[9];
va=va/10;
return (va);
}
void ioinit()
{
P3M0 = 0x00; P3M1 = 0x00;P5M0 = 0x00; P5M1 = 0x00;
P10=0;P11=0;P3=0x00;Delay100ms();Delay100ms();Delay100ms();Delay100ms();Delay100ms();P3=0xff;P10=1;P11=1;
}
void main(void)
{
unsigned int V_ad1,V_ad;
ioinit();
InitADC ();
while(1)
{
V_ad1=GetAD() ;
V_ad=GetAD() ;
if(V_ad>=200)
{
P3=0x00;
}
else P3=0xff;
}
}
作者:
kelos3000
时间:
2017-7-25 15:17
大神指点指点啊
作者:
wulin
时间:
2017-7-25 21:11
这么简单的程序你洋洋洒洒写了这么多?给你一个STC15W404AS实际应用的程序(ADC相关部分)参考
/*-------------------------
宏定义ADC的操作命令
--------------------------*/
#define ADC_POWER 0x80 //ADC power control dit (宏定义ADC电源控制位)
#define ADC_FLAG 0x10 //ADC complete flag (宏定义ADC完成标志位)
#define ADC_START 0x08 //ADC start control dit (宏定义ADC启动控制位)
#define ADC_SPEEDLL 0x00 //420 clocks (宏定义420时钟)速度控制
//#define ADC_SPEEDL 0x20 //280 clocks (宏定义280时钟)速度控制
//#define ADC_SPEEDH 0x40 //140 clocks (宏定义140时钟)速度控制
//#define ADC_SPEEDHH 0x60 //70 clocks (宏定义70时钟)速度控制
/*------------------------
初始化ADC
-------------------------*/
void InitADC()
{
P1M1 = 0x01; //设置P1.0高阻
P1M0 = 0x00; //设置P1.0高阻
P1ASF=0x01; //设置P1的0通道端口作为模拟输入
ADC_RES=0; //清除ADC_RES存储器以前的结果
ADC_RESL=0; //清除ADC_RESL存储器以前的结果
ADC_CONTR=ADC_POWER|ADC_SPEEDLL;//ADC 开启电源、转换速度
delayms(1); //上电延时1ms
}
/*---------------------------
获取ADC结果
----------------------------*/
uint Read(uchar CHA)
{
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|CHA|ADC_START;//启动转换1000 1000
_nop_(); //延时确保正确读到ADC_CONTR寄存器的值
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR & ADC_FLAG)); //等待ADC转换完成标志置位
ADC_CONTR &=~ADC_FLAG; //关闭ADC
return(ADC_RES*4+ADC_RESL); //返回十位ADC结果
}
作者:
songshengguo123
时间:
2019-6-30 06:02
wulin 发表于 2017-7-25 21:11
这么简单的程序你洋洋洒洒写了这么多?给你一个STC15W404AS实际应用的程序(ADC相关部分)参考
/*-------- ...
这程序stc15w408as适用?请大师指点
作者:
神剑无敌
时间:
2020-2-11 21:45
小兄弟,408与404如管脚封装一致差别只是在flash容量上有区别。
作者:
peiguoqing
时间:
2020-2-13 15:43
ADC_CONTR = 0x80; //1110 0000 AD ADC_CONTR = 0x8d; // AD
Delay1ms();
ADC_CONTR = 0x85;// 1110 0101
Delay10ms();
ADC_CONTR = 0x8d; //1110 1101 这地方怎么回事?8 ==1110??
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1