📄 adc.c
字号:
// 该程序用于进行A/D转换的演示,A/D转换的结果存于数足indatr[N]
//
#include "register.h"
#define N 32
#define M 5
int indatr[N]; // 定义一个数组用于保存AD转换的结果
volatile unsigned int j; // 定义一个指针变量j
int k=0,m=0;
// 屏蔽中断子程序
void inline disable()
{
asm(" setc INTM");
}
// 开总中断子程序
void inline enable()
{
asm(" clrc INTM");
}
// 系统初始化子程序
void systeminit()
{
asm(" setc SXM"); // 符号位扩展有效
asm(" clrc OVM"); // 累加器中结果正常溢出
asm(" clrc CNF"); // B0被配置为数据存储空间
SCSR1=0x81FE; // CLKIN=6M,CLKOUT=4CLKIN=24M
WDCR=0x0E8; // 不使能看门狗,因为SCSR2中的WDOVERRIDE
// 即WD保护位复位后的缺省值为1,故可以用
// 软件禁止看门狗
IMR=0x0020; // 允许INT6中断
IFR=0x0FFFF; // 清除全部中断标志,"写1清0"
}
// AD初始化子程序
void adinit()
{
T1CNT=0x0000; // T1计数器清0
T1CON=0x144C; // T1为连续增计数模式,16分频,且选用内部时钟源
//使能定时器操作
T1PR=0x75; // 设置T1的周期寄存器
GPTCONA=0x0100; // T1周期中断标志触发AD转换
EVAIFRA=0x0FFFF; // 清除EVA中断标志,写"1"清0
ADCTRL1=0x4060; // 连续转换,低优先级
ADCTRL2=0x4500; // 可以用EVA的一个事件信号触发AD转换
// 且用中断模式1
MAXCONV=0x0; // 1通道
CHSELSEQ1=0x0; // 转换通道是1
}
// 若是其它中断则直接返回子程序
void interrupt nothing()
{
return;
}
// AD中断服务子程序
void interrupt ADCINT()
{
asm(" clrc SXM"); // 抑制符号位扩展
j=RESULT0; // 取得RESULT0的地址
indatr[k++]=j>>6; //右移6位
ADCTRL2=ADCTRL2|0x4200; // 复位SEQ1,且清除INT FLAG SEQ1标志写"1"清0
enable(); // 开总中断,因为一进入中断总中断就自动关闭了
}
main()
{
disable( ); // 禁止总中断
systeminit( ); // 系统初始化
adinit( ); // AD初始化子程序
enable( ); // 开总中断
while(1)
{
if(k==N) break; // 如果已发生中断,则停止等待(发生中断后,i=0x10)
} // 等待中断发生
T1CON=T1CON&0x0FFBF; // 停止定时器1,即间接停止A/D转换
m=m+1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -