?? ad.c
字號:
#define TIM *(int *)0x24
#define PRD *(int *)0x25
#define TCR *(int *)0x26
#define IMR *(int *)0x0
#define IFR *(int *)0x1
#define PMST *(int *)0x1d
ioport unsigned int port3,port4,port2;
#define AD_DATA port2
#define AD_SEL port3
#define AD_HOLD port4
void interrupt time(void);
int *ptr,k0,k1;
signed int uWork0,uWork,uWork1;
main()
{
int i,j;
asm(" ssbx INTM"); // 關閉可屏蔽中斷
k0=k1=0;
ptr=(int *)0x3000; // 轉換數據的保存區,從數據區3000H開始
// 3000H-3200H保存第1通道(AIN1)的轉換結果
// 3200H-3400H保存第2通道(AIN2)的轉換結果
for(i=0;i<0x400;i++) // 將轉換數據的保存區清0
*(ptr+i)=0;
j= PMST;
PMST = j&0xff;
IMR = 0x8;
TCR = 0x411; // 計數器分頻系數=2
TIM = 0;
PRD = 0x100; // 定時器周期=256,采樣周期=周期*分頻系數*時鐘周期
TCR = 0x421; // =512時鐘=64us
IFR = 0x100; // 其中,時鐘周期為8MHz
AD_SEL=6; // 通道選擇 A0,A1
asm(" rsbx INTM"); // 開中斷進行轉換
while ( 1 );
}
// 定時器中斷服務程序,完成:保存轉換結果、啟動下次轉換
void interrupt time(void)
{
uWork0=AD_DATA; // 從FIFO中讀取轉換結果
uWork1=AD_DATA; // 從FIFO中讀取轉換結果
uWork=uWork0&0x0f000;
if ( uWork==0x8000 )
{
uWork0<<=4; // 去掉高4位
uWork0>>=4; // 取低4位有效值
*(ptr+k0)=uWork0; // 保存結果
k0++;
if ( k0>=0x200 )
{
k0=0; // 軟中斷位置
}
}
else if ( uWork==0x9000 )
{
uWork0<<=4; // 去掉高4位
uWork0>>=4; // 取低4位有效值
*(ptr+k1+0x200)=uWork0; // 保存結果
k1++; k1%=0x200;
}
uWork=uWork1&0x0f000;
if ( uWork==0x8000 )
{
uWork1<<=4; // 去掉高4位
uWork1>>=4; // 取低4位有效值
*(ptr+k0)=uWork1; // 保存結果
k0++;
if ( k0>=0x200 )
{
k0=0; // 軟中斷位置
}
}
else if ( uWork==0x9000 )
{
uWork1<<=4; // 去掉高4位
uWork1>>=4; // 取低4位有效值
*(ptr+k1+0x200)=uWork1; // 保存結果
k1++; k1%=0x200;
}
AD_HOLD =0; // 送轉換信號
for ( uWork=0;uWork<10;uWork++ );
AD_HOLD=1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -