?? 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 + -