📄 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,k;
signed int uWork,uWork1;
main()
{
int i,j;
asm(" ssbx INTM"); // 关闭可屏蔽中断
k=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 = 0x412; // 计数器分频系数=2
TIM = 0;
PRD = 0x100; // 定时器周期=256,采样周期=周期*分频系数*时钟周期
TCR = 0x422; // =512时钟=64us
IFR = 0x100; // 其中,时钟周期为8MHz
AD_SEL=6; // 通道选择 A0,A1
asm(" rsbx INTM"); // 开中断进行转换
while ( 1 );
}
// 定时器中断服务程序,完成:保存转换结果、启动下次转换
void interrupt time(void)
{
uWork=AD_DATA; // 从FIFO中读取转换结果
uWork1=( (uWork&0x0f000)==0x8000 )?(0):(0x200);
uWork<<=4; // 去掉高4位
uWork>>=4;
*(ptr+k+uWork1)=uWork; // 保存结果
uWork=AD_DATA; // 从FIFO中读取转换结果
uWork1=( (uWork&0x0f000)==0x8000 )?(0):(0x200);
uWork<<=4; // 去掉高4位
uWork>>=4;
*(ptr+k+uWork1)=uWork; // 保存结果
k++;
if ( k>=0x200 )
{
k=0; // 软中断位置
}
AD_HOLD =0; // 送转换信号
for ( uWork=0;uWork<10;uWork++ );
AD_HOLD=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -