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

📄 main.c

📁 430 单片机控制产生正玄波输出 周期频率可以调节
💻 C
📖 第 1 页 / 共 2 页
字号:
/*************************************************************************************************
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 + -