?? dac.c
字號:
/////////DAC調試程序/////////////////
/////////T2定時更新DAC1輸出/////////////////////
////////DAC0為直接更新///////////////////////////
/////////DAC.c////////////////////////////////////////
#include "c8051F040.h"
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
sfr16 RCAP2=0xca;
sfr16 RCAP3=0xca;
sfr16 RCAP4=0xca;
sfr16 TMR4=0xcc;
sfr16 TMR3=0xcc;
sfr16 TMR2=0xcc;
sfr16 PCA0CP0=0xfb;
sfr16 PCA0CP1=0xfd;
sfr16 PCA0CP2=0xe9;
sfr16 PCA0CP3=0xeb;
sfr16 PCA0CP4=0xed;
sfr16 PCA0CP5=0xe1;
sfr16 ADC0VAL=0xbe;
sfr16 ADC0GT=0xc4;
sfr16 ADC0LT=0xc6;
sfr16 DAC1VAL=0xD2;
sfr16 DAC0VAL=0xD2;
union tcfint16{
uint myword;
struct{uchar hi;uchar low;}bytes;
}myint16;//用聯合體定義16位操作
void dac0_cfg(uchar cfg);
void dac1_cfg(uchar cfg);
void dac0_updata(uint val);
void dac1_updata(uint val);
void config();
void t2_ini();
void t2_baud(uint t2reload);
void t2_ini(){
SFRPAGE = 0x00;
TMR2CF = 0x08; // T2時鐘為系統時鐘
TMR2CN = 0x00; // 開啟T2定時器
ET2=1;//開啟T2定時器中斷
}
void t2_baud(uint t2reload){
SFRPAGE = 0x00;
RCAP2=65536-t2reload;
TMR2=RCAP2;
}
void dac0_cfg(uchar cfg){
SFRPAGE=0x00;
DAC0CN=cfg;
REF0CN|=0x03;//DAC參考電平只能由VREFD輸入
}
void dac1_cfg(uchar cfg){
SFRPAGE=0x01;
DAC0CN=cfg;
SFRPAGE=0x00;
REF0CN|=0x03;
}
void dac0_updata(uint val){
SFRPAGE=0x00;
myint16.myword=val;//利用聯合體進行快速uint型數據操作
DAC0L=myint16.bytes.low;
DAC0H=myint16.bytes.hi;//在直接更新模式下,此時開始更新DAC0輸出
}
void dac1_updata(uint val){
SFRPAGE=0x01;
myint16.myword=val;//利用聯合體進行快速uint型數據操作
DAC1L=myint16.bytes.low;
DAC1H=myint16.bytes.hi;//在直接更新模式下,此時開始更新DAC1輸出
}
void config (void) {
WDTCN = 0x07; // Watchdog Timer Control Register
WDTCN = 0xDE; // Disable WDT
WDTCN = 0xAD;
SFRPAGE = 0x0F;
XBR0 = 0x00; // XBAR0: Initial Reset Value
XBR1 = 0x00; // XBAR1: Initial Reset Value
XBR2 = 0x40; // XBAR2: Initial Reset Value
XBR3 = 0x00; // XBAR3: Initial Reset Value
SFRPAGE = 0x0F;
P0MDOUT = 0x00; // Output configuration for P0
P1MDOUT = 0x00; // Output configuration for P1
P2MDOUT = 0x00; // Output configuration for P2
P3MDOUT = 0x00; // Output configuration for P3
P4MDOUT = 0xff; // Output configuration for P4
P5MDOUT = 0x07; // Output configuration for P5
P6MDOUT = 0x00; // Output configuration for P6
P7MDOUT = 0x00; // Output configuration for P7
P1MDIN = 0xFF; // Input configuration for P1
P2MDIN = 0xFF; // Input configuration for P2
P3MDIN = 0xFF; // Input configuration for P3
SFRPAGE = 0x0F;
CLKSEL = 0x00; // Oscillator Clock Selector
OSCXCN = 0x00; // EXTERNAL Oscillator Control Register
OSCICN = 0x84; // Internal Oscillator Control Register
//采用內部晶振,為24.5MHZ8分頻
} //End of config
void main(){
uchar i;
config();
dac0_cfg(0x80);//dac0使能,且為立即更新方式
dac1_cfg(0x98);//dac1使能,且為t2溢出更新方式
i=0;
t2_ini();
t2_baud(500);//每隔500 T2時鐘更新一次DAC1輸出,此時T2尚未啟動
EA=1;
dac0_updata(0x0800);
/*
DAC0輸出為0.5VREFD,若VREFD與ADC0參考電壓相同,則可作為HVREF參考電壓輸入,使得HVDA差動檢測負壓
*/
SFRPAGE=0x00;
TR2=1;//啟動定時器T2
while(1);
}
void T2_ISR() interrupt 5{//T2定時中斷,更新DAC1輸出,DAC1為鋸齒波輸出
TF2=0;
SFRPAGE=0x01;
DAC1VAL++;//因為是T2溢出更新DAC1輸出,所以可以sfr16操作,因為此時并不立即更新
if(DAC1VAL>=0x1000)
DAC1VAL=0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -