您的位置:首页 > 其它

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

2017-11-13 21:07 148 查看
  这个题目的要求是用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;
}

}

}
}

有错误的话还请路过的大佬们指正。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单片机