⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 da.c

📁 C8051F020单片机的DA,AD例程
💻 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 + -