📄 example_dac.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 + -