📄 da.c
字号:
/***************************************************************
功能:实现DAC模拟信号输出,由T4定时控制DAC0输出DTMF信号
作者:ZDP
时间:2005-11-30
版本:V1.0
***************************************************************/
#include <c8051f020.h> // SFR declarations
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define SYSCLK 22118400 // SYSCLK frequency in Hz
//-----------------------------------------------------------------------------
// 函数定义
//-----------------------------------------------------------------------------
sbit DAC0=P1^1;
sbit DAC1=P1^2;
sbit DACS=P1^3;
sbit EMC1=P1^7;
sbit EMC2=P1^6;
sbit EMC3=P1^5;
sbit EMC4=P1^4;
unsigned char Work_fre=1;
unsigned char status=1;
void main (void);
void SYSCLK_Init (void);
void PORT_Init (void);
unsigned long count=0;
unsigned long time_count=0;
//-----------------------------------------------------------------------------
// 全局变量
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// 主函数
//-----------------------------------------------------------------------------
void ADC0_Init (void)
{
ADC0CN = 0x80; // 软件启动转换
// REF0CN = 0x07; // 启用内部基准源
AMX0SL = 0 ; // 选择采样输入源
ADC0CF = (SYSCLK/2500000) << 3; // ADC conversion clock = 2.5MHz
// ADC0CF |= 0x01; // PGA gain = 2
// EIE2 |= 0x02; // 启用 ADC 中断
}
void TIM0_Init(void)
{
CKCON=0x00;
TMOD=0x01;
TH0 = 0X00;
TL0 = 0X00;
}
void main (void) {
unsigned int i=0;
WDTCN = 0xde; // 关闭WDT
WDTCN = 0xad;
SYSCLK_Init ();
IE=0X81; //开总中断和INT0中断
PORT_Init ();
ADC0_Init();
TIM0_Init();
REF0CN = 0x03; // 启用内部的电压基准源
DAC0CN = 0x80; // 启用 DAC0
DAC1CN = 0x80;
DAC0L=0X00;
DAC0H=0X0f;
DAC1L=0X00;
DAC1H=0X0f;
IT0=1;
IE = 0x97;
TR0=1;
DACS=1;
while (1)
{
DAC0=1;
DAC1=0;
for(i=0;i<1000;i++)
{
};
DAC0=0;
DAC1=0;
DAC0=0;
DAC1=1;
for(i=0;i<1000;i++)
{
};
DAC0=0;
DAC1=0;
/* while(AD0BUSY ==0)
{
AD0BUSY=1;
count++;
} */
}
}
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{
int i; // delay counter
OSCXCN = 0x67; // start external oscillator with
// 22.1184MHz crystal
for (i=0; i < 256; i++) ; // Wait for osc. to start up
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
// source and enable missing clock
// detector
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
XBR0 = 0x04;
XBR1 = 0x0E;
XBR2 = 0x40;
}
void timer0_ISR(void) interrupt 1
//运行屏幕自动更新以及按键延时中断
{
if(time_count==28) //当屏幕处在运行屏幕状态,则启动更新计数器计数
{
time_count=0;
}
TH0=0X00;
TL0=0X00;
TF0=0; //中断标志复位
time_count++;
}
void Int0_ISR(void) interrupt 0
{
status=0;
if(Work_fre==1&&status==0)
{
EMC2=0;
EMC1=1;
EMC3=0;
EMC4=1;
Work_fre=2;
status=1;
}
if(Work_fre==2&&status==0)
{
EMC4=0;
EMC3=1;
EMC1=0;
EMC2=1;
Work_fre=1;
status=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -