?? adc.c
字號:
// 該程序用于進行A/D轉換的演示,A/D轉換的結果存于數組ADRESULT[16]中,
// 寄存器cesi用于測試每個A/D轉換的結果
#include "register.h"
int ADRESULT[16]; // 定義一個數組用于保存AD轉換的結果
volatile unsigned int j; // 定義一個指針變量j
int i=0x00,cesi;
// 屏蔽中斷子程序
void inline disable()
{
asm(" setc INTM");
}
// 開總中斷子程序
void inline enable()
{
asm(" clrc INTM");
}
// 系統初始化子程序
void initial()
{
asm(" setc SXM"); // 符號位擴展有效
asm(" clrc OVM"); // 累加器中結果正常溢出
asm(" clrc CNF"); // B0被配置為數據存儲空間
SCSR1=0x81FE; // CLKIN=6M,CLKOUT=4CLKIN=24M
WDCR=0x0E8; // 不使能看門狗,因為SCSR2中的WDOVERRIDE
// 即WD保護位復位后的缺省值為1,故可以用
// 軟件禁止看門狗
IMR=0x0001; // 允許INT1中斷
IFR=0x0FFFF; // 清除全部中斷標志,"寫1清0"
}
// AD初始化子程序
void ADINIT()
{
T4CNT=0x0000; // T4計數器清0
T4CON=0x170C; // T4為連續增計數模式,128分頻,且選用內部時鐘源
T4PR=0x75; // 設置T4的周期寄存器
GPTCONB=0x400; // T4周期中斷標志觸發AD轉換
EVBIFRB=0x0FFFF; // 清除EVB中斷標志,寫"1"清0
ADCTRL1=0x10; // 采樣時間窗口預定標位ACQ PS3-ACQ PS0為0,
// 轉換時間預定標位CPS為0,AD為啟動/停止模式,排
// 序器為級連工作方式,且禁止特殊的兩種工作模式
ADCTRL2=0x8404; // 可以用EVB的一個事件信號觸發AD轉換,
// 且用中斷模式1
MAXCONV=0x0F; // 16通道
CHSELSEQ1=0x3210;
CHSELSEQ2=0x7654;
CHSELSEQ3=0x0BA98;
CHSELSEQ4=0x0FEDC; // 轉換通道是0-15
}
// 啟動AD轉換子程序(通過啟動定時器4的方式間接啟動)
void ADSOC()
{
T4CON=T4CON|0x40; // 啟動定時器4
}
// 若是其它中斷則直接返回子程序
void interrupt nothing()
{
return;
}
// AD中斷服務子程序
void interrupt adint()
{
asm(" clrc SXM"); // 抑制符號位擴展
j=RESULT0; // 取得RESULT0的地址
for(i=0;i<=15;i++,j++)
{
ADRESULT[i]=j>>6; // 把AD轉換的結果左移6位后存入規定的數組
cesi=ADRESULT[i]; // 檢驗每個A/D轉換的結果
}
ADCTRL2=ADCTRL2|0x4200; // 復位SEQ1,且清除INT FLAG SEQ1標志寫"1"清0
enable(); // 開總中斷,因為一進入中斷總中斷就自動關閉了
}
main()
{
disable( ); // 禁止總中斷
initial( ); // 系統初始化
ADINIT( ); // AD初始化子程序
enable( ); // 開總中斷
ADSOC( ); // 啟動AD轉換
while(1)
{
if(i==0x10) break; // 如果已發生中斷,則停止等待(發生中斷后,i=0x10)
} // 等待中斷發生
T4CON=T4CON&0x0FFBF; // 停止定時器4,即間接停止A/D轉換
while(1)
{
;
} // 死循環,在實際的工程應用中在此可以利用A/D轉換的結果用于一些運算
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -