本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
想用ICL7135采集电压,单独控制AD的时候程序没有问题,但是程序联调的时候就不正确了,在>2V输入时,单片机的计数器无法计数到20000,目前最惨的时候只有5000左右,联调的时候,低电压的计数倒是没有问题,这是怎么回事?编译用的是KEIL。
一下是AD部分代码,AD的时钟由T0定时器提供,频率为1MHz,控制用的是查询模式,用中断模式会莫名的丢失T1计数器的计数值,这点我也一直没想明白。
void sys_init()
{
/*系统时钟设置*/
CLK_DIV = 0x02; //4分频 = 2MHz
/*外设驱动时钟设置*/
TMOD |= 0x02;
TL0 = 0xff;
TH0 = 0xff; //2分频
AUXR |= 0xc0; //T0,T1工作在1T模式下
WAKE_CLKO |= 0x01; //允许T0输出时钟
TR0 = 1;
/*PCA软件定时器设置*/
CCON = 0;
CMOD = 0x09; //系统时钟,2MHz,CF中断使能
CCAPM0 = 0x49; //PCA软件定时模式,使能中断
/*启用P4口*/
P4SW = 0xff;
/*开启总中断*/
EA = 1;
}
/*
* ADC控制函数
*/
void ADC_init()
{
TMOD |= 0x50; //16位计数器
TL1 = 0;
TH1 = 0;
}
void ADC_sample(uint sample_addr[],uchar sample_pol_addr[],uchar times)
{
uchar i;
sample_start:
for(i=0;i<times;i++)
{
TL1 = 0;
TH1 = 0;
while(!ADC_BUSY) _nop_();
TR1 = 1;
while(ADC_BUSY) _nop_();
TR1 = 0;
ADC_POL = 1;
sample_pol_addr = ~ADC_POL;
sample_addr = TH1 * 256 + TL1;
if(sample_addr < 10001) sample_addr = 0;
else sample_addr = sample_addr - 10001; //正向积分10000个时钟,关闭定时器1个时钟
}
}
单独调试上面这段程序和LCD显示,完全没问题!_(:з」∠)_
再付一个全程序,里面有硬件接口示意图:
LCR.zip
(4.73 KB, 下载次数: 1)
求大家帮我看看,这是怎么回事 |