?? 33xdac.c
字號:
//-----------------------------------------------------------------------------
// DAC0.c
//-----------------------------------------------------------------------------
// 版權歸新華龍電子有限公司所有
//
// 作者:Robi Ken
// 日期: 2004.12.28
// 功能:DAC輸出
// 目標板: C8051F33x
// 開發工具: Silicon Laboratories IDE
//
//--------------------------------------------------------------------------------------
// 此程序為D/A轉換程序,轉換啟動信號可以為定時器0、1、2、3(在主程序中選擇相應的函數,并對
// D/A程序中的“IDA0CN”寄存器進行相應的更改便可)
//------------------------------------------------------------------------------------
//包含頭文件
//-----------------------------------------------------------------------------------
#include <c8051f330.h>
#include <stdio.h>
//-----------------------------------------------------------------------------
// 定義16位寄存器
//-----------------------------------------------------------------------------
sfr16 DAC0 = 0x96; // 10位DAC寄存器地址
sfr16 TMR0RL = 0xca; // 定時器0數據寄存器地址
sfr16 TMR1RL = 0xca; // 定時器1數據寄存器地址
sfr16 TMR2RL = 0xca; // 定時器2數據寄存器地址
sfr16 TMR3RL = 0xca; // 定時器3數據寄存器地址
sfr16 TMR0 = 0xCC; // 定時器0計數寄存器
sfr16 TMR1 = 0xCC; // 定時器1計數寄存器
sfr16 TMR2 = 0xcc; // 定時器2計數寄存器
sfr16 TMR3 = 0xcc; // 定時器3計數寄存器
//-----------------------------------------------------------------------------
//常量賦值
//-----------------------------------------------------------------------------
#define SYSCLK 49000000
#define SAMPLE_RATE 50000
//------------------------------------------------------------------------------------
// 定義函數
//------------------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void Timer0_Init (int counts);
void Timer1_Init (int counts);
void Timer2_Init (int counts);
void Timer3_Init (int counts);
void DAC0_Init(void);
void Timer0_ISR (void);
void Timer1_ISR (void);
void Timer2_ISR (void);
void Timer3_ISR (void);
void DAC0_CNVS_DAC0h(void);
//-----------------------------------------------------------------------------
// 定義全局變量
//-----------------------------------------------------------------------------
long int i=0;
//------------------------------------------------------------------------------------
// 主函數
//------------------------------------------------------------------------------------
void main (void)
{
PCA0MD &= ~0x40; //關閉看門狗
SYSCLK_Init (); //系統時鐘初始化
PORT_Init (); //I/O口初始化
//Timer0_Init (SYSCLK/SAMPLE_RATE); //定時器0溢出作為DAC的轉換啟動信號
//Timer1_Init (SYSCLK/SAMPLE_RATE); //定時器1溢出作為DAC的轉換啟動信號
//Timer2_Init (SYSCLK/SAMPLE_RATE); //定時器2溢出作為DAC的轉換啟動信號
Timer3_Init (SYSCLK/SAMPLE_RATE); //定時器3溢出作為DAC的轉換啟動信號
DAC0_Init();
EA=1;
while(1)
{
}
}
//------------------------------------------------------------------------------------
// 端口初始化
//------------------------------------------------------------------------------------
void PORT_Init (void)
{
P0SKIP |= 0x41;
XBR1 = 0x40;
}
//-----------------------------------------------------------------------------
// 系統時鐘初始化
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{
OSCICN |= 0x03;
RSTSRC = 0x04;
}
//-----------------------------------------------------------------------------
// 定時器0初始化
//-----------------------------------------------------------------------------
void Timer0_Init (int counts)
{
TMOD=0x11;
CKCON |= 0x08;
TMR0RL = -counts;
TMR0 = TMR0RL;
ET0= 1;
TR0=1;
}
//-----------------------------------------------------------------------------
// 定時器1初始化
//-----------------------------------------------------------------------------
void Timer1_Init (int counts)
{
TMOD=0x11;
CKCON |= 0x04;
TMR1RL = -counts;
TMR1 = TMR1RL;
ET1= 1;
TR1=1;
}
//-----------------------------------------------------------------------------
// 定時器2初始化
//-----------------------------------------------------------------------------
void Timer2_Init (int counts)
{
TMR2CN = 0x00;
CKCON |= 0x10;
TMR2RL = -counts;
TMR2 = TMR2RL;
ET2= 1;
TR2=1;
}
//-----------------------------------------------------------------------------
// 定時器3初始化
//-----------------------------------------------------------------------------
void Timer3_Init (int counts)
{
TMR3CN = 0x00;
CKCON |= 0x40;
TMR3RL = -counts;
TMR3 = TMR3RL;
EIE1 |= 0x80;
TMR3CN |= 0x04;
}
//-----------------------------------------------------------------------------
// 數模轉換初始化
//-----------------------------------------------------------------------------
void DAC0_Init (void)
{
IDA0CN = 0xb2; //設置為0x82,0x92,0xa2,0xb0時分別是用定時器0,1,2,3
REF0CN = 0x03; //的溢出作為IDAC的更新輸出
}
//-----------------------------------------------------------------------------
// 外部觸發轉換程序
//-----------------------------------------------------------------------------
void DAC0_CNVS_DAC0h(void)
{
IDA0H=i;
i=i+16;
if(i==0xffff)
{
i=0;}
}
//-----------------------------------------------------------------------------
// 定時器0中斷
//-----------------------------------------------------------------------------
void Timer0_ISR (void) interrupt 1
{
DAC0=i;
i=i+16;
if(i==0xfff)
{
i=0;}
}
//-----------------------------------------------------------------------------
// 定時器1中斷
//-----------------------------------------------------------------------------
void Timer1_ISR (void) interrupt 3
{
TF1=0;
DAC0=i;
i=i+16;
if(i==0xfff)
{
i=0;}
}
//-----------------------------------------------------------------------------
// 定時器2中斷
//-----------------------------------------------------------------------------
void Timer2_ISR (void) interrupt 5
{
TMR2CN &= ~0x80;
DAC0=i;
i=i+16;
if(i==0xfff)
{
i=0;}
}
//-----------------------------------------------------------------------------
// 定時器3中斷
//-----------------------------------------------------------------------------
void Timer3_ISR (void) interrupt 14
{
TMR3CN &= ~0x80;
DAC0=i;
i=i+16;
if(i==0xfff)
{
i=0;}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -