📄 adc2.c
字号:
/* 2407 单通道AD转换实验 */
#include "register.h"
#define ADCNUMBER 256
void ADInit(void); // AD模块初始化
void SysInit(void); // 系统初始化
void ADSOC(void); // 启动AD转换
void interrupt adint(void); // 中断子程序
unsigned int nADCIn15[ADCNUMBER]; // 保存通道ADCIN15的转换结果,循环保存
unsigned int nADCount; // AD转换次数
volatile unsigned int *j; // 定义一个指针变量j
main()
{
asm(" setc INTM");
SysInit();
ADInit();
asm(" clrc INTM");
ADSOC(); // 开启AD转换
}
void ADInit(void)
{
int i;
for(i=0;i<ADCNUMBER;i++) // 缓冲区清0
nADCIn15[i]=0;
nADCount=0;
*ADCTRL1=0x0040; // 设置连续转换模式
*ADCTRL2=0x4000; // 复位SEQ1,SEQ1受EVA的控制
*MAXCONV=0x0000; // 最大转换数为1
*CHSELSEQ1=0x000F; // 转换通道为15
*GPTCONA=0x400; // T2周期中断标志触发AD转换
*T2CNT=0x0000; // T2计数器清0
*T2CON=0x170C; // T2为连续增计数模式,128分频,且选用内部时钟源
*T2PR=0x75; // 设置T2的周期寄存器
*EVAIFRB=0xFFFF; // 清除EVA中断标志,写"1"清0
}
void SysInit(void)
{
asm(" setc SXM"); // 符号位扩展有效
asm(" clrc OVM"); // 累加器中结果正常溢出
asm(" clrc CNF"); // B0被配置为数据存储空间
*SCSR1=0x83EF; // CLKIN=15M,CLKOUT=2*CLKIN=30M
*WDCR=0x0E8; // 不使能看门狗,因为SCSR2中的WDOVERRIDE
// 即WD保护位复位后的缺省值为1,故可以用
// 软件禁止看门狗
*IMR=0x0020; // 允许INT6中断
*IFR=0x0FFFF; // 清除全部中断标志,"写1清0"
}
void ADSOC(void)
{
*T2CON=*T2CON|0x40; // 启动定时器2
}
void interrupt adint()
{
asm(" clrc SXM"); // 抑制符号位扩展
nADCIn15[nADCount]=(*RESULT15>>6); // 取通道15的转换结果,结果右移6位
nADCount++; // 转换次数自增
if(nADCount>=ADCNUMBER)
{ // 结果循环存放
nADCount=0;
}
*EVAIFRB=0xFFFF; // 清除EVA中断标志,写"1"清0
//*ADCTRL2=*ADCTRL2|0x4200; // 复位SEQ1,且清除INT FLAG SEQ1标志写"1"清0
asm(" clrc INTM"); // 开总中断,因为一进入中断总中断就自动关闭了
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -