基于msp430单片机的方波发生器

  这个题目的要求是用msp430f149模拟一个信号发生器,信号发生器的频率在100-1000hz,通过按键可以实现每次加减100hz,另外加入串口通信,还可以通过pc机发送来的数值,将频率调整为相应的频率值。

  信号的产生用到的是timerA 来产生pwm波,通过控制周期从而达到控制频率的目的。

  以下是代码:

#include "msp430x14x.h"
#include "Config.h"
#include <stdlib.h>
#include <string.h>
int flag=0;
uchar key;
unsigned int a=5;
//unsigned int b=5;
uchar string[3], j = 0;
void TIMERA_Init(void)                                   //连续计数模式,计数到0XFFFF产生中断
{
    TACTL |= TASSEL1 + TACLR + ID0 + ID1 + MC0 + TAIE;     //SMCLK做时钟源,8分频,增加计数模式 
    
}
void set(){
   switch(a)
       {
      
       case 1:  {
               TACCR0=9999;
               CCR1=5000;
               
                }
               break;
       case 2:  {
               TACCR0=4999;
               CCR1=2500;
               
                }
               break; 
       case 3: {
               TACCR0=3332;
               CCR1=1500;
              
                }
               break;
       case 4:  {
               TACCR0=2499;
               
                }
               break;
       case 10: {
               TACCR0=999;
              
                }
               break;
       case 9 : {
               TACCR0=1111;
              
                }
               break;
       case 8:  {
               TACCR0=1250;
                 
                }
               break;
       case 7:  {
               TACCR0=1428;
              
                }
               break;  
       case 6: {
               TACCR0=1666;
              
                }
               break;
       case 5: {
               TACCR0=2000;
               
                }
               break;
       /*default:{
               TACCR0=2000;
               a = 5;
       }break; */ 
       }
}
void UART_Init()
{
  U0CTL|=SWRST + CHAR;                //复位SWRST,8位数据模式
  U0TCTL|=SSEL1;                      //SMCLK为串口时钟
  U0BR1=baud_h;                       //BRCLK=8MHZ,Baud=BRCLK/N
  U0BR0=baud_l;                       //N=UBR+(UxMCTL)/8
  U0MCTL=0x00;                        //微调寄存器为0,波特率9600bps
  ME1|=UTXE0;                         //UART0发送使能
  ME1|=URXE0;                         //UART0接收使能
  U0CTL&=~SWRST;
  IE1|=URXIE0;                        //接收中断使能位
  
  P3SEL|= BIT4 + BIT5;                //设置IO口为第二功能模式,启用UART功能
  P3DIR|= BIT4;                       //设置TXD0口方向为输出
}
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX_ISR(void)
{
  uchar data;
  data=U0RXBUF;  
  if(data == 'a')
    P6OUT = 0x00;
  a = data-0x30;
  if(a != 0)
    set();
}

#pragma vector = TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
  switch(TAIV)                                  //需要判断中断的类型
  {
  case 2:break;
  case 4:break;
  case 10:flag++;break;
  }
}
void KeyPort_init()
{

  P1SEL = 0x04;                   //P1普通IO功能
  P1DIR = 0x04;                   //P10~P13输入模式,外部电路已接上拉电阻
 
}

uchar Key_Scan(void) 
{
  uchar key_check;
  uchar key_checkin;
  key_checkin=KeyPort;          	//读取IO口状态,判断是否有键按下
  key_checkin&= 0x0F;          		//读取IO口状态,判断是否有键按下
    if(key_checkin!=0x0F)            	//IO口值发生变化则表示有键按下
      { 
        delay_ms(10); 
        key_check=KeyPort ;
        switch (key_check & 0x0F)
              {
                case 0x0E: 
                  {                   
                    key=1;
                  }
                  break;
                case 0x0D:{  
                    key=2;
                  }
                  break;
              }      
      }
    else
     {
       key=0xFF;        
     }
  return key;
}
void main(void)
{
      WDTCTL = WDTPW + WDTHOLD;
      TIMERA_Init(); 
      Clock_Init();
      UART_Init();
      KeyPort_init();
      P6DIR=0xff;
      TACCTL1 = OUTMOD_7;
       _EINT();
      CCR1=500;
      TACCR0 = 2000;
      while(1)
      {
       Key_Scan(); 
          if(key!=0xff)
       {     
        
         switch(key)
        {
        case 1:
          {  
            while((P1IN & 0x01)!=0)
             {
             
             }
            delay_ms(300); 
            a--;
            set();
          }
          break;
        case 2:
          {
            
            while((P1IN & 0x02)!=0)
             {
                
             }
             delay_ms(300); 
             a++;   
             set();
          }
          break;        
        }
       
       }
      
      }
}

有错误的话还请路过的大佬们指正。。。

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值