用DDS AD 产生各种波形程序集.docx
《用DDS AD 产生各种波形程序集.docx》由会员分享,可在线阅读,更多相关《用DDS AD 产生各种波形程序集.docx(16页珍藏版)》请在冰点文库上搜索。
用DDSAD产生各种波形程序集
用DDSAD9854产生各种波形程序集
本程序集包含以下波形的程序:
正弦波,三角波,AM调制,FM调制,ASK调制,PSK调制,FSK调制
最后还有一个包含12864液晶显示、7290键盘控制的可以输出正弦波,三角波,方波(由单片机产生),AM调制,FM调制,ASK调制和PSK调制的一个DDS函数发生器的综合系统。
这些程序都是本人写的,单片机用的是TI的msp430f247,这些程序都经过精心调试,并都已调试成功。
希望这些程序能给需要的朋友一定的帮助。
头文件【】:
#definePAR1_H0x00;
send_data('5');
}
else
{
if(pow_10>=100)send_data(0x30+p[2]);
send_data(0x30+p[1]);
send_data('.');
send_data(0x30+p[0]);
}
send_data('d');
send_data('B');
send_data('m');
send_data(0x20);
;
send_data('5');
}
else
{
if(pow_10>=100)send_data(0x30+p[2]);
send_data(0x30+p[1]);
send_data('.');
send_data(0x30+p[0]);
}
send_data('d');
send_data('B');
send_data('m');
send_data(0x20);
set_xy(0,4);
send_data(0xb2);//步
send_data(0xbd);
send_data(0xbd);//进
send_data(0xf8);
send_data(0xa3);//:
send_data(0xba);
set_xy(7,2);
send_data(0x11);
set_xy(3,2);
}
#pragmavector=PORT1_VECTOR
__interruptvoidkey_int(void)
{
if(!
(P1IFG&BIT7))
{
P1IFG=0;
return;
}
ap=0;
P1IFG=0;
key_press=1;
}
#pragmavector=USCIAB0TX_VECTOR
__interruptvoidI2C_RX(void)
{
if(IFG2&UCB0RXIFG)key_code=UCB0RXBUF;//接收中断
}
#pragmavector=TIMERA0_VECTOR
__interruptvoidTimer_A(void)
{
if(M==3)
{
if(ap)
{
P3OUT&=~BIT0;//Toggle
ap=0;
send_byte(OSKI_2,0X00);
send_byte(OSKI_1,0X00);
}
else
{
P3OUT|=BIT0;
ap=1;
send_byte(OSKI_2,0XFF);
send_byte(OSKI_1,0X0F);
}
}
if(M==4)
{
if(ap)
{
ctr_out&=~FBH;
ap=0;
}
else
{
ctr_out|=FBH;
ap=1;
}
}
}
#pragmavector=ADC12_VECTOR
__interruptvoidadc12()
{
if(M==1)
{
samp=ADC12MEM0;
dc=(1-A)*0XFFF/(1+A);
ac=2*A*samp/(1+A);
ATW=dc+ac;
send_byte(OSKI_2,ATW/0x100);
send_byte(OSKI_1,ATW%0x100);
}
elseif(M==2)
{
samp=ADC12MEM0;
if(samp>0x7ff)
{
am=samp-0x7ff;
per=am*0x10000/0x7ff;//per-longint;
scal=0x10000;
while(pp3>0x0f&&per>=0x600){per/=0x10;scal/=0x10;}
while(pp3<0x10&&per>=0x1000){per/=0x10;scal/=0x10;}
MPY=pp1;
OP2=per;
_NOP();
_NOP();
spp1=RESLO;
c=RESHI;
MPY=pp2;
OP2=per;
_NOP();
_NOP();
spp2=RESLO;
spp2=spp2+c;
c=RESHI;
MPY=pp3;
OP2=per;
_NOP();
_NOP();
spp3=RESLO;
spp3=spp3+c;
switch(scal)
{
case0x10000:
spp1=spp2;spp2=spp3;spp3=0x0000;break;
case0x1000:
spp1=spp1/0x1000+(spp2%0x1000)*0x10;spp2=spp2/0x1000+(spp3%0x1000)*0x10;spp3=spp3/0x1000;break;
case0x100:
spp1=spp1/0x100+(spp2%0x100)*0x100;spp2=spp2/0x100+(spp3%0x100)*0x100;spp3=spp3/0x100;break;
case0x10:
spp1=spp1/0x10+(spp2%0x10)*0x1000;spp2=spp2/0x10+(spp3%0x10)*0x1000;spp3=spp3/0x10;
}
send_byte(FTW1_1,ftw_1+spp1%0x100);
send_byte(FTW1_2,ftw_2+spp1/0x100);
send_byte(FTW1_3,ftw_3+spp2%0x100);
send_byte(FTW1_4,ftw_4+spp2/0x100);
send_byte(FTW1_5,ftw_5+spp3%0x100);
send_byte(FTW1_6,ftw_6+spp3/0x100);
}
else
{
am=0x7ff-samp;
per=am*0x10000/0x7ff;//per-longint;
scal=0x10000;
while(pp3>0x0f&&per>=0x600){per/=0x10;scal/=0x10;}
while(pp3<0x10&&per>=0x1000){per/=0x10;scal/=0x10;}
MPY=pp1;
OP2=per;
_NOP();
_NOP();
spp1=RESLO;
c=RESHI;
MPY=pp2;
OP2=per;
_NOP();
_NOP();
spp2=RESLO;
spp2=spp2+c;
c=RESHI;
MPY=pp3;
OP2=per;
_NOP();
_NOP();
spp3=RESLO;
spp3=spp3+c;
switch(scal)
{
case0x10000:
spp1=spp2;spp2=spp3;spp3=0;break;
case0x1000:
spp1=spp1/0x1000+(spp2%0x1000)*0x10;spp2=spp2/0x1000+(spp3%0x1000)*0x10;spp3=spp3/0x1000;break;
case0x100:
spp1=spp1/0x100+(spp2%0x100)*0x100;spp2=spp2/0x100+(spp3%0x100)*0x100;spp3=spp3/0x100;break;
case0x10:
spp1=spp1/0x10+(spp2%0x10)*0x1000;spp2=spp2/0x10+(spp3%0x10)*0x1000;spp3=spp3/0x10;
}
ftw11=0x100+ftw_1-spp1%0x100;
ftw12=0x100+ftw_2-(0x01-ftw11/0x100)-spp1/0x100;
ftw13=0x100+ftw_3-(0x01-ftw12/0x100)-spp2%0x100;
ftw14=0x100+ftw_4-(0x01-ftw13/0x100)-spp2/0x100;
ftw15=0x100+ftw_5-(0x01-ftw14/0x100)-spp3%0x100;
ftw16=ftw_6-(0x01-ftw15/0x100)-spp3/0x100;
send_byte(FTW1_1,(uchar)ftw11);
send_byte(FTW1_2,(uchar)ftw12);
send_byte(FTW1_3,(uchar)ftw13);
send_byte(FTW1_4,(uchar)ftw14);
send_byte(FTW1_5,(uchar)ftw15);
send_byte(FTW1_6,(uchar)ftw16);
}
}
ADC12CTL0&=~ENC;
}
//**********发送1字节数据************//
voidsend_byte(ucharadd,uchardata)
{
data_dir=0xff;
ctr_out|=WR;
add_out=add;//送地址
_NOP();
ctr_out&=~WR;//拉低WR
data_out=data;//送数据
_NOP();
ctr_out|=WR;//拉高WR
if(fclk){ctr_out|=UDCLK;ctr_out&=~UDCLK;}
else{delayus(5);fclk=1;}
}
//***********************************//
//**********读取一个字节的数据**********//
ucharread_byte(ucharadd)
{
uchardat;
data_dir=0x00;
ctr_out|=RD;
add_out=add;
ctr_out&=~RD;
_NOP();
dat=data_in;
ctr_out|=RD;
returndat;
}
//**************************************//
voidsend_command(unsignedcharcommand)
{
Data_dir=0x00;
RS_0;
RW_1;
E_1;
while(Data_in&0x80);
Data_dir=0xFF;
E_0;
RS_0;
RW_0;
Data_out=command;
E_1;
_NOP();
E_0;
}
voidsend_data(unsignedchardata)
{
Data_dir=0x00;
RS_0;
RW_1;
E_1;
while(Data_in&0x80);
Data_dir=0xFF;
E_0;
RS_1;
RW_0;
Data_out=data;
E_1;
_NOP();
E_0;
//lcd_count^=0x01;
//if(lcd_count==1)lcd_con1[con++]=data;
//elselcd_x++;
}
/*******************************************************************/
//设置显示位置xpos(1~16),tpos(1~4)
/*******************************************************************/
voidset_xy(unsignedcharxpos,unsignedcharypos)
{
switch(ypos)
{
case1:
send_command(0X80|xpos);break;
case2:
send_command(0X90|xpos);break;
case3:
send_command(0X88|xpos);break;
case4:
send_command(0X98|xpos);break;
default:
break;
}
}
/*******************************************************************/
//在指定位置显示字符串
/*******************************************************************/
voidprint(unsignedcharx,unsignedchary,unsignedchar*str)
{
unsignedcharlcd_temp;
set_xy(x,y);
lcd_temp=*str;
while(lcd_temp!
=0x00)
{
send_data(lcd_temp);
lcd_temp=*(++str);
}
}
/********************写字符串******************/
//写字符串子程序
//xpos1取0~7共八列,ypos1取1~4共四行。
/**********************************************/
voidprintstr(unsignedcharxpos,unsignedcharypos,unsignedcharstr[],unsignedchark)
{unsignedcharn;
switch(ypos)
{case1:
xpos|=0x80;break;//第一行
case2:
xpos|=0x90;break;//第二行
case3:
xpos|=0x88;break;//第三行
case4:
xpos|=0x98;break;//第四行
default:
break;
}
send_command(xpos);//此处的Xpos已转换为LCM的显示寄存器实际地址
for(n=0;n{
send_data(str[n]);//显示汉字时注意码值,连续两个码表示一个汉字
}
}
/********************清屏************************/
//清屏
/************************************************/
voidclr_lcd(void)
{
send_command(0x01);
//send_command(0x34);
//send_command(0x30);
}
/********数字退格键**********/
voidbackspace()
{
if(lcd_count==0)
{
if(lcd_x!
=0)
{
lcd_x--;
set_xy(lcd_x,lcd_y);
lcd_count=0;
send_data(lcd_con1[--con]);
send_data(0x20);
lcd_x--;
set_xy(lcd_x,lcd_y);
lcd_count=0;
send_data(lcd_con1[--con]);
}
else
{
lcd_x=7;
lcd_y--;
set_xy(lcd_x,lcd_y);
lcd_count=0;
send_data(lcd_con1[--con]);
send_data(0x20);
lcd_x=7;
lcd_y--;
set_xy(lcd_x,lcd_y);
lcd_count=0;
send_data(lcd_con1[--con]);
}
}
else
{
set_xy(lcd_x,lcd_y);
lcd_count=0;
lcd_con=lcd_con1[--con];
send_data(0x20);
lcd_con1[--con]=lcd_con;
con++;
set_xy(lcd_x,lcd_y);
lcd_count=0;
}
}
//**********1us延时************//
voiddelayus(uintt)
{
while(t--)us;
}