📄 main.c
字号:
/*************************************************************************************************
MSP430F1611 VS AD9854
实现功能:
可调频率正弦波输出0~10MHz
AM调制
FM调制
BFSK
BPSK
BASK
By 6队 2007/5/26
**************************************************************************************************/
#include<msp430x16x.h>
#include"7290.h"
#include"lcd.h"
#include"define9854.h"
#include"setclock.h"
#include"math.h"
#include"dac12.h"
#define TIME1 800 //TACCR1定时时间
#define TIME0 500 //TACCCR0定时时间
#define DAC_TIME 60 //AM调制信号由DAC12输出
/*************************************************************
全局变量
*************************************************************/
//总控制
unsigned char WHICH=0;
unsigned char SET=0; //0 表示键盘在非读取状态
unsigned char RESET=1; //1 表示重设参数 第一次进入的状态为1
unsigned long get_data; //键盘输入的数值
unsigned char GO=0; //无模块运行时为0
unsigned char j=0;
//SIN
unsigned char UP=0; //程控量
unsigned char DOWM=0;
unsigned char LEFT=0;
unsigned char RIGHT=0;
unsigned long sinx=8590; //步进量控制字
unsigned long display_sinx=100; //显示的步长
unsigned int phash=4096;
//键盘
unsigned long temp_num[8]; //存储输入数据为字符串
unsigned char temp_i=0;
unsigned char state=0; //输入为负数时state等于1
unsigned char ReadBuf[3]; //键盘缓存
unsigned long TOTAL=0; //输入数据的十进制
//FM
unsigned int p_to_sin; //正弦表指针
unsigned int fr=60; //TACCR0
unsigned long ftw_fm=0; //载波频率控制字
unsigned long add_fm=419; //最大频偏控制字
unsigned char FM_ADD=0; //最大频偏改变标志,步长调节标志
unsigned char BEGING=0; //开始调制标志
//输出正弦表中16个值
signed int sin_data[16]={0x0000,0x030f,0x05A8,0X07EF,0X800,0X07EF,0X05A8,0X030F,0X0000,-0x030f,-0x05A8,-0X07EF,-0X800,-0X07EF,-0X05A8,-0X030F};
//BPSK
unsigned char display[9]={'\0'};
//AM
unsigned int *out_sin; //输出的正弦调制信号
//FM
unsigned long f_fsk1=0;
unsigned long f_fsk2=0;
unsigned char dsply_exit[]="0:退出 1:重设";
unsigned char dsply_out[]="退出:0 ";
unsigned char erro[]="输入错误";
unsigned int test1,test2=0;
void IniSIN();
void SIN() ;
void get_num(uchar key);
void GetBin(unsigned char key);
void AM();
void FM();
void PSK();
void ASK();
void FSK();
void DelayTime(unsigned char n){
unsigned char i,k,j;
for(i=0;i<254;i++)
for(j=0;j<254;j++)
for(k=0;k<n;k++);
}
void menu()
{
LCD_LcmClearTXT();
P4DIR|=BIT0;
LCD_PutStr(0,0,"1:正弦信号发生器");
LCD_PutStr(1,0,"2:AM调制3:FM调制");
LCD_PutStr(2,0,"4:PSK调制");
LCD_PutStr(3,0,"5:ASK调制");
}
int main()
{
WDTCTL=WDTPW+WDTHOLD;
open_XT2(); //7290需要MCLK
BCSCTL2 =SELM_2+SELS;
_EINT();
ini_7290();
LCD_LcmInit();
LCD_LcmClearTXT();
LCD_PutStr3(0,0,"6队作品 信号发生器 ");
DelayTime(60);
LCD_LcmClearTXT();
while(1)
{
SET=0;
RESET=1;
GO=0;
DOWM=0;
UP=0;
FM_ADD=0;
BEGING=0;
menu();
Init9854();
LPM0; //中断函数设置which进入相应模块
_NOP();
switch (WHICH)
{
case 1 : SIN(); break;
case 2 : AM(); break;
case 3 : FM(); break;
case 4 : PSK(); break;
case 5 : ASK(); break;
case 6 : FSK(); break;
default : break ;
}
WHICH=0;
}
}
/*****************************************************************************
键盘中断处理
*****************************************************************************/
#pragma vector = PORT2_VECTOR
__interrupt void l7289do ()
{
uchar key_num;
IRcvStr(0x70,0x01,(uchar*)ReadBuf,3);
key_num=ReadBuf[0];
if((ReadBuf[1]==0)&&(ReadBuf[2]==0xff))
{ //禁止连按
switch(key_num)
{
case 9: key_num=4; break;
case 10: key_num=5; break;
case 11: key_num=6; break;
case 17: key_num=7; break;
case 18: key_num=8; break;
case 19: key_num=9; break;
case 12: key_num=0; break;
case 20: key_num=12; break; //取消
case 4: key_num=11; break; //确定
default :break;
}
if(SET&&key_num<13)
{ //键盘在读取状态
if((WHICH==4)||(WHICH==5)||(WHICH==6))
{
GetBin(key_num);
}
else
{
get_num(key_num);
}
goto loop2;
}
if(GO)
{ //模块正在运行,判断要退出还是重设
if(key_num==1) RESET=1;
else if(key_num==0) GO=0;
else if(key_num==4) DOWM=1;
else if(key_num==6) UP=1;
else if(key_num==5) FM_ADD=1;
else if(key_num==8) BEGING=1;
else if(key_num==7) LEFT=1;
else if(key_num==9) RIGHT=1;
goto loop2;
}
if(key_num<7) //键盘在非设置状态,选择模块
{
WHICH=key_num;
LPM0_EXIT;
}
}//if
loop2:
P2IFG&=~0X10;
}
void get_num(uchar key)
{
unsigned char tr,k,h;
unsigned char WriteBuf[2];
if((key<10)&&(temp_i<8))
{ //输入为数字,多于8会溢出
WriteBuf[1]=key;
tr=4+temp_i;
tr=tr&0x07;
WriteBuf[0]=0x60+tr; //在第 time_i 位数码管译码并显示key
ISendStr(0x70,0x07,(uchar*)WriteBuf,2);
temp_num[temp_i]=key;
temp_i++;
return ;
}
if(key==11)
{ //结算
Clear_7290();
if(temp_num[0]==0)
{
state=1; //输入为负数
}
else
{
state=0;
}
for(k=0;k<temp_i;k++)
{
for(h=k;h<temp_i-1;h++)
temp_num[k]=temp_num[k]*10;
TOTAL=TOTAL+temp_num[k];
}
SET=0;
temp_i=0;
temp_num[0]=0;
Clear_7290();
return ;
}
if(key==12)
{ //清除
Clear_7290();
for(k=0;k<8;k++)
{
temp_num[k]=0;
}
temp_i=0;
TOTAL=0;
return ;
}
}
void GetBin(unsigned char key)
{
unsigned char tr,k;
unsigned char WriteBuf[2];
if((key<2)&&(temp_i<8))
{ //输入0,1,8位
WriteBuf[1]=key;
tr=4+temp_i;
tr=tr&0x07;
WriteBuf[0]=0x60+tr; //在第 time_i 位数码管译码并显示key
ISendStr(0x70,0x07,(uchar*)WriteBuf,2);
temp_num[temp_i]=key;
temp_i++;
return ;
}
if(key==11)
{ //结算
Clear_7290();
SET=0;
TOTAL=temp_i;
Clear_7290();
return ;
}
if(key==12)
{ //清除
Clear_7290();
for(k=0;k<8;k++)
{
temp_num[k]=0;
}
temp_i=0;
TOTAL=0;
return ;
}
}
void InitSIN() //初始化SIN模式
{
//Init9854();
send_data[0]=0X60;
send_data[1]=0X00;
send_data[2]=0X44;
send_data[3]=0X10;
send(4, control,send_data);
send_data[0]=0Xff;
send_data[1]=0XFF;
send(2,SHAPI,send_data);
send(2,SHAPQ,send_data);
LCD_LcmClearTXT();
Clear_7290();
LCD_PutStr(0,0,"步长:100Hz");
LCD_PutStr(1,0,"频率:");
send_data[0]=0XFF;
send_data[1]=0XFF;
TOTAL=0;
temp_i=0;
sinx=8590;
display_sinx=100;
}
void SIN()
{
GO=1;
while(GO)
{
if(RESET) //重设参数
{
InitSIN();
SET=1;
while(SET==1);
if(TOTAL>40000000) //输入频率越界
{
LCD_PutStr(0,3,erro);
delayMS(9999);
TOTAL=0;
continue;
}
get_data=TOTAL*85;
get_data+=(get_data)/93-get_data/8400;
get_data=get_data/4+10;
send_data[1]=0XFF;
send_data[0]=0XFF;
send_data[2]=(unsigned char )get_data;
send_data[3]=(unsigned char )(get_data>>8);
send_data[4]=(unsigned char )(get_data>>16);
send_data[5]=(unsigned char )(get_data>>24);
send(6, FTW1,send_data); //写入9854寄存器
LCD_PutNum_l(1,3,TOTAL);
LCD_PutStr(-1,-1,"Hz");
LCD_PutStr(2,0,"4:下调 6:上调");
LCD_PutStr(3,0,dsply_exit);
SET=0;
RESET=0;
}//if
if(UP&&((TOTAL+display_sinx)<=40000000)) //频率升100Hz
{
get_data+=sinx/4;
send_data[2]=(unsigned char )get_data;
send_data[3]=(unsigned char )(get_data>>8);
send_data[4]=(unsigned char )(get_data>>16);
send_data[5]=(unsigned char )(get_data>>24);
send(6, FTW1,send_data); //写入9854寄存器
TOTAL+=display_sinx;
LCD_PutStr(1,3," ");
LCD_PutNum_l(1,3,TOTAL);
LCD_PutStr(-1,-1,"Hz");
UP=0;
}
if(DOWM&&(TOTAL>display_sinx)) //频率降100Hz
{
get_data-=sinx/4;
send_data[2]=(unsigned char )get_data;
send_data[3]=(unsigned char )(get_data>>8);
send_data[4]=(unsigned char )(get_data>>16);
send_data[5]=(unsigned char )(get_data>>24); //写入9854寄存器
send(6, FTW1,send_data);
TOTAL-=display_sinx;
LCD_PutStr(1,3," ");
LCD_PutNum_l(1,3,TOTAL);
LCD_PutStr(-1,-1,"Hz");
DOWM=0;
}
if(LEFT&&(phash>409))
{
phash=phash-409;
send_data[0]=(unsigned char )phash;
send_data[1]=(unsigned char )(phash>>8);
send(2,SHAPI,send_data);
send(2,SHAPQ,send_data);
LEFT=0;
}
if(RIGHT&&(phash<3687))
{
phash=phash+409;
send_data[0]=(unsigned char )phash;
send_data[1]=(unsigned char )(phash>>8);
send(2,SHAPI,send_data);
send(2,SHAPQ,send_data);
RIGHT=0;
}
if(FM_ADD==1) //调节步长x10
{
sinx=sinx*10;
display_sinx=display_sinx*10;
if( display_sinx==100000000)
{
display_sinx=100;
sinx=8590;
}
LCD_PutStr(0,0," ");
LCD_PutStr(0,0,"步长:");
LCD_PutNum_l(-1,-1,display_sinx);
LCD_PutStr(-1,-1,"Hz");
FM_ADD=0;
}
}
}
/*****************************************************************************
初始化
*****************************************************************************/
void TimerAInit(unsigned char selet)
{
TACTL=TASSEL_2; //选择时钟源为 MCLK
}
/*****************************************************************************
打开或关闭定时
doit: 0:停止 100:运行 ti: 定时时间
*****************************************************************************/
void GotimeDfA(unsigned char doit,unsigned char selet )
{
if(doit==100)
{
TACCR0=TIME0; //设置定时时间
TACCR1=TIME1;
if(selet)
{
TACCTL1 = CCIE; //允许定时器中断
}
else
{
TACCTL0 = CCIE;
// p_to_sin=(signed int*)0xf100; //在此初始化正弦列表的头指针
}
TACTL |= MC_2+TACLR; //打开定时器
}
else
{
if(selet==0)
{
TACTL &= ~MC0; //关闭定时器
TACCTL0 &= ~CCIE;
}
else
{
TACTL &= ~MC0; //关闭定时器
TACCTL1 &= ~CCIE;
}
}
}
/****************************************************************************************
向FLASH写入正弦列表
开头地址为 adrs ,写入一个周期共628个值
********************************************************************************************/
void write(unsigned int adrs)
{
signed int* adr;
int i;
float k;
FCTL2=FWKEY+FSSEL0+FN0;
adr=(signed int *)adrs;
FCTL1=FWKEY+ERASE;
FCTL3=FWKEY;
*adr=0;
FCTL1=FWKEY+WRT;
k=0;
for(i=0;i<629;i++)
{
*adr++=(unsigned int)((sin(k)+1)*2040);
k=k+0.01;
}
}
/*****************************************************************************
捕获/比较0中断
*****************************************************************************/
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0(void)
{
// test1=TAR;
//捕获/比较0中断
if(WHICH==3) // FM调制
{
TACCR0+=TIME0;
p_to_sin++;
p_to_sin=p_to_sin&0x0f;
get_data=ftw_fm+sin_data[p_to_sin]*add_fm;
get_data=get_data/4;
send_data[2]=(unsigned char )get_data;
send_data[3]=(unsigned char )(get_data>>8);
send_data[4]=(unsigned char )(get_data>>16);
send_data[5]=(unsigned char )(get_data>>24);
send(6, FTW1,send_data);
//写入9854寄存器
}
else // AM调制
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -