【电赛MSP430系列】GPIO、LED、按键、时钟、中断、串口、定时器、PWM、ADC
文章目录
- MSP430
- 一、GPIO
- 二、点亮LED
- 三、按键控制LED
- 四、更改主时钟
- 五、串口通信
- 六、串口中断
- 七、外部中断
- 八、定时器
- 九、定时器中断
- 十、PWM
- 十一、ADC
MSP430
MSP430 是德州仪器(TI)一款性能卓越的超低功耗 16 位单片机,自问世以来,MSP430 单片机一直是业内公认的功耗最低的单片机。除采用先进的制造工艺使芯片的静态电流尽可能降低外,MSP430 的独立可配置的时钟系统是其低功耗的基石之一。在追求绿色能源的今天,MSP430 超低功耗微控制器正以其超低功耗的特性,以及丰富多样化的外设受到越来越多设计者们的青睐。
一、GPIO
MSP430G2553共有两个通用数字端口P1和P2。
端口P1和 P2具有输入/输出\中断和外部模块功能,这些功能可以通过它们各自的7个控制寄存器的设置来实现。
- 1. PxDIR输入/输出方向寄存器
相互独立的8位分别定义了8个引脚的输入/输出方向.8位在PUC后都被复位。使用时先根据需要定义端口的方向以满足设计者要求。
0 : I/O引脚被切换成输入模式;
1 : IO引脚被切换成输出模式。
- 2. PxIN输入寄存器
输入寄存器是CPU扫描IO引脚信号的只读寄存器。通过读取该寄存器的内容获取IO端口的输入信号。此时引脚的方向必须选定为输入。读出时,该引脚的方向寄存器必须设置为输入模式。
- 3. PxOUT输出寄存器
该寄存器为IO端口的输出缓冲寄存器。其内容可以像操作内存数据一样写入,以达到改变IO口状态的目的。在读取时输出缓存的内容与引脚方向定义无关。改变方向寄存器的内容,输出缓存的内容不受影响。
- 4. PxIE中断使能寄存器
该寄存器的各引脚都有一位用以控制该引脚是否允许中断,该寄存器中0 :禁止该位中断;
1 :允许该位中断。
- 5. PxIES 中断触发沿选择寄存器
如果允许Px口的某个引脚中断,还需定义该引脚的中断触发沿。该寄存器的8位分别定义了Px口的8个引脚的中断触发沿。
0:上升沿使相应标志置位;
1:下降沿使相应标志置位。
- 6. PxIFG中断标志寄存器
该寄存器有8个标志位,它们含有相应引脚是否有待处理中断的信息,即
相应引脚是否有中断请求。如果Px的某个引脚允许中断,同时选择上升沿,则当该引脚发生由低电平向高电平跳变时,PxFG的相应位就会置位,表明在该引脚上有中断事件发生。
0 :没有中断请求;1 :有中断请求。
- 7. PxSEL功能选择寄存器
Pl和P2两端口还有其他片内外设功能,考虑减少引脚,将这些功能与芯片外的联系通过复用P1和P2引脚的方式来实现.PxSEL用来选择引脚的IO端口功能与外围模块功能。
0 :选择引脚为I/O端口;
1 :选择引脚为外围模块功能。
以下我以msp430g2553为例,解析GPIO的使用。
二、点亮LED
由上方电路图可读:
- LED灯为P1.0和P1.6引脚,与下方GND相连,则为高电平驱动。
- 按键为P1.3引脚,默认为悬空状态,当按键按下时与GND相连,为低电平状态。
#include <msp430.h> int main(void)
{WDTCTL = WDTPW | WDTHOLD; // 关闭看门狗/*初始化LED2为输出*/P1DIR |= BIT6;/*初始化LED2为低电平,熄灭*/P1OUT &= ~BIT6;/*初始化KEY P1.3为输入*/P1DIR &= ~BIT3;/*使能P1.3口的上拉电阻*/P1REN |= BIT3;P1OUT |= BIT3;while(1){if(P1IN & BIT3) /*如果P1.3口为高电平,证明按键没有被按下*/{P1OUT &= ~BIT6; //熄灭LED2}else{P1OUT |= BIT6; //点亮LED2}}return 0;
}
三、按键控制LED
#include <msp430.h> int main(void)
{WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer/*初始化LED2为输出*/P1DIR |= BIT6;/*初始化LED2为低电平,熄灭*/P1OUT &= ~BIT6;/*初始化KEY P1.3为输入*/P1DIR &= ~BIT3;/*使能P1.3口的上拉电阻*/P1REN |= BIT3;P1OUT |= BIT3;while(1){if(P1IN & BIT3) /*如果P1.3口为高电平,证明按键没有被按下*/{P1OUT &= ~BIT6; //熄灭LED2}else{P1OUT |= BIT6; //点亮LED2}}return 0;
}
四、更改主时钟
#include <msp430.h> int main(void)
{WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer/*设置MCLK频率1,8,12,16*/DCOCTL = CALDCO_16MHZ;BCSCTL1 = CALBC1_16MHZ;/*初始化LED2所在的IO口P1.6设置为输出*/P1DIR |= BIT6;/*初始化LED2 为低电平*/P1OUT &= ~BIT6;while(1){P1OUT ^= BIT6;__delay_cycles(500000);}return 0;
}
五、串口通信
#include <msp430.h>
#include "stdint.h"
/** @fn: void InitSystemClock(void)* @brief: 初始化系统时钟* @para: none* @return:none* @comment: 初始化系统时钟*/
void InitSystemClock(void)
{/*配置DCO为1MHZ时钟*/DCOCTL = CALDCO_1MHZ;BCSCTL1 = CALBC1_1MHZ;/*配置SMCLK的时钟源为DCO*/BCSCTL2 &= ~SELS;/*SMCLK的分频系数置为1*/BCSCTL2 &= ~(DIVS0 | DIVS1);
}/** @fn: void InitUART(void)* @brief: 初始化串口,包括设置波特率,数据位,校验位等* @para: none* @return:none* @comment: 初始化串口*/
void InitUART(void)
{/*复位USCI_Ax*/UCA0CTL1 |= UCSWRST;/*设置为异步模式*/UCA0CTL0 &= ~UCSYNC;/*配置UART时钟源为SMCLK*/UCA0CTL1 |= UCSSEL1;/*配置波特率为9600*/UCA0BR0 = 0x68;UCA0BR1 = 0x00;UCA0MCTL = 1 << 1;/*配置端口,使能端口复用*/P1SEL |= BIT1 + BIT2;P1SEL2 |= BIT1 + BIT2;/*清除复位位,使能UART*/UCA0CTL1 &= ~UCSWRST;
}/** @fn: void UARTSendString(uint8_t *pbuff, uint_8 num)* @brief: 初始化串口发送字符串* @para: pbuff:指向要发送字符串的指针* num:要发送的字符个数* @return:none* @comment: 初始化串口发送字符串*/
void UARTSendString(uint8_t *pbuff, uint8_t num)
{uint8_t cnt = 0;for(cnt = 0; cnt < num; cnt++){/*判断是否有数据正在发送*/while(UCA0STAT & UCBUSY);UCA0TXBUF = *(pbuff + cnt);}
}/** @fn: void PrintNumber(uint16_t num)* @brief: 初始化串口发送数字* @para: num:变量* @return:none* @comment: 初始化串口发送数字*/
void PrintNumber(uint16_t num)
{uint8_t cnt = 0;uint8_t buff[6] = {0,0,0,0,0,'\n'};for(cnt = 0; cnt < 5; cnt++){buff[4 - cnt] = (uint8_t)(num % 10 + '0');num /= 10;}UARTSendString(buff,6);
}int main(void)
{WDTCTL = WDTPW | WDTHOLD; // stop watchdog timerInitSystemClock();InitUART();while(1){PrintNumber(23456);__delay_cycles(500000);}return 0;
}
六、串口中断
#include <msp430.h>
#include "stdint.h"uint8_t combuff[20] = {0}; //长度为20的命令缓冲区,用于保存串口接收到的命令
uint8_t iscomend = 0; //命令结束标志位
/** @fn: void InitSystemClock(void)* @brief: 初始化系统时钟* @para: none* @return:none* @comment: 初始化系统时钟*/
void InitSystemClock(void)
{/*配置DCO为1MHZ时钟*/DCOCTL = CALDCO_1MHZ;BCSCTL1 = CALBC1_1MHZ;/*配置SMCLK的时钟源为DCO*/BCSCTL2 &= ~SELS;/*SMCLK的分频系数置为1*/BCSCTL2 &= ~(DIVS0 | DIVS1);
}/** @fn: void InitUART(void)* @brief: 初始化串口,包括设置波特率,数据位,校验位等* @para: none* @return:none* @comment: 初始化串口*/
void InitUART(void)
{/*复位USCI_Ax*/UCA0CTL1 |= UCSWRST;/*设置为异步模式*/UCA0CTL0 &= ~UCSYNC;/*配置UART时钟源为SMCLK*/UCA0CTL1 |= UCSSEL1;/*配置波特率为9600*/UCA0BR0 = 0x68;UCA0BR1 = 0x00;UCA0MCTL = 1 << 1;/*配置端口,使能端口复用*/P1SEL |= BIT1 + BIT2;P1SEL2 |= BIT1 + BIT2;/*清除复位位,使能UART*/UCA0CTL1 &= ~UCSWRST;/*接收中断启用*/IE2 |= UCA0RXIE;/*清空接收中断标志*/IFG2 &= ~UCA0RXIFG;
}/** @fn: void UARTSendString(uint8_t *pbuff, uint_8 num)* @brief: 初始化串口发送字符串* @para: pbuff:指向要发送字符串的指针* num:要发送的字符个数* @return:none* @comment: 初始化串口发送字符串*/
void UARTSendString(uint8_t *pbuff, uint8_t num)
{uint8_t cnt = 0;for(cnt = 0; cnt < num; cnt++){/*判断是否有数据正在发送*/while(UCA0STAT & UCBUSY);UCA0TXBUF = *(pbuff + cnt);}
}/** @fn: void PrintNumber(uint16_t num)* @brief: 初始化串口发送数字* @para: num:变量* @return:none* @comment: 初始化串口发送数字*/
void PrintNumber(uint16_t num)
{uint8_t cnt = 0;uint8_t buff[6] = {0,0,0,0,0,'\n'};for(cnt = 0; cnt < 5; cnt++){buff[4 - cnt] = (uint8_t)(num % 10 + '0');num /= 10;}UARTSendString(buff,6);
}/** @fn: void Execute(uint8_t *combuff)* @brief: 串口命令执行函数* @para: combuff:指向串口命令缓冲区的指针* @return:none* @comment: 串口命令执行函数*/
void Execute(uint8_t *combuff)
{const uint8_t charbuff[5][10] = {"王龙","米雷龙","班长","LED1 ON!","LED1 OFF!"};if(combuff[0] == charbuff[0][0] && combuff[1] == charbuff[0][1]){UARTSendString("aa",2);}else if(combuff[0] == charbuff[1][0] && combuff[1] == charbuff[1][1]){UARTSendString("bb",2);}else if(combuff[0] == charbuff[2][0] && combuff[1] == charbuff[2][1]){UARTSendString("cc",2);}else if(combuff[0] == charbuff[3][0] && combuff[6] == charbuff[3][6]){UARTSendString("Yes,LED ON!",11);P1OUT |= BIT0;}if(combuff[0] == charbuff[4][0] && combuff[6] == charbuff[4][6]){UARTSendString("Yes,LED OFF!",12);P1OUT &= ~BIT0;}
}int main(void)
{WDTCTL = WDTPW | WDTHOLD; // stop watchdog timerInitSystemClock();InitUART();P1DIR |= BIT0;P1OUT &= ~BIT0;__bis_SR_register(GIE);//打开总中断while(1){if(iscomend){iscomend = 0; //清除标志位,防止重复执行Execute(combuff);}}return 0;
}#pragma vector = USCIAB0RX_VECTOR
__interrupt void UART_Receive_ISR(void) //Port1_ISR(void) 中断服务函数
{static uint8_t cnt = 0;if(IFG2 & UCA0RXIFG)//检测是否是USCI_AO的接收中断,USCI_AO和USCI_BO的接收中断共享同一向量{IFG2 &= ~UCA0RXIFG; //清空接收中断标志combuff[cnt++] = UCA0RXBUF; //保存命令cnt %= 20; //防止cnt大于20,导致缓存区溢出if(combuff[cnt - 1] == '\n'){cnt = 0; //复位计数器iscomend = 1; //命令接收完毕标志}}/*清空接收中断标志*/IFG2 &= ~UCA0RXIFG;
}
七、外部中断
#include <msp430.h> /*** main.c*/
int main(void)
{WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer/*初始化LED2为输出*/P1DIR |= BIT6;/*初始化LED2为低电平,熄灭*/P1OUT &= ~BIT6;/*初始化KEY P1.3为输入*/P1DIR &= ~BIT3;/*使能P1.3口的上拉电阻*/P1REN |= BIT3;P1OUT |= BIT3;/*打开P1.3口的中断*/P1IE |= BIT3;/*设定为下降沿触发*/P1IES |= BIT3;/*清除中断标志位*/P1IFG &= ~BIT3;/*打开全局中断*/__bis_SR_register(GIE);while(1){}return 0;
}#pragma vector = PORT1_VECTOR
__interrupt void Port1_ISR(void) //Port1_ISR(void) 中断服务函数
{if(P1IFG & BIT3) //判断是否P1.3产生中断{P1OUT ^= BIT6;P1IFG &= ~ BIT3; //清除标志位}
}
八、定时器
#include <msp430.h>
#include "stdint.h"int main(void)
{uint8_t cnt = 0;WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer/*配置DCO为1MHZ时钟*/DCOCTL = CALDCO_1MHZ;BCSCTL1 = CALBC1_1MHZ;P1DIR |= BIT0 ;/*配置时钟源为SMCLK*/TA1CTL |= TASSEL_2;/*设置工作模式为Up Mode*/TA1CTL |= MC_1;/*设置定时时间间隔*/TA1CCR0 = 49999; //0.05swhile(1){if(TA1CTL & TAIFG){cnt++;TA1CTL &= ~TAIFG; //清除标志位if(cnt == 20){P1OUT ^= BIT0;cnt = 0;}}}return 0;
}
九、定时器中断
#include <msp430.h>
#include "stdint.h"uint32_t currenttime = 40500; //用来保存时间的变量,初值代表11:15:00
uint8_t flag = 0;
/** @fn: void InitSystemClock(void)* @brief: 初始化系统时钟* @para: none* @return:none* @comment: 初始化系统时钟*/
void InitSystemClock(void)
{/*配置DCO为1MHZ时钟*/DCOCTL = CALDCO_1MHZ;BCSCTL1 = CALBC1_1MHZ;/*配置SMCLK的时钟源为DCO*/BCSCTL2 &= ~SELS;/*SMCLK的分频系数置为1*/BCSCTL2 &= ~(DIVS0 | DIVS1);
}/** @fn: void InitUART(void)* @brief: 初始化串口,包括设置波特率,数据位,校验位等* @para: none* @return:none* @comment: 初始化串口*/
void InitUART(void)
{/*复位USCI_Ax*/UCA0CTL1 |= UCSWRST;/*设置为异步模式*/UCA0CTL0 &= ~UCSYNC;/*配置UART时钟源为SMCLK*/UCA0CTL1 |= UCSSEL1;/*配置波特率为9600*/UCA0BR0 = 0x68;UCA0BR1 = 0x00;UCA0MCTL = 1 << 1;/*配置端口,使能端口复用*/P1SEL |= BIT1 + BIT2;P1SEL2 |= BIT1 + BIT2;/*清除复位位,使能UART*/UCA0CTL1 &= ~UCSWRST;/*接收中断启用*/IE2 |= UCA0RXIE;/*清空接收中断标志*/IFG2 &= ~UCA0RXIFG;
}/** @fn: void UARTSendString(uint8_t *pbuff, uint_8 num)* @brief: 初始化串口发送字符串* @para: pbuff:指向要发送字符串的指针* num:要发送的字符个数* @return:none* @comment: 初始化串口发送字符串*/
void UARTSendString(uint8_t *pbuff, uint8_t num)
{uint8_t cnt = 0;for(cnt = 0; cnt < num; cnt++){/*判断是否有数据正在发送*/while(UCA0STAT & UCBUSY);UCA0TXBUF = *(pbuff + cnt);}
}/** @fn: void PrintTime(uint32_t time)* @brief: 初始化串口发送字符串* @para: pbuff:指向要发送字符串的指针* num:要发送的字符个数* @return:none* @comment: 初始化串口发送字符串*/
void PrintTime(uint32_t time)
{uint8_t charbuff[] = {0,0,':',0,0,':',0,0,'\n'};charbuff[7] = (uint8_t)((time % 60) % 10) + '0'; //得到当前秒个位charbuff[6] = (uint8_t)((time % 60) / 10) + '0'; //得到当前秒十位charbuff[4] = (uint8_t)((time % 3600) / 60 % 10) + '0'; //得到当前分个位charbuff[3] = (uint8_t)((time % 3600) / 60 / 10) + '0'; //得到当前分十位charbuff[1] = (uint8_t)((time / 3600) % 10) + '0'; //得到当前时个位charbuff[0] = (uint8_t)(time / 3600 / 10) + '0'; //得到当前时十位UARTSendString("当前时间:",10);UARTSendString(charbuff,9);
}int main(void)
{WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer/*配置DCO为1MHZ时钟*/DCOCTL = CALDCO_1MHZ;BCSCTL1 = CALBC1_1MHZ;InitSystemClock();InitUART();P1DIR |= BIT0 ;/*配置时钟源为SMCLK*/TA1CTL |= TASSEL_2;/*设置工作模式为Up Mode*/TA1CTL |= MC_1;/*设置定时时间间隔*/TA1CCR0 = 49999; //0.05s/*打开定时器TAIFG中断*/TA1CTL |= TAIE;/*打开全局中断*/__bis_SR_register(GIE);while(1){if(flag == 1){flag = 0;P1OUT ^= BIT0;PrintTime(currenttime);}}return 0;
}#pragma vector = TIMER1_A1_VECTOR
__interrupt void Timer_Tick(void)
{static uint8_t cnt = 0;switch(TA1IV) //读取的话无需手动清零标志位{case 0x02:break;case 0x04:break;case 0x0A:cnt++;if(cnt == 20){cnt = 0;flag = 1; //1s时间到了currenttime ++; //时间加1currenttime %= 86400; //一天24小时,防止溢出}break;default:break;}
}
十、PWM
#include <msp430.h> int main(void)
{unsigned int cnt = 0;WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer/*配置DCO为1MHZ时钟*/DCOCTL = CALDCO_1MHZ;BCSCTL1 = CALBC1_1MHZ;/*初始化P1.6为输入*/P1DIR &= ~BIT6;/*设置时钟源为SMCLK*/TA1CTL |= TASSEL_2;/*设置工作模式为Up & Dowm*/TA1CTL |= MC_0 | MC_1;/*设置TA1CCR0为0x00ff*/TA1CCR0 = 0x00FF;/*设置TA1CCR2为0x00ff*/TA1CCR2 = 0x00FF; //占空比 = (TACCR0 - TACCR2)/ TACCR0 频率 = SMCLK / (TACCR0+1)/2/*设置为比较模式*/TA1CCTL0 &= ~CAP;TA1CCTL2 &= ~CAP;/*设置比较输出模式*/TA1CCTL2 |= OUTMOD_6;/*设置IO复用*/P2SEL |= BIT5;P2DIR |= BIT5;while(1){for(cnt = 0;cnt < 0x00FF; cnt++){TA1CCR2 = cnt;__delay_cycles(5000);}for(cnt = 0x00FF;cnt > 0; cnt--){TA1CCR2 = cnt;__delay_cycles(5000);}}return 0;
}
十一、ADC
#include <msp430.h>
#include "stdint.h"/** @fn: void InitSystemClock(void)* @brief: 初始化系统时钟* @para: none* @return:none* @comment: 初始化系统时钟*/
void InitSystemClock(void)
{/*配置DCO为1MHZ时钟*/DCOCTL = CALDCO_1MHZ;BCSCTL1 = CALBC1_1MHZ;/*配置SMCLK的时钟源为DCO*/BCSCTL2 &= ~SELS;/*SMCLK的分频系数置为1*/BCSCTL2 &= ~(DIVS0 | DIVS1);
}/** @fn: void InitUART(void)* @brief: 初始化串口,包括设置波特率,数据位,校验位等* @para: none* @return:none* @comment: 初始化串口*/
void InitUART(void)
{/*复位USCI_Ax*/UCA0CTL1 |= UCSWRST;/*设置为异步模式*/UCA0CTL0 &= ~UCSYNC;/*配置UART时钟源为SMCLK*/UCA0CTL1 |= UCSSEL1;/*配置波特率为9600*/UCA0BR0 = 0x68;UCA0BR1 = 0x00;UCA0MCTL = 1 << 1;/*配置端口,使能端口复用*/P1SEL |= BIT1 + BIT2;P1SEL2 |= BIT1 + BIT2;/*清除复位位,使能UART*/UCA0CTL1 &= ~UCSWRST;/*接收中断启用*/IE2 |= UCA0RXIE;/*清空接收中断标志*/IFG2 &= ~UCA0RXIFG;
}/** @fn: void UARTSendString(uint8_t *pbuff, uint_8 num)* @brief: 初始化串口发送字符串* @para: pbuff:指向要发送字符串的指针* num:要发送的字符个数* @return:none* @comment: 初始化串口发送字符串*/
void UARTSendString(uint8_t *pbuff, uint8_t num)
{uint8_t cnt = 0;for(cnt = 0; cnt < num; cnt++){/*判断是否有数据正在发送*/while(UCA0STAT & UCBUSY);UCA0TXBUF = *(pbuff + cnt);}
}/** @fn: void PrintNumber(uint16_t num)* @brief: 初始化串口发送数字* @para: num:变量* @return:none* @comment: 初始化串口发送数字*/
void PrintNumber(uint16_t num)
{uint8_t cnt = 0;uint8_t buff[6] = {0,0,0,0,0,'\n'};for(cnt = 0; cnt < 5; cnt++){buff[4 - cnt] = (uint8_t)(num % 10 + '0');num /= 10;}UARTSendString(buff,6);
}/** @fn: void PrintFloat(float num)* @brief: 初始化串口发送浮点型数字* @para: num:浮点型变量* @return:none* @comment: 初始化串口发送浮点型数字*/
void PrintFloat(float num)
{uint8_t buff[] = {0,'.',0,0,0,'\n'};uint16_t temp = (uint16_t)(num * 1000);buff[0] = (uint8_t)(temp / 1000) + '0';buff[2] = (uint8_t)((temp % 1000) / 100) + '0';buff[3] = (uint8_t)((temp / 100) / 10) + '0';buff[4] = (uint8_t)(temp % 10) + '0';UARTSendString(buff,6);
}/** @fn: void InitADC(void)* @brief: ADC初始化* @para: none* @return:none* @comment: ADC初始化*/
void InitADC(void)
{/*设置ADC时钟MCLK*/ADC10CTL1 |= ADC10SSEL_2;/*ADC 2分频*/ADC10CTL1 |= ADC10DIV_0;/*设置ADC基准源*/ADC10CTL0 |= SREF_1;/*设置ADC采样保持时间64CLK*/ADC10CTL0 |= ADC10SHT_3;/*设置ADC采样率200k*/ADC10CTL0 &= ~ADC10SR;/*ADC基准选择2.5V*/ /* ADC基准选择1.5V */ADC10CTL0 |= REF2_5V; /* ADC10CTL0 &= ~REF2_5V; *//*开启基准*/ADC10CTL0 |= REFON;/*选择ADC输入通道A0*/ADC10CTL1 |= INCH_0;/*允许A0模拟输入*/ADC10AE0 |= 0x0001;/*开启ADC*/ADC10CTL0 |= ADC10ON;
}/** @fn: uint16_t GetADCValue(void)* @brief: 进行一次ADC转换并返回ADC转换结果* @para: none* @return:ADC转换结果* @comment: ADC转换结果为10bit,以uint16_t类型返回,低10位有效数据*/
uint16_t GetADCValue(void)
{/*开始转换*/ADC10CTL0 |= ADC10SC|ENC;/*等待转换完成*/while(ADC10CTL1 & ADC10BUSY);/*返回结果*/return ADC10MEM;
}int main(void)
{float voltage = 0.0;uint16_t adcvalue = 0;WDTCTL = WDTPW | WDTHOLD; // stop watchdog timerInitSystemClock();InitUART();InitADC();while(1){adcvalue = GetADCValue();voltage = adcvalue * 2.5 / 1023;UARTSendString("ADC10转接结果为:",17);PrintNumber(adcvalue);UARTSendString("相应电压值为:",14);PrintFloat(voltage);__delay_cycles(300000);}return 0;
}
相关文章:
【电赛MSP430系列】GPIO、LED、按键、时钟、中断、串口、定时器、PWM、ADC
文章目录MSP430一、GPIO二、点亮LED三、按键控制LED四、更改主时钟五、串口通信六、串口中断七、外部中断八、定时器九、定时器中断十、PWM十一、ADCMSP430 MSP430 是德州仪器(TI)一款性能卓越的超低功耗 16 位单片机,自问世以来,…...
【Linux】进程理解与学习(Ⅱ)
环境:centos7.6,腾讯云服务器Linux文章都放在了专栏:【Linux】欢迎支持订阅🌹相关文章推荐:【Linux】冯.诺依曼体系结构与操作系统【Linux】进程理解与学习(Ⅰ)浅谈Linux下的shell--BASH前言章节…...
vscode 爽到起飞的快捷键
这里写目录标题1. 窗口操作2. 代码编辑3. 批量操作4. 错误处理1. 窗口操作 文件之间切换: CtrlTab 切出一个新的编辑器窗口(最多3个): Ctrl\ 切换左中右3个编辑器窗口的快捷键: Ctrl1 Ctrl2 Ctrl3 2. 代码编辑 代码格式化: ShiftAltF 向上或向下移动一行: Alt…...
vs +qt 打包.cpp和.h为DLL文件
文章目录一 编译成库1 创建一个Qt library 项目2,将已有的文件拷贝到项目目录下3 在项目中添加现有项4,拷贝头文件到需要暴露给外面使用的类的头文件中5 拷贝xxx_EXPORT的宏到需要被暴露的类的名前面6 然后点击编译 就完成了。得到的dll文件在debug里面二…...
echarts有滑块
vue下使用echarts折线图及其横坐标拖拽功能 drawLine() {let that this,lineDate [],dispatchCount [],finishCount [],newCount [];let param {// 参数};axios.post(url, param).then(function(response) {let rs response.data.data;if (rs ! undefined && rs…...
MATLAB绘制ROC曲线
ROC曲线(Receiver Operating Characteristic Curve) 1 简介 ROC曲线是用于评估二元分类模型(如Logistic回归)表现优劣的一种工具,其横轴表示假阳性率(false positive rate,FPR),即实际为负例但…...
ChatGPT前传
文章目录前言GPT概述GPT-1代GPT-1 学习目标和概念介绍GPT-1 训练数据集GPT-1 模型结构和应用细节GPT-1 效果性能和总结GPT-2代GPT-2 学习目标和概念介绍GPT-2 训练数据集GPT-2 模型结构和应用细节GPT-2 性能效果和总结GPT-3代GPT-3 学习目标和概念介绍GPT-3 训练数据集GPT-3 模…...
我的十年编程路 2020年篇
我出生在1990年,2020年到来的时候,我完成了一项成就:奔三。同时,也开启了新的征程:奔四。 2020年的春节是在广州的丈母娘家度过的,春节后大概是初五,或者是初六,我和媳妇就返回天津…...
力扣-SQL【入门】
https://leetcode.cn/study-plan/sql/?progressxhqm4sjh 目录选择595. 大的国家1757. 可回收且低脂的产品584. 寻找用户推荐人183. 从不订购的客户排序 & 修改1873. 计算特殊奖金627. 变更性别196. 删除重复的电子邮箱选择 595. 大的国家 # Write your MySQL query state…...
Vue中组件到底是什么
1.先说结论: Vue中组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。 2.我们使用组件时发生了什么? 比如定义了一个school,然后在页面上使用它 我们只需要写 < school/ > 或< school &…...
不同时间间隔数据对统计结果的影响
目录摘要1. 实测数据来源2. 数据分析方法3 结果分析3.1 波况分析摘要 采用不同的波浪观测方法所获得的波浪数据的时间间隔不一致,其数据的准确性须进行分析。基于大埕湾逐时周年波浪观测数据,截取不同时间间隔的波浪数据,采用统计和相关分析…...
hudi系列-数据写入方式及使用场景
hudi支持多种数据写入方式:insert、bulk_insert、upsert、boostrap,我们可以根据数据本身属性(append-only或upsert)来选择insert和upsert方式,同时也支持对历史数据的高效同步并嫁接到实时流程。 这里的使用技术组合为flink + hudi-0.11 upsert 这是hudi默认的写入方式,…...
C # FileStream文件流
本章讲述:FileStream类的基本功能,以及简单示例; 1、引用命名空间:using System.IO; 2、注意:使用IO操作文件时,要注意流关闭和释放问题! 强力推荐:将创建文件流对象的过程写在usi…...
Go语言中的保留字和运算符详解
前言 🏠个人主页:我是沐风晓月 🧑个人简介:大家好,我是沐风晓月,双一流院校计算机专业,阿里云博客专家 😉😉 💕 座右铭: 先努力成长自己ÿ…...
Linux编译之(1)C语言基础
Linux编译之C语言基础 Author:Once Day Date:2023年3月11日 漫漫长路,才刚刚开始… 1.概述 在Linux下开发多源文件的C代码文件,是一定要了解Makefile的,虽然现在构建工具很多,但学习的一开始࿰…...
CPU平均负载高问题定位分析
一、Linux操作系统CPU平均负载 1.1什么是CPU平均负载 1.2 怎么查看平均负载数值 二、Linux操作系统CPU使用率和平均负载区别 CPU使用率和平均负载区别 三、阿里云Linux操作系统CPU压测环境准备 3.1 核心命令应用场景 3.2 模拟生产环境出现的多种问题环境准备 分析工具安…...
Python蓝桥杯训练:基本数据结构 [二叉树] 中
Python蓝桥杯训练:基本数据结构 [二叉树] 中 文章目录Python蓝桥杯训练:基本数据结构 [二叉树] 中一、[翻转二叉树](https://leetcode.cn/problems/invert-binary-tree/)二、[对称二叉树](https://leetcode.cn/problems/symmetric-tree/)三、[二叉树的最…...
读取 DTC 信息服务 (0x19) – UDS 协议
总目录链接>> AutoSAR入门和实战系列总目录 0x19读取 DTC 信息服务概述 读取 DTC 信息服务在 UDS 协议中用于从车辆或特定 ECU 或节点读取 DTC。UDS 协议的主要任务之一是故障诊断。每当车辆发生任何故障时,与该故障相对应的诊断故障代码(DTC&a…...
Hive 分区表新增字段 cascade
背景 在以前上线的分区表中新加一个字段,并且要求添加到指定的位置列。 模拟测试 加 cascade 操作 创建测试表 create table if not exists sqltest.table_add_column_test(org_col1 string comment 原始数据1,org_col2 string comment 原始数据2 ) comment 增…...
【Java版oj】day08两种排序方法、最小公倍数
目录 一、两种排序方法 (1)原题再现 (2)问题分析 (3)完整代码 二、最小公倍数 (1)原题再现 (2)问题分析 (3)完整代码 一、两种…...
FinOps,从概念到落地 | UGeek大咖说第一期直播回顾(上)
2023年2月28日,由优维科技联合FinOps产业推进方阵举办了第1期「UGeek大咖说-极致用云共济FinOps」线上直播活动,来自中国信通院及美图公司技术专家共同带来了一场精彩的技术视听盛宴。 直 播 背 景 目前,许多以“上云”为数字化转型路径的企…...
k8s java程序实现kubernetes Controller Operator 使用CRD 学习总结
k8s java程序实现kubernetes Controller & Operator 使用CRD 学习总结 大纲 原理Controller 与 Operator自定义资源定义 CRD ( CustomResourceDefinition)kubernetes-client使用java fabric8io/kubernetes-client操作k8s 原生资源使用java abric8io/kubernetes-clientt操…...
Unity笔记:修改代码执行的默认打开方式
使用 External Tools 偏好设置可设置用于编写脚本、处理图像和进行源代码控制的外部应用程序。 External Script Editor:选择 Unity 应使用哪个应用程序来打开脚本文件。Unity 会自动将正确的参数传递给内置支持的脚本编辑器。Unity 内置支持 Visual Studio Commun…...
Linux IPC:匿名管道 与 命名管道
目录一、管道的理解二、匿名管道三、命名管道四、管道的通信流程五、管道的特性进程间通信方式有多种,本文介绍的是管道,管道分为匿名管道和命名管道。 一、管道的理解 生活中的管道用来传输资源,例如水、石油之类的资源。而进程间通信的管道…...
阿里研发工程师JAVA暑期实习一面
文章目录先说一下我自己的情况面试过程总结先说一下我自己的情况 我就读于湖南大学,软件工程专业,现在大三下 很巧的是,我在大二的时候就在相同的时间面过相同的部门和相同的岗位,所以我没有做笔试就直接让我去面试了。我当时还纳…...
第十四届蓝桥杯三月真题刷题训练——第 11 天
目录 第 1 题:卡片 题目描述 运行限制 第 2 题:路径_dpgcd 运行限制 第 3 题:字符统计 问题描述 输入格式 输出格式 样例输入 样例输出 评测用例规模与约定 运行限制 第 4 题:费用报销 第 1 题:卡片 题…...
机器学习入门——线性回归
线性回归什么是线性回归?回归分析:线性回归:回归问题求解单因子线性回归简单实例评估模型表现可视化模型展示多因子线性回归什么是线性回归? 回归分析: 根据数据,确定两种或两种以上变量间相互依赖的定量…...
Microsoft Word 远程代码执行漏洞(CVE-2023-21716)
本文转载于: https://mp.weixin.qq.com/s?__bizMzI5NTUzNzY3Ng&mid2247485476&idx1&sneee5c7fd1c4855be6441b8933b10051e&chksmec535547db24dc516d013d3d76097e985aaad7f10f82f15b4e355a97af75fd333acdab6232af&mpshare1&scene23&srci…...
Android kotlin 系列讲解(数据篇)SharedPreferences存储及测试
文章目录 一、什么是SharedPreferences1、将数据存储到SharedPreferences中2、从SharedPreferences中读取数据二、登录使用SharedPreferences一、什么是SharedPreferences SharedPreferences是使用键值对的方式来存储数据的。也就是说,当保存一条数据的时候,需要给这条数据提…...
一文了解Web Worker
一、概述 众所周知,JavaScript最初设计是运行在浏览器中的,为了防止多个线程同时操作DOM带来的渲染冲突问题,所以JavaScript执行器被设计成单线程。但是随着前端技术的发展,JavaScript要处理的工作也越来越复杂,当我们…...
企业网站建设需要哪些费用/推广点击器
在上篇文章写到我们为什么要分层.有很多读者提出来很多宝贵的意见.让我受益匪浅,深深的感觉到自己的水平"还有很大的提升空间".首先感谢这些朋友们,我会进一步总结完善自己的想法. 截取了部分朋友的留言,感谢他们: 这次我用对比的方式描述一下,分层到底分出了什么.俗…...
网站建设接单/兰州seo技术优化排名公司
题目描述 给定n个点 给出他们的权值, 并且给出他们的父子关系 现在给他们染色, 一个节点染色的消耗为 T*a[i], T为这个节点是第几次染色 a[i]为权值 根节点可以随时染色 问: 染色完需要全部节点的最小消耗样例 Sample Input 5 1…...
wordpress读写分离配置/seo排名课程咨询电话
dst cv.distanceTransform(src, distanceType, maskSize[, dst[, dstType]]) 这个函数用来干嘛呢??答:计算源图像中每个像素到最近零像素的距离。 参考:https://www.jianshu.com/p/fe4ec897dbf5 https://www.cnblogs.com/ssy…...
wordpress怎么开启/sem和seo区别与联系
设计思想与代码规范均借鉴明德扬至简设计法,有不足之处希望大家多提建议,真正做到至简设计。本篇着重提出FPGA通用设计思想,以计数器为核心的代码规范以及VIVADO debug操作流程。 此次试验旨在通过串口试验,讲述FPGA的硬件设计…...
重庆大渡口营销型网站建设公司推荐/怎么自己做个网站
PMP(Project Management Professional)是项目管理专业人士资格认证,是由美国国际认证协会(PMI)发起的严格评估项目管理人员知识技能是否具有高品质的资格认证考试。目前已在全球190多个国家和地区得到了认可࿰…...
做企业网站联系/百度投诉中心24小时电话
数据来源百度百科 皮尔森相关系数 皮尔森相关系数的公式为: 样本的简单相关系数一般用r表示,其中n 为样本量, 分别为两个变量的观测值和均值。r描述的是两个变量间线性相关强弱的程度。r的取值在-1与1之间,若r>0,…...