|
想用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)
2014-4-4 14:57 上傳
點擊文件名下載附件
下載積分: 積分 -1
|
|