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

📄 main.txt

📁 基于msp430单片机波形发生器(正弦波)
💻 TXT
字号:
/***********************************************

************************************************/
#include <msp430x14x.h>
#include "key3.h"
#include "lcd.h"
//#include "flash.h"
typedef unsigned char uchar;
//#define Data_sin     0x1080
#define Data_Dir     P3DIR
#define Data_Port    P3OUT 
#define Ctrl_Dir     P5DIR
#define DA1CS_CLR P5OUT&=~(BIT0);    
#define DA1CS_SET P5OUT|=BIT0;	
#define DA2CS-SET P5OUT|=BIT1;	
#define DA2CS_CLR P5OUT&=~(BIT1);
#define WR_SET P5OUT|=BIT2;	
#define WR_CLR P5OUT&=~(BIT2);	
//引用外部变量的声明    
 unsigned char key_val;         
 unsigned char key_Flag;

uchar vref[52]={ 0x00,0x05,0x0a,0x0f,0x14,0x19,0x1e,0x23,0x28,0x2d,
                 0x32,0x37,0x3c,0x41,0x46,0x4b,0x50,0x55,0x5a,0x60,
                 0x65,0x6a,0x6f,0x74,0x79,0x7e,0x83,0x88,0x8d,0x92,
                 0x97,0x9c,0xa1,0xa6,0xab,0xb0,0xb5,0xba,0xc0,0xc5,
                 0xca,0xcf,0xd4,0xd9,0xde,0xe3,0xe8,0xed,0xf2,0xf7,
                 0xfc,0xff};//步进0.1V
                 
 uchar sin[256]={0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5 

,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5 

,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd 

,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda 

,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 

,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51 

,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16 

,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00 

,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15 

,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e 

,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80 }; 

 /*uchar sin[128]={0x80,0x87,0x91,0x95,0x99,0xa2,0xa6,0xb0,
                0xb4,0xb7,0xc0,0xc4,0xc7,0xd0,0xd3,0xd6,
                0xd9,0xe1,0xe4,0xe6,0xe8,0xea,0xf2,0xf3,
                0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfd,0xff,
                0xfd,0xfc,0xfa,0xf8,0xf7,0xf6,0xf5,0xf3,
                0xf2,0xf0,0xe8,0xe6,0xe4,0xe1,0xd9,0xd6,
                0xd3,0xd0,0xc7,0xc4,0xc0,0xb7,0xb4,0xb0,
                0xa7,0xa3,0x99,0x95,0x92,0x88,0x84,0x80,
                0x76,0x72,0x68,0x64,0x60,0x56,0x53,0x50,
                0x46,0x43,0x39,0x36,0x32,0x30,0x26,0x23,
                0x20,0x18,0x16,0x14,0x11,0x09,0x08,0x06,
                0x05,0x03,0x02,0x01,0x01,0x00,0x00,0x00,
                0x00,0x00,0x01,0x02,0x02,0x04,0x05,0x06,
                0x07,0x09,0x11,0x13,0x16,0x18,0x20,0x23,
                0x26,0x29,0x32,0x35,0x38,0x42,0x45,0x49,
                0x52,0x56,0x60,0x64,0x68,0x72,0x76,0x80};*/
int  freqency;
uchar i,m_m;
uchar *s1={"Freq:1000Hz"};
uchar *s2={"Vpp:10V"};
uchar *s3={"Freq:"};
uchar *s4={"Vpp:"};
void Timer_B(unsigned int  freqency);
//void Timer_A(unsigned int  freqency);
/********************主函数********************/

void main(void)
{
   
   // uchar temp;
   // int *pFlash;
    WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗
    //DCOCTL = DCO0 + DCO1 + DCO2;              // Max DCO
   // BCSCTL1 = RSEL0 + RSEL1 + RSEL2;          // XT2on, max RSEL
    //BoardConfig(0xb8);              //关闭数码管、流水灯和电平转换  

    /*------选择系统主时钟为8MHz-------*/
    BCSCTL1 &= ~XT2OFF;                 // 打开XT2高频晶体振荡器
    do
    {
        IFG1 &= ~OFIFG;                 // 清除晶振失败标志
        for (i = 0xFF; i > 0; i--);     // 等待8MHz晶体起振
    }
    while ((IFG1 & OFIFG));             // 晶振失效标志仍然存在?
    BCSCTL2 |= SELM_2 + SELS;           // MCLK和SMCLK选择高频晶振   */ 
      P3DIR=0xff;
      P3SEL=0X00;
      P5DIR=0x07;
      P5SEL=0X00; 
     init_Port(); 
     LcdReset();  //初始化LCD
     DispNChar(0,0,11,s1);      //显示提示文字
     DispNChar(0,1,6,s2);      //显示提示文字
   /* while(1)
    {
         //keyScan();
        if(key_Flag == 1)
        {
            
          key_Flag = 0;
                                                                                                                                                                                                                                                                                                                  
            //显示十位
            temp = key_val / 10;
            if(temp)
                Disp1Char(2,1,0x30+temp);  //数字的ASCII码值等于其本身数值加上0x30
            else
                Disp1Char(2,1,0x20);       //0x20是空格对应的ASCII码
            //显示个位
            temp = key_val % 10;
            Disp1Char(3,1,0x30+temp);   
        }
    }*/
    
   
for(;;)
  {
       init_Port();
       // DispNChar(0,0,11,s1);      //显示提示文字
       // DispNChar(0,1,6,s2);      //显示提示文字
      for(i=0;i<256;i=i+1)
         {
           
           DA2CS_CLR;
            //WR_CLR;
           P3OUT=sin[i];
           //P3OUT=sin[i+1];
          // P3OUT=sin[i+2];
          // P3OUT=sin[i+2];
          // P3OUT=sin[i+3];
          // P3OUT=sin[i+4];
           //P3OUT=sin[i+5];
          // P3OUT=sin[i+6];
          // P3OUT=sin[i+7];
          Timer_B(3);
             
         }
      if(key_Flag==1)break;
  }
while(1)
      
{
   init_Port();
  if(key_Flag==1)
    {
        key_Flag=0;
        Delay();
       
      // Delay();
         /*   if(key_val ==10)
          {
             DispNChar(0,0,5,s3);
             uchar j;
              j=0;
          
          //获取频率
         // freqency=0;
       switch(j)
          {
          case 0: freqency=key_val;break ;
          case 1: freqency=freqency*10+key_val;break ;
          case 2: freqency=freqency*100+freqency*10+key_val;break ;
          case 3: freqency=freqency*1000+freqency*100+freqency*10+key_val;
                   break ;
          default:j=0;
          }
          key_val=key_val|0x30;
          LcdWriteData( key_val );
          j++;
        } */
    /*display MAX_MIN*/
     /*if(key_val==11)
      {
        DispNChar(0,1,4,s4);
     
     
      //  delay();
      //  Check_Key();
        uchar k=0;
        k++;
        switch (k)
        { 
        case 1:m_m=key_val;break;
        case 2:m_m=m_m*10+key_val;break;
        
        default:k=0;
        }
        key_val=key_val|0x30;
        LcdWriteData(key_val);
        if(k==1)
        {LcdWriteData( '.' );}
       
      
       LcdWriteData('V');
      
      P5OUT&=~BIT0;
      P3OUT=vref[m_m];
     
      }*/
  
    /*产生正弦波*/
    if(key_val==12)
   {  
      
     // P5OUT|=~BIT0;
      while(1)
      {
        init_Port();
        P5OUT&=~BIT1;//开启DA2的片选信号
      for(i=0;i<256;i=i+2)
        {
          P3OUT=sin[i]; 
          P3OUT=sin[i+1];
          Timer_B(3);
        //TBCTL=TBSSEL1+TBCLR;//选择MCLK,清除TAR
       // TBCCTL0=CCIE;//TBCCR0中断
       // TBCCR0=freqency/32;//实现频率32Hz~320KHz
       // TBCTL|=MC0;//增计数模式
        
        }
      if(key_Flag==1)break;
      }
    } 
  
    /*方波*/
    if(key_val==13)
    {
      while(1)
      {
        init_Port();
        uchar k;
        k=0;
        P5OUT&=~BIT1;//开启DA2的片选信号
         while(k<256)
          {
            if(i<128){ P3OUT=0x00;}
             else P3OUT=0xff;
             k=k+2;
             Timer_B(3);
       //TACTL=TASSEL1+TACLR;//选择MCLK,清除TAR
      // CCTL0=CCIE;//TBCCR0中断
      // TACCR0=freqency;//实现频率32Hz~320KHz
      // TACTL|=MC0;//增计数模式
          }
         if(key_Flag==1)break;
       }
     }
    /*三角波*/
    if(key_val==14)
    {
     
      while(1)
      { 
        init_Port();
       P5OUT&=~BIT1;
       for(i=0;i<256;i=i+1)
        {
           if(i<128)P3OUT=i;
           else P3OUT=255-i;
           
           Timer_B(3);
         }
       if(key_Flag==1)break;
      }
    }
    
    //锯齿波
     if(key_val==15)
     {
       while(1)
        {
         init_Port();
         P5OUT&=~BIT1;
          for(i=0;i<256;i=i+2)
             {
                P3OUT=i;
                P3OUT=i+1;
                Timer_B(3);
        //TBCTL=TBSSEL1+TBCLR;//选择MCLK,清除TAR
        //TBCCTL0=CCIE;//TBCCR0中断
        //TBCCR0=freqency/32;//实现频率32Hz~320KHz
        //TBCTL|=MC0;//增计数模式

              }
        if(key_Flag==1)break;
         }
       }   
   }
  }
}
//#pragma vector=TIMERB0_VECTOR
//__interrupt void Timer_B (void)

 

void Timer_B(unsigned int  freqency)
{
   TBCTL = TBSSEL1 + TBCLR+MC0 ;                 // ACLK, clear TBR  
   TBCCTL0 = CCIE;                           // TRCCR0 interrupt enabled
   TBCCR0 =freqency ; 
  // TBCTL|=;
   while(!(TBCTL&BIT0));
    //TBCTL=~(MC_1);
    TBCTL&=~(BIT0);    
}
 
  


  
 

⌨️ 快捷键说明

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