📄 ad.c
字号:
#include "2407c.h"
#define ADCNUMBER 256
void interrupt gptime1(void); /* 中断服务程序,用于设置保存标志 */
void ADInit(void); /* 初始化A/D转换模块和通用定时器1 及SCI模块*/
void wait(int nWait);
void scisent(void);
unsigned int uWork,uWork1,nADCount,*pResult1;
int nNewConvert,nWork;
unsigned int nADCIn0[ADCNUMBER]; /* 存储区1,保存通道ADCIN0的转换结果,循环保存 */
unsigned int byte[3];
main()
{
asm(" CLRC SXM"); /* 清标志,关中断 */
asm(" CLRC OVM");
asm(" CLRC CNF");
pResult1=RESULT0;
nNewConvert=0;
*WDCR=0x6f;
*WDKEY=0x5555;
*WDKEY=0xaaaa; /* 关闭看门狗中断 */
*SCSR1=0x81fe; /* 打开所有外设,设置时钟频率为40MHz */
uWork=(*WSGR); /* 设置I/O等待状态为0 */
uWork&=0x0fe3f;
(*WSGR)=uWork;
ADInit(); /* 初始化A/D相关设备 */
*IMR=3; /* 使能定时器中断 */
*IFR=0xffff; /* 清所有中断标志 */
asm(" clrc INTM"); /* 开中断 */
while ( 1 )
{
if ( nNewConvert ) /* 如果保存标志置位,以下开始转换和保存转换结果 */
{
nNewConvert=0; /* 清保存标志 */
uWork=(*pResult1); /* 取ADCINT0通道转换结果 */
uWork>>=6; /* 移位去掉低6位 */
nADCIn0[nADCount]=uWork;/* 保存结果 */
byte[0]=byte[1]=nADCIn0[nADCount]; /*低8位*/
byte[1]>>=8; /*移位去掉低8位*/ /*得到高8位*/
byte[2]=0xff;
scisent();
nADCount++;
if ( nADCount>=ADCNUMBER )
{
nADCount=0;
}
}
}
}
void ADInit(void) /* 初始化设置 */
{
int i;
for ( i=0;i<ADCNUMBER;i++ ) /* 缓冲区清0 */
nADCIn0[i]=0;
*ADCTRL1= 0x2040; /* 设置连续转换模式 */
*MAXCONV = 0x1; /* 每次完成转换两个通道 */
*CHSELSEQ1=0x10; /* 转换次序,先ADCIN0,再ADCIN1 */
*ADCTRL2= 0x2000; /* 启动转换 */
nADCount=nWork=0;
/* 以下设置通用定时器参数 */
*EVAIMRA = 0x80; /* 使能T1PINT */
*EVAIFRA = 0xffff; /* 清中断标志 */
*GPTCONA = 0x0100;
*T1PR = 100000; /* 保存结果周期=2000*25ns=50us=20KHz */
*T1CNT = 0; /* 计数器从0开始计数 */
*T1CON = 0x1040; /* 连续增计数方式,启动计数器 */
/*以下设置SCI参数*/
uWork=(*MCRA);
uWork|=0x03; /* use SCITXD,SCIRXD */
(*MCRA)=uWork;
(*SCICCR)=0x07; /* 8位字符,1停止位,无校验*/
(*SCICTL1)=0x03; /* 使能发送和接收 */
(*SCICTL2)=0x00; /* 禁止接收和发送中断 */
(*SCIHBAUD)=0x02; /* 波特率=208H,40MHz */
(*SCILBAUD)=0x08; /* 208h=40*10^6/(9600*8)-1 */
(*SCICTL1)=0x23; /* 使能发送和接收,复位SCI */
}
void interrupt gptime1(void)
{
uWork1=(*PIVR);
switch ( uWork1 )
{
case 0x27:
{
nNewConvert=1; /* 设置保存标志 */
(*EVAIFRA)=0x80;/* 清中断标志位 */
break;
}
}
}
void scisent(void)
{
int i;
for ( i=0;i<3;i++ )
{
do
{
uWork=(*SCICTL2);
} while ( uWork&0x0c0 != 0x0c0 ); /*检查缓冲区是否为空*/
(*SCITXBUF)=byte[i]; /*传送高低8位*/
wait(100); /*延时*/
}
}
void wait(int nWait)
{
int i,j,k=0;
for ( i=0;i<nWait;i++ )
for ( j=0;j<64;j++ )
k++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -