【电赛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)完整代码 一、两种…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
raid存储技术
1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划,涵盖存储系统的布局、数据存储策略等,它明确数据如何存储、管理与访问,为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...

【Elasticsearch基础】Elasticsearch批量操作(Bulk API)深度解析与实践指南
目录 1 Bulk API概述 1.1 什么是批量操作 1.2 Bulk API的优势 2 Bulk API的工作原理 2.1 请求处理流程 2.2 底层机制 3 Bulk API的使用方法 3.1 基本请求格式 3.2 操作类型示例 3.3 响应格式 4 Bulk API的最佳实践 4.1 批量大小优化 4.2 错误处理策略 4.3 性能调…...

暴雨新专利解决服务器噪音与性能悖论
6月1日,我国首部数据中心绿色化评价方面国家标准《绿色数据中心评价》正式实施,为我国数据中心的绿色低碳建设提供了明确指引。《评价》首次将噪音控制纳入国家级绿色评价体系,要求从设计隔声结构到运维定期监测实现闭环管控,加速…...