📄 adda.c
字号:
#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 + -