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

📄 dac.c

📁 C0851F020单品机DA转换源码
💻 C
字号:
/************************************************************************************
*  Copyright (c) 2004,西安铭朗电子科技有限责任公司
*            All rights reserved.
*
* 文件名称: DAC.C
* 文件标识: none
* 适用器件: C8051F020
* 
* 摘 要: 本文件是DAC子程序;使用外部22.1184MHz晶振.
* 
* 当前版本:1.1
* 作 者:刘大伟
* 完成日期:2007年3月2日
*
* 历史版本:1.0
* 作 者:卢 阳
* 完成日期:2004年11月14日
*
* 历史版本:0.9 
* 原作者 : 李林利
* 完成日期:2004年1月1日
*************************************************************************************/

/************************************************************************************/
// 引用外部头文件
#include "main.h" 
            
/************************************************************************************/
unsigned int Dis_dt,Counts;
bit Dis_Flag;

/***********************************************************************************
* 函数名称:sine;
*
* 函数功能描述:计算正弦波;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void sine(void)
{
	unsigned int data y;
	unsigned int data i;

	for(i=0;i<256;i++)
	{
		y=sin(3.1415*2*i/256)*2048+2048;
		if (y>4095)
			y=4095;
		TABLE[i]=y;
	}
}

/***********************************************************************************
* 函数名称:saw;
*
* 函数功能描述:计算锯齿波;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void saw(void)
{
	unsigned int data y;
	unsigned int data i;

	for(i=0;i<256;i++)
	{
		y=16*i;
		if (y>4095)
			y=4095;
		TABLE[i]=y;
	}
}

/***********************************************************************************
* 函数名称:triangle;
*
* 函数功能描述:计算三角波;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void triangle(void)
{
	unsigned long data y;
	unsigned int data i;

	for(i=0;i<256;i++)
	{
		if(i<128)
		{
			y=32*i;
		}
		else if(i==128)
		{
			y=4095;
		}
		else
		{
			y=4096-(i-128)*32;
		}
		TABLE[i]=y;
	}
}

/***********************************************************************************
* 函数名称:square;
*
* 函数功能描述:计算方波;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void square(void)
{
	unsigned int data y;
	unsigned int data i;

	for(i=0;i<256;i++)
	{
		if(i<128)
			y=0x0000;
		else
			y=0x0fff;
		TABLE[i]=y;
	}
}

/***********************************************************************************
* 函数名称:none;
*
* 函数功能描述:输出为0;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void none(void)
{
	unsigned int data i;

	for(i=0;i<256;i++)
	{
		TABLE[i]=0;
	}
}

/***********************************************************************************
* 函数名称:Timer2_ISR;
*
* 函数功能描述:定时器2中断响应;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void Timer2_ISR (void) interrupt 5 using 3
{    
	unsigned int xdata temp;

	T2CON &= ~0x80;                  // 清除T2溢出标志
	temp   = TABLE[sf0];
	temp  &= 0x00ff;
	DAC0L  = temp;
	temp   = TABLE[sf0];
	Dis_Flag=1;
	Dis_dt=temp;
	temp >>= 8;
	DAC0H  = temp;
	sf0 ++;
	if(sf0==255)
	{
		sf0 = 0;
	}
}


/***********************************************************************************
* 函数名称:Timer3_ISR;
*
* 函数功能描述:定时器3中断响应;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void Timer3_ISR (void) interrupt 14 using 3
{    
	unsigned int xdata temp;

	TMR3CN &= ~0x80;                  // 清除T3溢出标志
	temp   = TABLE[sf1];
	temp  &= 0x00ff;
	DAC1L  = temp;
	temp   = TABLE[sf1];
	temp >>= 8;
	DAC1H  = temp;
	sf1 ++;
	if(sf1==255)
	{
		sf1 =0;
	}
}

/***********************************************************************************
* 函数名称:Timer2_Init;
*
* 函数功能描述:定时器2初始化;
*              
* 输入参数:载入数值;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void Timer2_Init (unsigned int counts)
{
	int temp;

    T2CON = 0;                       // STOP timer; set to auto-reload mode
    CKCON |= 0x20;                   // T2M = '1'; Timer2 counts SYSCLKs
	temp= counts;
	temp&=0x00ff;
   	RCAP2L =temp;
	temp= counts;
	temp =(temp>>8)&0x00ff;
    RCAP2H =temp;

    TH2 = RCAP2H;
	TL2 = RCAP2L;
    ET2= 1;                    // 打开定时器Timer2中断
    T2CON |= 0x04;             // 开始启动Timer2
}

/***********************************************************************************
* 函数名称:Timer3_Init;
*
* 函数功能描述:定时器3初始化;
*              
* 输入参数:载入数值;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void Timer3_Init (unsigned int counts)
{
	int temp;

    TMR3CN = 0X02;                   // Timer3 counts SYSCLKs
	temp   = counts;
	temp  &= 0x00ff;
   	TMR3RLL= temp;
	temp   = counts;
	temp   = (temp>>8)&0x00ff;
    TMR3RLH= temp;

    TMR3H  = TMR3RLH;
	TMR3L  = TMR3RLL;
    EIE2  |= 0x01;                  // 允许定时器Timer3中断
    TMR3CN|= 0x04;             		// 开始启动Timer3
}

/***********************************************************************************
* 函数名称:DAC0_Init;
*
* 函数功能描述:DAC0初始化;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void DAC0_Init(void)
{
	REF0CN = 0x03;                   // 使用内部VREF发生器
	DAC0CN = 0x98;                   // 打开DAC0,右对齐模式
                                     // 使用Timer2作为更新调度程序
}

/***********************************************************************************
* 函数名称:DAC1_Init;
*
* 函数功能描述:DAC1初始化;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void DAC1_Init(void)
{
	REF0CN = 0x03;                   // 使用内部VREF发生器
	DAC1CN = 0x88;                   // 打开DAC1,左对齐模式
                                     // 使用Timer3作为更新调度程序  
}

/************************************************************************************
* 文件结束
************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -