硬件为MSP430G2553,小弟大一,还没有数电和模电基础,硬学试试。
麻烦先看看要求:
1.AD 模块的使用
使用内部ADC 模块持续测量一个外部电压(0—2.5V )
2.定时器模块的使用
用 1 中测量的电压值决定两个 LED 中一个的闪烁频率,电压越高闪烁越快,另一个暂时熄灭
3. 外部中断,按键的使用
测量电压的同时,如果按一次按键,则触发外部中断,使两个LED 交换闪烁和熄灭状态
4 .串行通信模块的使用
在 3 的中断触发后,串口发送一个小写a 到z 的英文字母,如按第一次发送一个 a,按第二次发送一个b。(发送至z后从按开始重新发送)同时用串口接收自己发送的数据。- #include
- unsigned int adc_value=0;
- unsigned int t=0;
- unsigned char re;
- float voltage_value;
- unsigned char flag=0;
- void delay(int i) //延迟函数,用于按键软件防抖
- {
- while(i--);
- }
- void main( void )
- {
- WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
-
- //ADC配置
- ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE + REF2_5V + REFON + SREF0; // 设置采样保持,打开ADC10,打开ADC中断,设置2.5V的参考电压
- ADC10CTL1 = INCH_4 ; // 单通道输入 通道4
- ADC10AE0 |= BIT5; // P1.5 输入
- P1DIR |= BIT0+BIT6; // 设置P1.0为LED1输出,设置P1.6为LED2输出
- ADC10CTL0 |= ENC + ADC10SC; // 开始转换
- //定时器配置
- TACCTL0 = CCIE; //使Timer_A能触发中断
- TACCR0 = 0; //配置Timer_A倒计时初始值
- TACTL = TASSEL_2 + MC_2; //选择时钟源为子系统时钟,模式控制设置为计时从0到TACCR0
- //按键设置
- P1DIR &= ~BIT3; //P1.3设置为输入
- P1OUT |= BIT3; //P1.3处于高电位
- P1REN |= BIT3; //使P1.3能上拉下拉电阻
- P1IES |= BIT3; //P1.3高电位到低电位触发中断
- P1IE |= BIT3; //使P1.3能申请中断
- P1IFG = 0; //中断标记复位
- //UART配置
- BCSCTL1 = CALBC1_1MHZ;
- DCOCTL = CALDCO_1MHZ;
- P1SEL = BIT1 + BIT2; // P1.1 = RXD, P1.2=TXD
- P1SEL2 = BIT1 + BIT2; // P1.1 = RXD, P1.2=TXD
- UCA0CTL1 |= UCSSEL_2; // SMCLK
- UCA0BR0 = 104; // 1MHz 9600
- UCA0BR1 = 0; // 1MHz 9600
- UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1
- UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
- IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
- _EINT(); //打开总中断
- while(1)
- {
- }
- }
- // ADC中断函数
- #pragma vector=ADC10_VECTOR
- __interrupt void ADC10_ISR(void)
- {
- while(!(P1IN&BIT3))
- _EINT();
- adc_value = ADC10MEM; //将转换值存入adc_value中
- voltage_value = adc_value/1024.0*2.5;
- ADC10CTL0 |= ENC + ADC10SC; //开始下一次转换
- }
- //定时器中断函数
- #pragma vector=TIMER0_A0_VECTOR
- __interrupt void Timer_A (void)
- {
- if(flag==0)
- {
- P1OUT &= ~BIT6;
- P1OUT ^= BIT0;
- }
- else
- {
- P1OUT &=~BIT0;
- P1OUT ^=BIT6;
- }
- CCR0 += (int)((2.5-voltage_value)/2.5*65535);
- }
- //按键中断函数
- #pragma vector=PORT1_VECTOR
- __interrupt void p1()
- {
- delay(2000);
- if(!(P1IN&BIT3))
- flag = !flag;
- while(!(P1IN&BIT3));
- delay(2000);
- while (!(IFG2&UCA0TXIFG));
- UCA0TXBUF='a'+(t++)%26;
- _EINT();
- P1IFG = 0;
- }
- //UART接收中断函数
- #pragma vector=USCIAB0RX_VECTOR
- __interrupt void USCI0RX_ISR(void)
- {
- re = UCA0RXBUF; // TX -> RXed character
- }
复制代码现在出现问题有:
1.在未测量电压时,LED会无规律乱闪,当测量电压时(P1.4接GND或VCC),只能以恒定间隔闪动,不满足要求1,找不出原因;
2.貌似测电压要等一段时间才能测准确,P1.4接GND时会出各种各样的电压值;
3.控制灯频率和UART通信的时钟都是
SMCLK,这个会不会有影响?
真心谢谢帮助的人!
此帖出自
小平头技术问答
一周热门 更多>