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

📄 adda.c

📁 C8051FTest.rar 是C8051F系列处理器的基本测试程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "system.h"
#include "menu.h"
#include "Lcd.h"
#include <string.h>

unsigned char ADCdata[1000];					//存放AD转化数据
unsigned int  ADcounter=0;
unsigned char TriggerMode=2;					//触发模式
unsigned int TriggerValue=1000;				    //触发器触发值,单位mv
unsigned char ADH_TriggerValue=0x55;			//TriggerValue对应ADC值
unsigned char ADL_TriggerValue=0x50;
char LastStats=2;

char ready=0;
unsigned int code SinTable[]={ 					//一周期64点sin值表(0~4095)
 2048,  2248,  2447,  2642,  2831,  3013,  3185,  3347,  3496,  3631, 
 3750,  3854,  3940,  4007,  4056,  4086,  4095,  4086,  4056,  4007, 
 3940,  3854,  3750,  3631,  3496,  3347,  3185,  3013,  2831,  2642, 
 2447,  2248,  2048,  1847,  1648,  1453,  1264,  1082,   910,   748, 
  599,   464,   345,   241,   155,    88,    39,     9,     0,     9, 
   39,    88,   155,   241,   345,   464,   599,   748,   910,  1082, 
 1264,  1453,  1648,  1847,   };

unsigned char xdata DACdata[128] _at_ 0x0;		 	//存放DA转化数据(梯形波或正弦波,每周期64点)
//ADDA参数数组:0:信源;1:频率;2:幅度;3:上升比;4:高电平;5:下降比;6:采样频率;7:接口模式
unsigned char ADDAParaList[]={0,1,12,20,30,40,16,0};

void DA_T4_INIT()					//T4初始化,驱动DA产生波形
{	
	char SFRPAGE_SAVE;
	unsigned int T4VALUE; 
	SFRPAGE_SAVE=SFRPAGE;
    SFRPAGE = TMR4_PAGE;
	//T4初值= FFFF - 22.1184M/DA频率
	T4VALUE = 0xFFFF-(unsigned int)221184/(ADDAParaList[1]*64);
  	TMR4H=T4VALUE>>8;						 
 	TMR4L=T4VALUE;			      
    RCAP4L=TMR4L;
    RCAP4H=TMR4H;
    TMR4CF |=0x09;					//SYSCLK作为T4输入,向上计数		
	TMR4CN &=0xf4;					//T4工作模式: 自动重装,计时器,忽略T3EX信号                       
	TR4=1;							
	EIE2|=0x04;						//开T4中断
	SFRPAGE=SFRPAGE_SAVE;
}

void DAC0_Init()					//DAC中断,数据通过并口发送,判断触发
{
	char SFRPAGE_SAVE;
	SFRPAGE_SAVE=SFRPAGE;
    SFRPAGE = DAC0_PAGE;
	REF0CN =0x03;					//ADDA内部偏压发生器工作,电压基准输出到VREF引脚(2.4V)
	DAC0CN=0x90;					//使能DAC0,T4溢出启动转换,数据右对齐
	SFRPAGE=SFRPAGE_SAVE;
}

void AD_T3_INIT()					//T3初始化,用于驱动ADC0,但不引发中断(中断由ADC0引发)
{		
	char SFRPAGE_SAVE;
	unsigned int T3Value;
	T3Value=0xFFFF-(unsigned int)22118/ADDAParaList[6];
	SFRPAGE_SAVE=SFRPAGE;
    SFRPAGE = TMR3_PAGE;
 	//设置采样频率:TMR3=0xFFFF-22118400/采样频率 
	TMR3L=T3Value;			         
	TMR3H=T3Value>>8;
    RCAP3L=TMR3L;
    RCAP3H=TMR3H;
    TMR3CF |=0x09;					//SYSCLK作为T3输入,向上计数
	TMR3CN &=0xf4;					//T3工作模式: 自动重装,计时器,忽略T3EX信号                       
	TR3=1;
	SFRPAGE=SFRPAGE_SAVE;
}

void ADC0_Init()					//AD初始化	
{
	char SFRPAGE_SAVE;
	SFRPAGE_SAVE=SFRPAGE;
    SFRPAGE = ADC0_PAGE;
	REF0CN =0x03;					//ADDA内部偏压发生器工作,电压基准输出到VREF引脚(2.4V)
	AMX0SL =0x06;					//选择AIN0.6作为输入,单端模式
	ADC0CF =0x16;					//CLKsar0=SYSCLK/6;PGA放大器0.5倍增益
	ADC0CN|=0x85;					//T3溢出启动转换,数据左对齐,启动ADC0
	SFRPAGE=SFRPAGE_SAVE;
}
///////////////////////////////////////////////////////////
void DASetUp_OnPaint()					//显示设置界面
{	
	Clear(16*3,16*10);
	dprintf(2,16*2,"妚内部正弦波 妚内部梯形波 妚外部信号");
	dprintf(2+ADDAParaList[0]*13,16*2,"盅");

	if(ADDAParaList[0]!=2)
	{
		dprintf(2,16*3,"信号频率:     Hz");
		putufig(11,16*3, ADDAParaList[1]*100,5,0,' ');
		dprintf(2,16*4,"信号幅度:     mV");
		putufig(11,16*4, ADDAParaList[2]*100,5,0,' ');
	}
	if(ADDAParaList[0]==1)
	{		
		int Sample[9]={4,130,150,0,110,0,110,0,150};
		Sample[3]=130+ADDAParaList[3];
		Sample[5]=130+ADDAParaList[3]+ADDAParaList[4];
		Sample[7]=130+ADDAParaList[3]+ADDAParaList[4]+ADDAParaList[5];

		dprintf(2,16*5,"上升比:   %   波形:");
		putufig(9,16*5, ADDAParaList[3],3,0,' ');
		dprintf(2,16*6,"高电平:   %");
		putufig(9,16*6, ADDAParaList[4] ,3,0,' ');
		dprintf(2,16*7,"下降比:   %");
		putufig(9,16*7, ADDAParaList[5],3,0,' ');

		drawline(130,150,130,100);
		drawline(130,150,300,150);
		link(Sample);

		Sample[0]=3;
		Sample[1]=230;
		Sample[3]=230+ADDAParaList[3];
		Sample[5]=230+ADDAParaList[3]+ADDAParaList[4];
		Sample[7]=230+ADDAParaList[3]+ADDAParaList[4]+ADDAParaList[5];
		link(Sample);
	}	
}

void ADDASetUp()					//设置
{
	char MovHand=1;					//移动光标标志位
	char ItemSel=1;					//光标所在行
	//显示界面
	Clear(0,240);
	dprintf(10,0,"并口A/D采集实验设置");
	dprintf(2,16*1,"选择信号源:");
	dprintf(2,16*10 ,"并口模式: EPP");
	dprintf(2,16*11,"采样频率: 16KHz");
	dprintf(0,16*12,line);
	dprintf(0,16*13,"选择项目 改变参数");
	dprintf(1,16*14, "芗  兦   戛  戋");
	dprintf(35,16*14, "确定");
	DASetUp_OnPaint();

	while(1)
	{		
		if(CheckKeyF==1)			//键盘检测
		{
			CheckKey();
			CheckKeyF=0;
		}

		if(MovHand==1)
		{
			int i;
			for(i=0;i<12;i++)
			{
				if(ItemSel==i)	
				dprintf(0,i*16,"贲");
				else
				dprintf(0,i*16,"  ");
			}
			MovHand=0;
		}

		if(Key[0].pressed==1)       //检测到上键
		{
	        Key[0].pressed=0;
			switch(ItemSel)
			{
			case 1:
				break;
			case 3:
				ItemSel=1;
				break;
			case 10:
				if(ADDAParaList[0]==2)		ItemSel=1;
				if(ADDAParaList[0]==1)		ItemSel=7;
				if(ADDAParaList[0]==0)		ItemSel=4;
				break;
			default:
				ItemSel--;
				break;
			}
			MovHand=1;				
		}

		if(Key[1].pressed==1)       //检测到下键
		{
	        Key[1].pressed=0;
			switch(ItemSel)
			{
			case 1:
				ItemSel=3;
				if(ADDAParaList[0]==2)		ItemSel=10;
				break;
			case 4:
				ItemSel=5;
				if(ADDAParaList[0]!=1)		ItemSel=10;
				break;
			case 7:
				ItemSel=10;
				break;
			case 11:
				break;
			default:
				ItemSel++;
				break;
			}
			MovHand=1;		
		}

		if(Key[2].pressed==1)       //检测到-键
		{
	        Key[2].pressed=0;
			switch(ItemSel)
			{
			case 1:
				if(ADDAParaList[0]==0)
				ADDAParaList[0]=2;
				else
				ADDAParaList[0]--;
				break;
			case 3:
				if(ADDAParaList[1]>1)
				ADDAParaList[1]--;
				break;
			case 4:
				if(ADDAParaList[2]>10)
				ADDAParaList[2]--;
				break;
			case 5:
				if(ADDAParaList[3]>0)
				ADDAParaList[3]-=10;
				break;
			case 6:
				if(ADDAParaList[4]>0)
				ADDAParaList[4]-=10;
				break;
			case 7:
				if(ADDAParaList[5]>0)
				ADDAParaList[5]-=10;
				break;
			default:
				break;
			}
			DASetUp_OnPaint();
			MovHand=1;
		}

		if(Key[3].pressed==1)       //检测到+键
		{
	        Key[3].pressed=0;
			switch(ItemSel)
			{
			case 1:
				if(ADDAParaList[0]==2)
				ADDAParaList[0]=0;
				else
				ADDAParaList[0]++;
				break;
			case 3:
				if(ADDAParaList[1]<100)
				ADDAParaList[1]++;
				break;
			case 4:
				if(ADDAParaList[2]<24)
				ADDAParaList[2]++;
				break;
			case 5:
				if(ADDAParaList[3]+ADDAParaList[4]+ADDAParaList[5]<=90)
				ADDAParaList[3]+=10;
				break;
			case 6:
				if(ADDAParaList[3]+ADDAParaList[4]+ADDAParaList[5]<=90)
				ADDAParaList[4]+=10;
				break;
			case 7:
				if(ADDAParaList[3]+ADDAParaList[4]+ADDAParaList[5]<=90)
				ADDAParaList[5]+=10;
				break;
			default:
				break;
			}
			DASetUp_OnPaint();
			MovHand=1;
		}

		if(Key[7].pressed==1)       //检测到确定键,向DACData中填充数据
		{
			ClearKey();
			Clear(0,240);
			if(ADDAParaList[0]==2)	//选择外部信号源无需DAC
			return ;
			DA_T4_INIT();			//T3初始化(根据选择的频率)
			DAC0_Init();			//DAC0初始化
			if(ADDAParaList[0]==0)	//选择正弦波
			{
				int i;
				for(i=0;i<64;i++)
				{
					DACdata[2*i]=((unsigned long)SinTable[i]*ADDAParaList[2]/24)>>8;
					DACdata[2*i+1]=((unsigned long)SinTable[i]*ADDAParaList[2]/24);
				}
			}
			if(ADDAParaList[0]==1)	//选择梯形波
			{
				int i=0;
				for(;i<ADDAParaList[3]*0.64;i++)					//上升沿
				{
					DACdata[2*i]=(unsigned int)(0xFFF/(ADDAParaList[3]*0.64)*i*ADDAParaList[2]/24)>>8;
					DACdata[2*i+1]=(unsigned int)(0xFFF/(ADDAParaList[3]*0.64)*i*ADDAParaList[2]/24);
				}
				for(;i<(ADDAParaList[3]+ADDAParaList[4])*0.64;i++)	//高电平
				{
					DACdata[2*i]=((unsigned long)0xFFF*ADDAParaList[2]/24)>>8;
					DACdata[2*i+1]=(unsigned long)0xFFF*ADDAParaList[2]/24;
				}
				for(;i<(ADDAParaList[3]+ADDAParaList[4]+ADDAParaList[5])*0.64;i++)	//下降沿
				{

⌨️ 快捷键说明

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