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

📄 example_dac.c

📁 C8051F020单片机开发板演示程序
💻 C
字号:
/************************************************************************************
*  Copyright (c), 2004-2007,西安铭朗电子科技有限责任公司
*            All rights reserved.
*
* Http:  www.mlarm.com
* Email: mlarm@mlarm.com
*
* File name: Example_DAC.c
*
* Project  : ML-F020ICB
* Processor: C8051F020
* Compiler : Keil C51 Compiler
* 
* Author:  EagleC
* Version: 1.00
* Date:    2007.07.05
* Email:   
* 
* Description: DAC测试程序文件;
*
* Others: none;
*
* Function List:
*
* History:
*   1. Author:       Eagle Cao
*	   Version: 	 1.00
*      Date:         2007.07.05
*      Modification: 建立文件
*
*************************************************************************************/
/************************************************************************************/
// 引用外部头文件
#include  "driver.h"
#include  "api.h"
#include  "ShowLCD.h"
#include  "math.h"
/************************************************************************************/

/************************************************************************************/
// 常量及全局变量定义
/************************************************************************************/

/*************************************************************************************/
//
// 							DAC测试程序函数定义
//
/*************************************************************************************/
extern unsigned long			g_nTimer4s;		//定时器4的次数
extern unsigned int xdata DAC0_Buffer[DACO_TXBUF_SIZE]; 	    // DAC0发送数据缓存
extern unsigned int xdata DAC1_Buffer[DAC1_TXBUF_SIZE]; 	    // DAC1发送数据缓存

#define		ORIGIN_ADC0_X		144
#define		ORIGIN_ADC0_Y		64
#define		ORIGIN_ADC1_X		ORIGIN_ADC0_X+6*16
#define		ORIGIN_ADC1_Y		ORIGIN_ADC0_Y

/***********************************************************************************
* Function: DAC_Proc;
*
* Description: DAC测试程序;
*              
* Input:  none;
*
* Return: none;
*
* Note:   none;
************************************************************************************/
void DAC_Proc(void)
{
	unsigned char i,cmd;
	unsigned int  j;
	
	unsigned char bBrush;
	unsigned char bflag;
	
	unsigned char nX; 
	unsigned char *pItem; 

	unsigned int AD_RxBuf[256];
	unsigned int dac_Rxbuf[256];
	unsigned long vlong;

	ADC_Enable();
	LCDB_ClearScreen();
	Show_Title();
	LCDB_DispFWord(32,8*(20-3),"DA 监 测");
			
	bflag = 1;
	for (j=0;j<256;j++)   
		dac_Rxbuf[j] = 0;
				
	Show_ClareX64();
				
	// 绘制座标
	LCDB_DispFWord(ORIGIN_ADC0_X-80-16, 16*2,"DAC0:输出0~10V,正弦波形,通过AIN1采集");
	LCDB_DrawLine(ORIGIN_ADC0_X-80, ORIGIN_ADC0_Y,ORIGIN_ADC0_X,ORIGIN_ADC0_Y,1);	//x轴
	LCDB_DrawLine(ORIGIN_ADC0_X-40,ORIGIN_ADC0_Y,ORIGIN_ADC0_X-40,ORIGIN_ADC0_Y+16*16,1);	//y轴
	LCDB_DispFWord(ORIGIN_ADC0_X-80, ORIGIN_ADC0_Y-8*2,"10");
	LCDB_DispFWord(ORIGIN_ADC0_X-48, ORIGIN_ADC0_Y-8*1,"5");
	LCDB_DispFWord(ORIGIN_ADC0_X-16, ORIGIN_ADC0_Y-8*1,"0");
	
	LCDB_DispFWord(ORIGIN_ADC1_X-80-16, 16*2,"DAC1:输出0~10V,正弦波形,通过AIN2采集");
	LCDB_DrawLine(ORIGIN_ADC1_X-80, ORIGIN_ADC1_Y,ORIGIN_ADC1_X,ORIGIN_ADC1_Y,1);	//x轴
	LCDB_DrawLine(ORIGIN_ADC1_X-40,ORIGIN_ADC1_Y,ORIGIN_ADC1_X-40,ORIGIN_ADC1_Y+16*16,1);	//y轴
	LCDB_DispFWord(ORIGIN_ADC1_X-80, ORIGIN_ADC1_Y-8*2,"10");
	LCDB_DispFWord(ORIGIN_ADC1_X-48, ORIGIN_ADC1_Y-8*1,"5");
	LCDB_DispFWord(ORIGIN_ADC1_X-16, ORIGIN_ADC1_Y-8*1,"0");
	
	//设置输出波形
	for (j=0;j<256;j++)
		DAC1_Buffer[(j+128)%256] = DAC0_Buffer[j] = sin(3.1415926*2*j/256)*0xfff/2 + 0xfff/2;
	
	DAC0_Enable();
	DAC1_Enable();
	Delay_ms(10);
	g_nTimer4s = 51;
	bBrush = 0;
	vlong = 76;
	while(1)
	{
		EWachdog_Clear();
		cmd = Key_Read();
		if(cmd != CH452_KEY_INVAL)
		{
			ALARM_Ctrl(1);Delay_ms(100);ALARM_Ctrl(0);				
			switch (cmd)
			{
			case 0x0C:
				DAC0_Disable();
				DAC1_Disable();	  
				bflag = 1;
				for (j=0;j<256;j++)   
					dac_Rxbuf[j] = 0;				
				Show_ClareX64();
				
				// 绘制座标
				LCDB_DispFWord(ORIGIN_ADC0_X-80-16, 16*2,"DAC0:输出0~10V,三角波形,通过AIN1采集");
				LCDB_DrawLine(ORIGIN_ADC0_X-80, ORIGIN_ADC0_Y,ORIGIN_ADC0_X,ORIGIN_ADC0_Y,1);	//x轴
				LCDB_DrawLine(ORIGIN_ADC0_X-40,ORIGIN_ADC0_Y,ORIGIN_ADC0_X-40,ORIGIN_ADC0_Y+16*16,1);	//y轴
				LCDB_DispFWord(ORIGIN_ADC0_X-80, ORIGIN_ADC0_Y-8*2,"10");
				LCDB_DispFWord(ORIGIN_ADC0_X-48, ORIGIN_ADC0_Y-8*1,"5");
				LCDB_DispFWord(ORIGIN_ADC0_X-16, ORIGIN_ADC0_Y-8*1,"0");
				
				LCDB_DispFWord(ORIGIN_ADC1_X-80-16, 16*2,"DAC1:输出0~10V,三角波形,通过AIN2采集");
				LCDB_DrawLine(ORIGIN_ADC1_X-80, ORIGIN_ADC1_Y,ORIGIN_ADC1_X,ORIGIN_ADC1_Y,1);	//x轴
				LCDB_DrawLine(ORIGIN_ADC1_X-40,ORIGIN_ADC1_Y,ORIGIN_ADC1_X-40,ORIGIN_ADC1_Y+16*16,1);	//y轴
				LCDB_DispFWord(ORIGIN_ADC1_X-80, ORIGIN_ADC1_Y-8*2,"10");
				LCDB_DispFWord(ORIGIN_ADC1_X-48, ORIGIN_ADC1_Y-8*1,"5");
				LCDB_DispFWord(ORIGIN_ADC1_X-16, ORIGIN_ADC1_Y-8*1,"0");
				//设置输出波形
				for (j=0;j<64;j++)
					DAC1_Buffer[(j+64)%256] = DAC0_Buffer[j] = 0xfff/64*j;
				for (j=64;j<128;j++)   
					DAC1_Buffer[(j+64)%256] = DAC0_Buffer[j] = 0xfff/64*(128-j);
				for (j=128;j<192;j++)
					DAC1_Buffer[(j+64)%256] = DAC0_Buffer[j] = 0xfff/64*(j-128);
				for (j=192;j<256;j++)   
					DAC1_Buffer[(j+64)%256] = DAC0_Buffer[j] = 0xfff/64*(255-j);
				
				DAC0_Enable();
				DAC1_Enable();				
				Delay_ms(10);
				g_nTimer4s = 51;
				break;
			case 0x0D:
				DAC0_Disable();
				DAC1_Disable();	  
				bflag = 1;
				for (j=0;j<256;j++)   
					dac_Rxbuf[j] = 0;
				
				Show_ClareX64();
				
				// 绘制座标
				LCDB_DispFWord(ORIGIN_ADC0_X-80-16, 16*2,"DAC0:输出0~10V,正弦波形,通过AIN1采集");
				LCDB_DrawLine(ORIGIN_ADC0_X-80, ORIGIN_ADC0_Y,ORIGIN_ADC0_X,ORIGIN_ADC0_Y,1);	//x轴
				LCDB_DrawLine(ORIGIN_ADC0_X-40,ORIGIN_ADC0_Y,ORIGIN_ADC0_X-40,ORIGIN_ADC0_Y+16*16,1);	//y轴
				LCDB_DispFWord(ORIGIN_ADC0_X-80, ORIGIN_ADC0_Y-8*2,"10");
				LCDB_DispFWord(ORIGIN_ADC0_X-48, ORIGIN_ADC0_Y-8*1,"5");
				LCDB_DispFWord(ORIGIN_ADC0_X-16, ORIGIN_ADC0_Y-8*1,"0");
				
				LCDB_DispFWord(ORIGIN_ADC1_X-80-16, 16*2,"DAC1:输出0~10V,正弦波形,通过AIN2采集");
				LCDB_DrawLine(ORIGIN_ADC1_X-80, ORIGIN_ADC1_Y,ORIGIN_ADC1_X,ORIGIN_ADC1_Y,1);	//x轴
				LCDB_DrawLine(ORIGIN_ADC1_X-40,ORIGIN_ADC1_Y,ORIGIN_ADC1_X-40,ORIGIN_ADC1_Y+16*16,1);	//y轴
				LCDB_DispFWord(ORIGIN_ADC1_X-80, ORIGIN_ADC1_Y-8*2,"10");
				LCDB_DispFWord(ORIGIN_ADC1_X-48, ORIGIN_ADC1_Y-8*1,"5");
				LCDB_DispFWord(ORIGIN_ADC1_X-16, ORIGIN_ADC1_Y-8*1,"0");
				
				//设置输出波形
				for (j=0;j<256;j++)
					DAC1_Buffer[(j+128)%256] = DAC0_Buffer[j] = sin(3.1415926*2*j/256)*0xfff/2 + 0xfff/2;
				
				DAC0_Enable();
				DAC1_Enable();
				Delay_ms(10);
				g_nTimer4s = 51;
				break;
			case 0x0E:
				bflag = 0;
				pItem = "                                        ";
				LCDB_DispFWord(48,0,pItem);
				Show_ClareX64();
				nX = 64;
				pItem = "本测试程序主要测试DA输出。DAC0:输出0~10V,通过AIN1采集,DAC1:输出0~10V,通过AIN2采集,测试前应分别将DAC0与AIN1、DAC1与AIN2用导线连通,DA输出频率为1000Hz。"; 
				LCDB_DispFWord(nX, 32,pItem);
				
				pItem = "C:DA输出三角波形";
				LCDB_DispFWord(nX+16*5, 56,pItem);
				pItem = "D:DA输出正弦波形";
				LCDB_DispFWord(nX+16*6, 56,pItem);
				pItem = "E:帮助";
				LCDB_DispFWord(nX+16*7, 56,pItem);
				pItem = "F:返回";
				LCDB_DispFWord(nX+16*8, 56,pItem);				
				break;
			case 0x0F:
				ADC_Disable();
				DAC0_Disable();
				DAC1_Disable();	  
				return;
			}
		}
		if(bflag)
		{
			EWachdog_Clear();
			if(g_nTimer4s>=50)
			{
				g_nTimer4s = 0;
				j=0;
				
				//清除原来图形
				for(i=0;i<=64;i++)
				{
					LCDB_DrawPixel(ORIGIN_ADC0_X-dac_Rxbuf[i*2],ORIGIN_ADC0_Y+i*4,0);
					LCDB_DrawPixel(ORIGIN_ADC1_X-dac_Rxbuf[i*2+1],ORIGIN_ADC1_Y+i*4,0);
				}
				//获取AIN0、AIN1采集来的数据
				ADC_ClearFIFO();
				while (j<=512)
				{
					if(ADC_GetWordsRxBuf()>=24)
					{
						ADC_Read(AD_RxBuf,24);
						if(j%8==0)
						{
							i = j/4;
							dac_Rxbuf[i]=AD_RxBuf[0]*vlong/0x1000+2;
							if(dac_Rxbuf[i]>(vlong+2)) dac_Rxbuf[i] = (vlong+2);
							dac_Rxbuf[i+1]=AD_RxBuf[1]*vlong/0x1000+2;
							if(dac_Rxbuf[i+1]>(vlong+2)) dac_Rxbuf[i+1] = (vlong+2);
						}
						j+=2;
					}
					EWachdog_Clear();
				}
				
				// 绘图
				for(i=0;i<=64;i++)
				{
					LCDB_DrawPixel(ORIGIN_ADC0_X-dac_Rxbuf[i*2],ORIGIN_ADC0_Y+i*4,1);
					LCDB_DrawPixel(ORIGIN_ADC1_X-dac_Rxbuf[i*2+1],ORIGIN_ADC1_Y+i*4,1);
					EWachdog_Clear();
				}
				// 绘制坐标
				LCDB_DrawLine(ORIGIN_ADC0_X-80, ORIGIN_ADC0_Y,ORIGIN_ADC0_X,ORIGIN_ADC0_Y,1);	//x轴
				LCDB_DrawLine(ORIGIN_ADC0_X-40,ORIGIN_ADC0_Y,ORIGIN_ADC0_X-40,ORIGIN_ADC0_Y+16*16,1);	//y轴
				LCDB_DrawLine(ORIGIN_ADC1_X-80, ORIGIN_ADC1_Y,ORIGIN_ADC1_X,ORIGIN_ADC1_Y,1);	//x轴
				LCDB_DrawLine(ORIGIN_ADC1_X-40,ORIGIN_ADC1_Y,ORIGIN_ADC1_X-40,ORIGIN_ADC1_Y+16*16,1);	//y轴
			}
		}
	}
	
}

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

⌨️ 快捷键说明

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