历史上的今天
今天是:2025年03月28日(星期五)
2020年03月28日 | 基于msp430单片机的方波发生器
2020-03-28 来源:eefocus
这个题目的要求是用msp430f149模拟一个信号发生器,信号发生器的频率在100-1000hz,通过按键可以实现每次加减100hz,另外加入串口通信,还可以通过pc机发送来的数值,将频率调整为相应的频率值。
信号的产生用到的是timerA 来产生pwm波,通过控制周期从而达到控制频率的目的。
以下是代码:
#include "msp430x14x.h"
#include "Config.h"
#include #include 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; } } } }
下一篇:MSP430 WDT
史海拾趣
|
请问ROM/bin文件的格式是什么如何执行处理的? 例如在【显示设置】中的 1234512345,在手机/MP4的ROM中发现是DF5FBBB9BA的,请问做了那些处理?变换的方式是什么? 二进制的: 1234512345 0001 0010 0011 0100 0101 0001 0010 0011 0100 01 ...… 查看全部问答> |
|
想找个兼职,VC、单片机、arm嵌入式开发 作过基于microchip系列、msp430系列、S3C44B0、AT91RM9200、ST710等mcu的项目, 包括电力系统监控、税控等行业. 可承担四层板电路设计,底层嵌入式程序设计及上位机配套程序编写。 13816950690 msn:xh_du ...… 查看全部问答> |
|
本人相当的菜鸟,也不知道我形容的清楚不清楚. 就是说想象机顶盒那样的直接按电源开关进行关机操作,是不是需要预先将windows xp嵌入到主板上呢??… 查看全部问答> |
|
电平触发方式的中断不是应该保持中断状态么?咋我这个接地之后只是变化的慢了而不是完全不动呢? #include void delay(unsigned int z); //延迟子程序声明 sbit dula=P1^0; //段锁位 sbit A1=P2^2; sbit B1=P2^3; sbit C1=P2^4; ...… 查看全部问答> |




