2020-01-24 11:59发布
wallelectronics 发表于 2012-8-17 08:18 内部晶振还是外部晶振、是否分频? 看门狗是否开启?? AD乱跳是什么概念?跳了多少数,模拟信号接的什么信 ...
hengjng_t 发表于 2012-8-17 09:51 用的是 内部晶振,没分频! 看门狗 没开! AD 跳的范围很大,有几十的误差, 我是直接用精密滑动电阻器分 ...
最多设置5个标签!
看门狗是否开启??
AD乱跳是什么概念?跳了多少数,模拟信号接的什么信号?可以接一个恒定的信号,再看看还跳不跳。
用的是 内部晶振,没分频!
看门狗 没开!
AD 跳的范围很大,有几十的误差, 我是直接用精密滑动电阻器分压来做的,信号应该是很稳的,以前用STC的单片机这种方法没有问题!
我想应该是 单片机不熟悉,哪里设置不清楚,所以会有这样的结果!我把相关代码 贴上去,望大侠指教,谢谢!
AD相关代码
//-------AD define--------
#define AN0 0x00
#define AN1 0x02
#define AN2 0x04
#define AN3 0x06
#define AN4 0x08
#define AN5 0x0a
#define AN6 0x0c
#define AN7 0x0e
//*****************系统初始化**********************//
void system_int()
{
P1CR=0xff;
P1PCR=0xff;
P1=0X00;
P2CR=0xff;
P2PCR=0xff;
P2=0X00;
P3CR=0xff;
P3PCR=0xff;
P3=0X00;
P4CR=0x0f; //设置p4.0为输入
P4PCR=0x0f; //关上拉电阻
P4=0X00;
P5CR=0xff;
P5PCR=0xff;
P5=0X00;
}
//***************AD 采集****************//
uint get_adc(uchar ch)
{
// int i,adc;
ADCON = 0x80; //允许ADC模块
ADT = 0x20; //DC时钟为系统时钟的32分频
ADCH = 0x01; //选择AD输入通道
ADCON |= ch; //选择CH1通道
for(i=0;i<250;i++);
ADCON |= 0x01; //开始ADC转换
while(ADCON&0x01);
adc = ADDH;
adc<<=2;
adc = adc + ADDL;
return adc;
}
//********************AD 求平均******************//
void AD_COUNT()
{
AD1=get_adc(AN0);//ADchange(AN0);//
AD_zhong=AD_zhong+AD1;
c++;
if(c==50)
{
AD_jun=AD_zhong/50 ;
AD_zhong=0;
c=0;
}
}
定时器相关代码
//*****************系统初始化**********************//
void system_int()
{
P1CR=0xff;
P1PCR=0xff;
P1=0X00;
P2CR=0xff;
P2PCR=0xff;
P2=0X00;
P3CR=0xff;
P3PCR=0xff;
P3=0X00;
P4CR=0x0f; //设置p4.0为输入
P4PCR=0x0f; //关上拉电阻
P4=0X00;
P5CR=0xff;
P5PCR=0xff;
P5=0X00;
}
//*****************定时器 初始化********************//
void time_int()
{
CLKCON = 0x00;
T2CON=0X00; //定时器2 控制寄存器 16位自动重载方式
T2MOD=0x00;//
RCAP2H = 0xff;
RCAP2L = 0xad;
TH2 = 0xff;
TL2 = 0xad;
IEN0 = 0xa0;
TR2=1;
TF2=0;
ET2=1;//使能T2中断
EA=1;//开总中断
}
void Time2(void) interrupt 5
{
TF2=0;
aa++;
}
我没用过这个片子,用的是165,有几个小建议:
1.不用每次读数据都配置AD吧,初始化一次就够了……,配置AD后有个建立时间;
2.adc = adc + ADDL; ADDL只有低两位有效,把高六位清零后再和adc相加吧;
3.先别平均,光看看读出来的数据,虽然平均很简单,但也有可能出错,不要引入那么多不确定的因素。
一周热门 更多>