查看: 10094|回复: 1

[提问] ICL7135采样问题

[复制链接]
发表于 2014-4-4 14:57:29 | 显示全部楼层 |阅读模式
关键词: STC , ICL7135 , AD采样
想用ICL7135采集电压,单独控制AD的时候程序没有问题,但是程序联调的时候就不正确了,在>2V输入时,单片机的计数器无法计数到20000,目前最惨的时候只有5000左右,联调的时候,低电压的计数倒是没有问题,这是怎么回事?编译用的是KEIL。

以下是AD部分代码,AD的时钟由T0定时器提供,控制用的是查询模式,用中断模式会莫名的丢失T1计数器的计数值,这点我也一直没想明白。MCU用的是STC12C5A60S2,输入晶振为8MHz,AD时钟为1MHz,下面的程序系统时钟是2MHz,但去掉时钟分频,让单片机跑到8MHz,AD跑1MHz时,计数器的计数值始终是0...
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          {
                 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)

发表于 2015-1-31 18:52:19 | 显示全部楼层
过来学习一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表