当前位置: 首页 > news >正文

嵌入式系统实践 12 ——基于ARM汇编 Keil5 MSP432 P401R开发板

物联网实验1

阿里云远程控制小灯

///******************************************************************************
// *
// *               MSP432P401
// *             -----------------
// *            |                 |
// *            |                 |
// *            |                 |
// *       RST -|     P1.3/UCA0TXD|----> PC 
// *            |                 |
// *            |                 |
// *            |     P1.2/UCA0RXD|<---- PC
// *            |                 |
// *
// *******************************************************************************/
/* DriverLib Includes */
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>/* Standard Includes */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <stdbool.h>
#include "tick.h"
#include "myUart.h"
#include "buffer.h"
#include "ATCommand.h"
#include "cJSON.h"
#include "exti.h"
#include "led.h"
#include "oled.h"
#define _debug_			//Debug模式:需要获取AT指令执行详细信息时打开,注意供电不足时打开可能会导致串口频繁崩溃/*请填充以下信息*//* 定义Wi-Fi路由信息 */
const char* wifi_ssid	= "HONOR 30";
const char* wifi_pwd 	= "treasure3";/* 定义四元组信息 */
const char* ProductKey = "i34te8zl80V";
const char* DeviceName = "led0";
const char* DeviceSecret = "7cb89003811b8a485fd97156b22b0fc8";
const char* ProductSecret = "ixwudEccQ5uW53rr";/*请填充以上信息*/#define BLANK_DATA "                "
#define LINE_SIZE 16
#define MaxCommandLength 100char exti1 = 0;		//外部中断标志位
char ATCommandBuffer[MaxCommandLength];
int led_switch = 0;		//初始LED状态值/* 打开微库 Options->Target->Code Generation->Use MicroLIB */
int fputc(int ch, FILE *f)
{MAP_UART_transmitData(EUSCI_A0_BASE, ch & 0xFF);return ch;
}/* 上报属性至云端 */
int ReturnData(void)
{cJSON *JsonCommand = cJSON_CreateObject();cJSON *SendJson = cJSON_CreateObject();cJSON_AddStringToObject(JsonCommand, "id", "10001001");cJSON_AddNumberToObject(JsonCommand, "PowerSwitch", led_switch);		//LED状态值cJSON_AddStringToObject(JsonCommand, "version", "1.0");cJSON_AddStringToObject(JsonCommand, "method", "thing.event.property.post");	char *command = cJSON_PrintUnformatted(JsonCommand);			//打印Json命令cJSON_AddStringToObject(SendJson, "send_cmd", command);			//序列化Json命令cJSON *send_cmd = cJSON_GetObjectItem(SendJson, "send_cmd");		//只获取Json命令内容char *send_str = cJSON_PrintUnformatted(send_cmd);				//打印Json命令内容AT_Send_message(send_str);		//发送AT上报属性free(command);free(send_cmd);free(send_str);cJSON_Delete(SendJson);			//释放Json命令内容cJSON_Delete(JsonCommand);		//释放Json命令return true;
}int RemoveWireless(void)
{OLED_Clear();OLED_PrintString(OLED_COLUMN_START, OLED_ROW_1, "IoT Experiment 1", LINE_SIZE);delay_ms(1000);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Stop Wireless...  ", LINE_SIZE);if(!Stop_WiFi_Connection()) 	//停止Wi-Fi{OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Stop Wi-Fi Error!", LINE_SIZE);led2blink(Red, 3, 500);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, BLANK_DATA, LINE_SIZE);exti1 = 0;return 1;}else{OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "Remove SSID.....", LINE_SIZE);AT_Remove_SSID(ATCommandBuffer, MaxCommandLength);		//删除SSIDexecAT(ATCommandBuffer);delay_ms(1000);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "Remove IoT ID...", LINE_SIZE);AT_Remove_IoTID(ATCommandBuffer, MaxCommandLength); //删除IoTIDexecAT(ATCommandBuffer);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "Wi-Fi Removed.", LINE_SIZE);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_4, "Press RESET Key.", LINE_SIZE);	}exti1 = 0;return 0;
}int main(void)
{/* 停用开门狗 */MAP_WDT_A_holdTimer();/* Simple FPU Config */   MAP_FPU_enableModule();	/*启用FPU加快DCO频率计算,注:DCO是内部数字控制振荡器,默认是3M频率*/    MAP_CS_setDCOFrequency(4000000);	/* 设置DCO频率为指定频率,此处DCO=4M*/MAP_CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);	/*设置MCLK(主时钟,可用于CPU主频等),MCLK=DCO频率/时钟分频系数,此处MCLK=DCO=4M*/MAP_CS_initClockSignal(CS_HSMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_4);/*设置HSMCLK(子系统主时钟),HSMCLK=DCO频率/时钟分频系数,此处HSMCLK=DCO/4=1M*/MAP_CS_initClockSignal(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_4);	/*设置SMCLK(低速子系统主时钟,可用TimerA频率),SMCLK=DCO频率/时钟分频系数,此处SMCLK=DCO/4=1M*//* 初始化systick中断,从而获得精准的delayms延时 */ms_ticker_init();MAP_SysTick_enableModule();MAP_SysTick_enableInterrupt();LED_Init();			//初始化LEDmyUartInit();		//初始化所有串口										EXTIX_Init();		//初始化外中断Beep_Init();		//初始化蜂鸣器OLED_Init();		//初始化OLED屏幕OLED_Clear();		//OLED清屏printf("Starting Wi-Fi Module...");OLED_PrintString(OLED_COLUMN_START, OLED_ROW_1, "IoT Experiment 1", LINE_SIZE);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Starting Wi-Fi..", LINE_SIZE);delay_ms(12000);	//等待Wi-Fi模组连接云端#ifndef _debug_MAP_UART_disableModule(EUSCI_A0_BASE);	//如果没定义debug标志,则关闭调试串口
#endif/* 建立连接 */while(1){led2ShowRed();		//LED亮红灯OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Checking Wi-Fi..", LINE_SIZE);if(!Check_WiFi_Connection())		//检查Wi-Fi{OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Connection fail!", LINE_SIZE);led2blink(Red, 3, 500);		//红灯闪烁表示Wi-Fi连接失败/* 注册设备三元组 */OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Device Register.", LINE_SIZE); AT_Device_Register(ATCommandBuffer, MaxCommandLength, \ProductKey, DeviceName, DeviceSecret, ProductSecret);execAT(ATCommandBuffer);delay_ms(1000);/* 连接Wi-Fi */OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Connecting Wi-Fi", LINE_SIZE);AT_Connect_WiFi(ATCommandBuffer, MaxCommandLength, wifi_ssid, wifi_pwd);	//重新连接Wi-FiexecAT(ATCommandBuffer);delay_ms(14000);	//等待Wi-Fi模组连接云端}else{OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Wi-Fi Connected.", LINE_SIZE);led2ShowGreen();		//LED2亮绿灯break;}}GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN1);   //P2.1输出高电平,LED2亮绿灯myEUSCIA0Init();	//初始化A0串口printf("------ Connection finished. ------\r\n");while(1){MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN1);	//LED2绿灯交替闪烁delay_ms(300);		//交替闪烁间隔/* 判断是否关机状态 */if(exti1 == 1){														//按下按键S1可以关闭3080GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN1);   //P2.1输出高电平,LED2中绿灯亮execAT("AT+IDMCLS\r\n");printf("------Power off-----\r\n");OLED_Clear();OLED_PrintString(OLED_COLUMN_START, OLED_ROW_1, "-- Power Off ---", LINE_SIZE);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Press RESET Key.", LINE_SIZE);GPIO_setOutputLowOnPin(GPIO_PORT_P2,GPIO_PIN1);		//P2.1输出低电平,LED2中绿灯灭break;}else if(exti1 == 2){RemoveWireless();break;}char *Sub_Json_ptr = AT_Get_SUB_In_Json(&myBuffer);	//获取云端下发数据if(Sub_Json_ptr != NULL){																															//收到物联网平台下发jsoncJSON *praseDataPtr = cJSON_Parse(Sub_Json_ptr);		//解析下发属性值cJSON *PowerSwitch = cJSON_GetObjectItem(praseDataPtr, "PowerSwitch");		//获取LED开关值if(cJSON_IsNumber(PowerSwitch))		//测试开关值是否为Int型{led_switch = PowerSwitch->valueint;		//获取开关值if(led_switch == 0){printf("Turn off the light.\r\n");MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);	//关闭LED灯OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "LED1 Status: OFF", LINE_SIZE);}else if(led_switch == 1){printf("Turn on the light.\r\n");MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0);	//开启LED灯OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "LED1 Status: ON ", LINE_SIZE);}ReturnData();		//上报属性至云端}cJSON_Delete(praseDataPtr);}}while(1);	//停机
}

实验2

分析整个物联网应用数据流转的过程
s1,s2组成2种组合(任意一个按钮打开及2个按钮都打开),控制msp432红灯的亮度(PWM降低),当成功调节亮度后物联网开发板蜂鸣器(5.5连接buzer)响1s。
web前端添加时间字段,固件端设置新定时器,每隔一秒刷新一次前端时间数据,且可以通过pc(uart工具)设置初始时间。(提示:前端页面新增3个不可控int字段,表示时分秒,其他和之前的时钟操作类似,可参考定时器章节设置定时器)

/* DriverLib Includes */
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>/* Standard Includes */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <stdbool.h>
#include "i2c.h"
#include "tick.h"
#include "myUart.h"
#include "myTimer.h"
#include "buffer.h"
#include "ATCommand.h"
#include "cJSON.h"
#include "exti.h"
#include "led.h"
#include "oled.h"
#include "hts221.h"
#include "sw.h"
#include "beep.h"#define _debug_			//Debug模式:需要获取AT指令执行详细信息时打开,注意供电不足时打开可能会导致串口频繁崩溃/* 定义Wi-Fi路由信息 */
const char* wifi_ssid	= "HONOR 30";
const char* wifi_pwd 	= "treasure3";/* 定义四元组信息 */
const char* ProductKey		= "g5tk1FRbp5v";
const char* ProductSecret = "JSdWdXhHffVKYvxX";
const char* DeviceName 		= "10205102444";
const char* DeviceSecret 	= "16ebf3ebb9f84531dc28cbb681cf8700";#define BLANK_DATA "                "
#define LINE_SIZE 16
#define MaxCommandLength 150
extern char exti1;		//外部中断标志位char ATCommandBuffer[MaxCommandLength];
char UserCommandBuffer[MaxCommandLength];
char SendMsgBuffer[128];
char OLED_BUFF[32];#define TA1_PERIODS (62500)
#define PWM_PERIODS (62500/50)const eUSCI_UART_Config uartConfig =
{EUSCI_A_UART_CLOCKSOURCE_SMCLK,          //选用SMCLK(1M)时钟源6,                                       // BRDIV = 6 ,clockPrescalar时钟分频系数 8,                                       // UCxBRF = 8  firstModReg (BRDIV、UCxBRF、 UCxBRS和SMCLK,用于设置串口波特率)17,                                      // UCxBRS = 17 secondModRegEUSCI_A_UART_NO_PARITY,                  // 校验位NoneEUSCI_A_UART_LSB_FIRST,                  // 低位优先,小端模式EUSCI_A_UART_ONE_STOP_BIT,               // 停止位1位EUSCI_A_UART_MODE,                       // UART modeEUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION  // 设置为过采样,该数值为1
};const Timer_A_UpModeConfig TA0 =
{TIMER_A_CLOCKSOURCE_SMCLK,              // 选用SMCLK作为时钟源TIMER_A_CLOCKSOURCE_DIVIDER_1,          // 分频系数为1,Timer_A0=SMCLK/1=62.5kPWM_PERIODS - 1,                          // 周期时长=PWM_PERIODS/Timer_A0=20ms(注:视觉暂留时间约为100ms至400ms),因从零开始计数,建议做减一操作;TIMER_A_TAIE_INTERRUPT_DISABLE,         // 禁用定时器中断TIMER_A_CCIE_CCR0_INTERRUPT_DISABLE,    // 禁用定时器CCR0中断TIMER_A_DO_CLEAR                        // 清空数值
};Timer_A_CompareModeConfig TA0_CCR1_PWM =
{TIMER_A_CAPTURECOMPARE_REGISTER_1,          // CCR1通道TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE,   // 禁用CCR中断TIMER_A_OUTPUTMODE_RESET_SET,               // 采用复位/置位PWM_PERIODS                                 // 占空比,此处不用减一,当定时器数值val<dutyCycle时,输出高电平(即0到dutyCycle-1,共dutyCycle);当val>=dutyCycle时输出低电平
};Timer_A_CompareModeConfig TA0_CCR2_PWM =
{TIMER_A_CAPTURECOMPARE_REGISTER_2,         // CCR2通道TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE,  // 禁用CCR中断TIMER_A_OUTPUTMODE_RESET_SET,              // 采用复位/置位PWM_PERIODS
};Timer_A_CompareModeConfig TA0_CCR3_PWM =
{TIMER_A_CAPTURECOMPARE_REGISTER_3,        // CCR3通道TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE, // 禁用CCR中断TIMER_A_OUTPUTMODE_RESET_SET,             // 采用复位/置位PWM_PERIODS
};//打开微库 Options->Target->Code Generation->Use MicroLIB
int fputc(int ch, FILE* f) {MAP_UART_transmitData(EUSCI_A0_BASE, ch & 0xFF);return ch;
}/* 上报属性至云端 */
int ReturnData(char* message) {cJSON* JsonCommand = cJSON_CreateObject();cJSON* SendJson = cJSON_CreateObject();cJSON_AddStringToObject(JsonCommand, "DATA", message);char* command = cJSON_PrintUnformatted(JsonCommand);			//打印Json命令cJSON_AddStringToObject(SendJson, "send_cmd", command);			//序列化Json命令cJSON* send_cmd = cJSON_GetObjectItem(SendJson, "send_cmd");		//只获取Json命令内容char* send_str = cJSON_PrintUnformatted(send_cmd);				//打印Json命令内容AT_Send_message(send_str);		//发送AT上报属性free(command);free(send_cmd);free(send_str);cJSON_Delete(SendJson);			//释放Json命令内容cJSON_Delete(JsonCommand);		//释放Json命令return true;
}/* 解析控制命令 */
bool PraseCommand(char* cmd) {char* ptr = NULL;ptr = strtok(cmd, ",");		//分隔命令字段while (ptr) {if (!strcmp(ptr, "Light")) {ptr = strtok(NULL, ",");if (!strcmp(ptr, "1")) {tunnOnLed1();		//开启LED1灯OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "LED1 Status: ON ", LINE_SIZE);}else if (!strcmp(ptr, "0")) {turnOffLed1();		//关闭LED1灯OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "LED1 Status: OFF", LINE_SIZE);}}ptr = strtok(NULL, ",");	//分隔命令字段}//exti1 = 1;		//触发外部中断return true;
}int RemoveWireless(void) {OLED_Clear();OLED_PrintString(OLED_COLUMN_START, OLED_ROW_1, "IoT Experiment 2", LINE_SIZE);delay_ms(1000);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Stop Wireless...  ", LINE_SIZE);if (!Stop_WiFi_Connection()) 	//停止Wi-Fi{OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Stop Wi-Fi Error!", LINE_SIZE);led2blink(Red, 3, 500);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, BLANK_DATA, LINE_SIZE);exti1 = 0;return 1;}else {OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "Remove SSID.....", LINE_SIZE);AT_Remove_SSID(ATCommandBuffer, MaxCommandLength);		//删除SSIDexecAT(ATCommandBuffer);delay_ms(1000);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "Remove IoT ID...", LINE_SIZE);AT_Remove_IoTID(ATCommandBuffer, MaxCommandLength); //删除IoTIDexecAT(ATCommandBuffer);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, "Wi-Fi Removed.", LINE_SIZE);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_4, "Press RESET Key.", LINE_SIZE);}exti1 = 0;while (1);	//停机
}void pwninit()
{uint8_t port_mapping[] ={PM_TA0CCR1A, //映射至Timer_A0_CCR1,与Pin0对应PM_TA0CCR2A, //映射至Timer_A0_CCR2,与Pin1对应PM_TA0CCR3A, //映射至Timer_A0_CCR3,与Pin2对应PM_NONE,     //不映射,映射为空PM_NONE,PM_NONE,PM_NONE,PM_NONE};MAP_PMAP_configurePorts((const uint8_t*)port_mapping, PMAP_P2MAP/*端口2*/, 1/*8个引脚*/, PMAP_DISABLE_RECONFIGURATION);MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2, GPIO_PRIMARY_MODULE_FUNCTION);MAP_Timer_A_configureUpMode(TIMER_A0_BASE, &TA0);Interrupt_enableMaster(); /*使能主中断*/MAP_Timer_A_startCounter(TIMER_A0_BASE, TIMER_A_UP_MODE);myEUSCIA0Init();	//初始化A0调试串口TA0_CCR1_PWM.compareValue = PWM_PERIODS * 1000 * 3.3 / 16384 / 3;MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR1_PWM);TA0_CCR2_PWM.compareValue = PWM_PERIODS * 1000 * 3.3 / 16384 / 3;MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR2_PWM);TA0_CCR3_PWM.compareValue = PWM_PERIODS * 1000 * 3.3 / 16384 / 3;MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR3_PWM);printf("------ Connection finished. ------\r\n");MAP_UART_enableInterrupt(EUSCI_A0_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT); /*使能UART_A0串口接收中断*/MAP_Interrupt_enableInterrupt(INT_EUSCIA0); /*使能UART_A0中断*/
}int main(void) {int Temp = 0;		//定义温度初值int Humi = 0;		//定义湿度初值int led1_stat = 0;		//定义LED灯初值int sw1_stat = 0;		//定义S1开关初值int sw2_stat = 0;		//定义S2开关初值/* 停用开门狗 */MAP_WDT_A_holdTimer();MAP_FPU_enableModule();/*启用FPU加快DCO频率计算,注:DCO是内部数字控制振荡器,默认是3M频率*/MAP_CS_setDCOFrequency(4000000);/* 设置DCO频率为指定频率,此处DCO=4M*/MAP_CS_initClockSignal(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);/*设置MCLK(主时钟,可用于CPU主频等),MCLK=DCO频率/时钟分频系数,此处MCLK=DCO=4M*/MAP_CS_initClockSignal(CS_HSMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_4);/*设置HSMCLK(子系统主时钟),HSMCLK=DCO频率/时钟分频系数,此处HSMCLK=DCO/4=1M*/MAP_CS_initClockSignal(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_4);/*设置SMCLK(低速子系统主时钟,可用TimerA频率),SMCLK=DCO频率/时钟分频系数,此处SMCLK=DCO/4=1M*//* 初始化systick中断,从而获得精准的delayms延时 */ms_ticker_init();MAP_SysTick_enableModule();MAP_SysTick_enableInterrupt();//systick configLED_Init();			//初始化LED灯switchInit();		//初始化按键开关myUartInit();		//初始化用户串口EXTIX_Init();		//初始化外部中断Beep_Init();		//初始化蜂鸣器i2c_init(NULL);		//初始化I2C总线HTS221_Init();		//初始化温湿度传感器OLED_Init();		//初始化OLED显示屏OLED_Clear();		//OLED清屏timer0Init(4000000);printf("Starting Wi-Fi Module...");OLED_PrintString(OLED_COLUMN_START, OLED_ROW_1, "IoT Experiment 2", LINE_SIZE);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Starting Wi-Fi..", LINE_SIZE);delay_ms(12000);	//等待Wi-Fi模组连接云端#ifndef _debug_MAP_UART_disableModule(EUSCI_A0_BASE);	//如果没定义debug标志,则关闭调试串口
#endif/* 建立连接 */while (1) {led2ShowRed();		//LED亮红灯OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Checking Wi-Fi..", LINE_SIZE);if (!Check_WiFi_Connection())		//检查Wi-Fi{OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Connection fail!", LINE_SIZE);led2blink(Red, 3, 500);		//红灯闪烁表示Wi-Fi连接失败/* 注册设备三元组 */OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Device Register.", LINE_SIZE);AT_Device_Register(ATCommandBuffer, MaxCommandLength, \ProductKey, DeviceName, DeviceSecret, ProductSecret);execAT(ATCommandBuffer);delay_ms(1000);/* 连接Wi-Fi */OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Connecting Wi-Fi", LINE_SIZE);AT_Connect_WiFi(ATCommandBuffer, MaxCommandLength, wifi_ssid, wifi_pwd);	//重新连接Wi-FiexecAT(ATCommandBuffer);delay_ms(14000);	//等待Wi-Fi模组连接云端}else {OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, "Wi-Fi Connected.", LINE_SIZE);led2ShowGreen();		//LED2亮绿灯delay_ms(3000);break;}}pwninit();while (1) {delay_ms(100);		//交替闪烁间隔/* SW开关状态变动事件 */if (sw1_stat != getS1Status() || sw2_stat != getS2Status()) {exti1 = 1;		//触发外部中断}if (exti1 == 1) {Temp = HTS221_Get_Temperature();		//获取温度值Humi = HTS221_Get_Humidity();		//获取湿度值led1_stat = getLed1Status();	//获取LED1开关值sw1_stat = getS1Status();		//获取SW1开关值sw2_stat = getS2Status();		//获取SW1开关值memset(SendMsgBuffer, 0, sizeof(SendMsgBuffer));/* 打包上报属性字符串 */sprintf(SendMsgBuffer, "Temp,%d,Humi,%d,Light,%d,Switch1,%d,Switch2,%d", \Temp, Humi, led1_stat, sw1_stat, sw2_stat);ReturnData(SendMsgBuffer);	//上报属性至云端memset(OLED_BUFF, 0, sizeof(OLED_BUFF));sprintf(OLED_BUFF, "Temp:%d Humi:%d ", Temp, Humi);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_2, OLED_BUFF, LINE_SIZE);	//OLED显示温湿度值memset(OLED_BUFF, 0, sizeof(OLED_BUFF));OLED_PrintString(OLED_COLUMN_START, OLED_ROW_3, OLED_BUFF, LINE_SIZE);	//OLED显示温湿度值OLED_PrintString(OLED_COLUMN_START, OLED_ROW_4, "Reporting Data..", LINE_SIZE);OLED_PrintString(OLED_COLUMN_START, OLED_ROW_4, BLANK_DATA, LINE_SIZE); //OLED清空第四行if (sw1_stat && sw2_stat) {TA0_CCR1_PWM.compareValue = PWM_PERIODS * 300.0 / 16384 / 3;MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR1_PWM);TA0_CCR2_PWM.compareValue = PWM_PERIODS * 300.0 / 16384 / 3;MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR2_PWM);TA0_CCR3_PWM.compareValue = PWM_PERIODS * 300.0 / 16384 / 3;MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR3_PWM);Play_Successful();}else if (sw1_stat || sw2_stat) {TA0_CCR1_PWM.compareValue = PWM_PERIODS * 3000.0  / 16384 / 3;MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR1_PWM);TA0_CCR2_PWM.compareValue = PWM_PERIODS * 3000.0 / 16384 / 3;MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR2_PWM);TA0_CCR3_PWM.compareValue = PWM_PERIODS * 3000.0 / 16384 / 3;MAP_Timer_A_initCompare(TIMER_A0_BASE, &TA0_CCR3_PWM);Play_Successful();}exti1 = 0;	//清除按键中断标志}else if (exti1 == 2) {RemoveWireless();	//删除Wi-Fi}char* Sub_Json_ptr = AT_Get_SUB_In_Json(&myBuffer);	//获取云端下发数据if (Sub_Json_ptr != NULL) {//printf("Receive: %s\r\n", Sub_Json_ptr);cJSON* praseDataPtr = cJSON_Parse(Sub_Json_ptr);			//解析下发属性值cJSON* DATA = cJSON_GetObjectItem(praseDataPtr, "DATA");	//获取控制命令字符串if (cJSON_IsString(DATA)) {memset(UserCommandBuffer, 0, sizeof(UserCommandBuffer));memcpy(UserCommandBuffer, DATA->valuestring, strlen(DATA->valuestring));	//复制命令字符串PraseCommand(UserCommandBuffer);		//解析控制命令}cJSON_Delete(praseDataPtr);}}
}int h = 0;
int m = 0;
int s = 0;
int time = 0;
int idx = 0;
int num = 0;/*UART_A0中断函数*/
void EUSCIA0_IRQHandler(void) {char tmp[3] = {0};uint32_t status = MAP_UART_getEnabledInterruptStatus(EUSCI_A0_BASE); /*将UART_A0中断标志位的值赋值给status*/MAP_UART_clearInterruptFlag(EUSCI_A0_BASE, status);/*清空UART_A0中断标志位*/if (status & EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG) /*判断是否为UART_A0接受中断*/{sprintf(tmp, "%c", MAP_UART_receiveData(EUSCI_A0_BASE));if (tmp[0] == 'g') {time = 1;}else if (tmp[0] == 'h') {time = 2;}else if (tmp[0] == 'm') {time = 3;}else if (tmp[0] == 's') {time = 4;}if (tmp[0] >= '0' && tmp[0] <= '9' && idx <= 2) {num *=  10;num	+=	tmp[0] - '0';++idx;}}
}
#include<bits/stdc++.h>
void T32_INT1_IRQHandler(void) {MAP_Timer32_clearInterruptFlag(TIMER32_0_BASE); /*清除Timer32第一个计数器中断标志*/if (time == 0) return;if (time == 1) {s++;if (s >= 60) {s -= 60;m++;}if (m >= 60) {m -= 60;h++;}if (h >= 24) {h -= 24;}sprintf(SendMsgBuffer, "hh:%02d mm:%02d ss:%02d", h, m, s);ReturnData(SendMsgBuffer);	//上报属性至云端}else if (time == 2 && num < 24) {h = (24 + num) % 24;}else if (time == 3 && num < 60) {m = (60 + num) % 60;}else if (time == 4 ) {s = (60 + num) % 60;}//sprintf(OLED_BUFF, "%d:%d:%d", h, m, s);}

前端代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>AIoT Test Demo</title><meta name="viewport" content="width=device-width, initial-scale=1.0"><script src="jquery.js"></script><script src="https://cdn.jsdelivr.net/npm/vue@2.7.10"></script><!-- <script src="https://cdn.jsdelivr.net/npm/vue"></script> -->
</head>
<body>
<div class="all"><div class="top"><ul class="navigation"><li><button onclick="openLight()">Light on</button></li><li><button onclick="closeLight()">Light off</button></li></ul></div><div class="cover"><div class="sub_frame"><div class="sub_cover"><div class="show"><div id="app"><div class="content">Light: {{Light}}</div><div class="content">Switch1: {{Switch1}}</div><div class="content">Switch2: {{Switch2}}</div><div class="content">Temp: {{Temp}}</div><div class="content">Humi: {{Humi}}</div></div><div class="content" id="message">WebsocketStatus: </div></div></div></div></div>
</div>
</body><script>var deviceName = '10205102444'function openLight() {var settings = {"url": "https://mxlab.mxchip.com:9999/api/iot/controlField?deviceName=" + deviceName + "&targetField=Light&targetValue=1","method": "POST","timeout": 0,"headers": {"Authorization": window.sessionStorage.getItem('token')},};$.ajax(settings).done(function (response) {console.log(response);});}function closeLight() {var settings = {"url": "https://mxlab.mxchip.com:9999/api/iot/controlField?deviceName=" + deviceName + "&targetField=Light&targetValue=0","method": "POST","timeout": 0,"headers": {"Authorization": window.sessionStorage.getItem('token')},};$.ajax(settings).done(function (response) {console.log(response);});}function sayhello() {var settings = {"url": "https://mxlab.mxchip.com:9999/api/iot/controlField?deviceName=" + deviceName + "&targetField=OLed&targetValue=1","method": "POST","timeout": 0,"headers": {"Authorization": window.sessionStorage.getItem('token')},};$.ajax(settings).done(function (response) {console.log(response);});}var websocket = null;//判断当前浏览器是否支持WebSocketif ('WebSocket' in window) {// websocket = new WebSocket("ws://localhost:9999/connectWebSocket/" + deviceName + "/" + "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIxIiwiZXhwIjoxNjE3NzU4NTYwfQ.T-NnzLvSK9zykVKjatJqNPLeMGiYdfWME_v1UZy1uxQ");//连接WebSocket节点websocket = new WebSocket("wss://mxlab.mxchip.com:9999/connectWebSocket/" + deviceName + "/" + window.sessionStorage.getItem('token'));// websocket = new WebSocket("ws://localhost:8001");}else {alert('Not support websocket')}//连接发生错误的回调方法websocket.onerror = function () {setMessageInnerHTML("Error");};//连接成功建立的回调方法websocket.onopen = function (event) {var settings = {"url": "https://mxlab.mxchip.com:9999/api/iot/initData?deviceName=" + deviceName,"method": "GET","timeout": 0,"headers": {"Authorization": window.sessionStorage.getItem('token')},};$.ajax(settings).done(function (response) {for (var key in response.data) {switch (key) {case "Light":app.Light = response.data[key]breakcase "Switch1":app.Switch1 = response.data[key]breakcase "Switch2":app.Switch2 = response.data[key]breakcase "Temp":app.Temp = response.data[key]breakcase "Humi":app.Humi = response.data[key]break}}console.log('init...')console.log(response);});setMessageInnerHTML("Open");}//接收到消息的回调方法websocket.onmessage = function (event) {console.log(event)var json = JSON.parse(event.data)for (var key in json) {switch (key) {case "Light":app.Light = json[key]breakcase "Switch1":app.Switch1 = json[key]breakcase "Switch2":app.Switch2 = json[key]breakcase "Temp":app.Temp = json[key]breakcase "Humi":app.Humi = json[key]break}}console.log(event.data);}//连接关闭的回调方法websocket.onclose = function () {setMessageInnerHTML("close");}//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。window.onbeforeunload = function () {websocket.close();}//将消息显示在网页上function setMessageInnerHTML(innerHTML) {document.getElementById('message').innerHTML += innerHTML + '<br/>';}var app = new Vue({el: '#app',data: {Light: 0,Switch1: 0,Switch2: 0,Temp: 0,Humi: 0}})
</script><style>
*{padding: 0;margin: 0;
}
a:link{color: aliceblue;text-decoration: none;
}
a:visited{color: aliceblue;text-decoration: none;
}
.all{width: 100%;margin: 0 auto;
}
.top{height: 45px;background-color: rgba(192,192,192,1.0);text-align: left;margin: 0 auto;
}
.top ul li{cursor: pointer;text-align: center;height: 100%;width: 30%;list-style-type: none;float: left;line-height: 45px;<!--"Comic Sans MS"-->font-family: "Comic Sans MS";
}.top button{font-family: "Comic Sans MS";color: black;font-size: 30px;width:90%;height: 100%;border-top:0px solid transparent;border-bottom:0px solid transparent;border-left:0px solid transparent;border-right:0px solid transparent;
}
.cover{width: 100%;height: 700px;background-image: url('salt.jpg');background-size: cover;opacity: 1.0;
}
.sub_frame{width: 700px;height: 700px;margin: 10px auto;position: relative;border: 5px darkgrey dotted;border-radius: 50%;top: 50%;transform: translateY(-50%);
}
.sub_cover{width: 650px;height: 650px;margin-top: 25px;margin-left: 25px;border-radius: 50%;background-color: rgba(192,192,192,0.5);<!---令子块居中--->display:flex;align-items:center;justify-content:center;position:absolute;
}.show{position:absolute;left:15%;top:15%;init...
}.content{font-family: "Comic Sans MS";color: black;font-size: 45px;}
</style>
</html>

相关文章:

嵌入式系统实践 12 ——基于ARM汇编 Keil5 MSP432 P401R开发板

物联网实验1 阿里云远程控制小灯 ///****************************************************************************** // * // * MSP432P401 // * ----------------- // * | | // * | |…...

【密码学篇】密码行业标准汇总(GM)

【密码学篇】密码行业标准汇总&#xff08;GM&#xff09; 截止到2023年03月10日&#xff0c;共130个密码行业标准&#xff0c;适用商用密码应用与安全性评估等密码行业&#xff0c;可点击链接预览或下载标准—【蘇小沐】 文章目录【密码学篇】密码行业标准汇总&#xff08;GM…...

桌面文件删除后没有在回收站原因和恢复方法

桌面误删文件回收站也没有怎么办&#xff1f;遇到电脑桌面文件误删了&#xff0c;重要数据回收站找不回这种情况不要慌&#xff01;如今数据恢复技术很成熟&#xff0c;许多文件丢失问题都能够成功解决。下面我们就一起来了解下桌面误删文件回收站没有的原因和相关文件恢复方法…...

什么是业务运营?关键组成部分有哪些?

企业领导者使用收入运营和智能软件等技术来分析买家的不同接触点。这些见解决定了客户互动的成败&#xff0c;从而改善了业务运营&#xff0c;从而带来了成功。 什么是业务运营&#xff1f; 业务运营包括企业为保持盈利而执行的一系列日常任务。虽然这些任务可能因业务类型或行…...

腾讯云新用户怎么配置服务器的方法教程

腾讯云新用户怎么配置服务器&#xff1f;腾讯云服务器配置选择攻略&#xff0c;先选择云服务器地域和可用区&#xff0c;然后根据用户使用场景需要平衡型、计算型或高IO型等特性来选择云服务器CVM实例规格&#xff0c;主机教程网来详细说下腾讯云服务器配置选择攻略。 1、腾讯云…...

windows 11系统,通过ip地址远程连接连接ubuntu 22.04系统(共同局域网下,另一台主机不需要联网)

windows 11系统&#xff0c;通过ip地址远程连接连接ubuntu 22.04系统&#xff08;不需要联网&#xff09;问题来源问题分析解决方案问题来源 自己搭建了一台ubuntu系统作为深度学习的机器&#xff0c;但是学校的网络问题&#xff0c;一个账号只能同时登录3台设备。通过远程连接…...

头脑风暴(一):Controller层前端传参接收;在Service层实现类中?为何要build相关构建器?添加套餐业务分析

文章目录1 MyBatis中Controller层List集合接收数据&#xff0c;泛型添加与否1.1 案例场景1.2 应该用什么接收1.3 是否可以用其他方式接收&#xff1f;1.4 LIst集合接收可否不指定泛型1.5 mybatis中使用基本类型接收数据&#xff1f;resultType是集合中的元素的类型&#xff0c;…...

vue-cropper 拖动图片和截图框

现象 开发遇到vue--cropper不能拖动图片和截图框 解决方法 can-move-box设置为true&#xff0c;表示可以拖动截图框 can-move设置为true&#xff0c;表示可以拖动图片 *注意&#xff1a; 我外层套了一个el-col, el-col的宽高一定要大于截图框的宽高&#xff0c;否则移动不了…...

[Linux基础]history相关的环境变量设置

目录 背景 简介 命令操作 1. 语法&#xff1a; 2. 功能 3. 参数 环境变量设置 背景 工作中时常收到客户的反馈&#xff0c;我的系统什么也没干&#xff0c;就出现文件丢失&#xff0c;程序错误等等问题&#xff1b;我们在问题排查的时候查看history信息也是重要环节…...

怎么给电脑分盘与合并磁盘?教你三招

电脑只有一个C盘&#xff0c;想要再分出一个或多个分区&#xff0c;怎么办&#xff1f;电脑C盘的容量太小&#xff0c;太容易满了&#xff0c;想重新分盘&#xff0c;或者把其他盘跟它合并&#xff0c;但因为文件太多备份实在是太麻烦&#xff0c;怎么办&#xff1f;怎么给电脑…...

HCIP-5.4OSPF路由聚合、缺省路由

1、路由聚合 OSPF 是一种链路状态路由协议&#xff0c;因此 OSPF路由器不传输路由&#xff0c;而是传输链路状态信息。因此&#xff0c;OSPF 路由通过汇总 LSA 来控制链路状态信息的传输&#xff0c;从而减小 LSDB 数据库的大小&#xff0c;进而控制路由的汇总。 由于OSPF路由…...

【数据结构】——树与二叉树

文章目录树二叉树二叉树的性质完全二叉树二叉树的存储遍历二叉树和线索二叉树6.4 树和森林哈夫曼树应用树 树的定义&#xff1a;树是以分支关系定义的层次结构。 D; 树(Tree)是n(n≥0)个结点的有限集。 R 数据关系 有且仅有一个特定的称为根(Root) 的结点 当n>1时&…...

等离子纳秒高压脉冲电源维修HVP-20 P

等离子纳秒高压脉冲电源维修HVP-20 P;HVP-10B;HVP-05;HVP-02等型号均可维修 HVP-20 P(N)用于气体放电与低温等离子体的高性能纳秒高压脉冲电源。 HVP-20P(N)采用专有的marx电路&#xff0c;实现高压脉冲电源参数的便捷可调&#xff0c;包括峰值电压0 – 20 KV &#xff08;-2…...

JavaScript内改变this指向

之前我们说的都是代码内 this 的默认指向今天我们要来说一下如何能改变 this 指向也就是说, 你指向哪我不管, 我让你指向哪, 你就得指向哪开局在函数的原型( Function.prototype ) 上有三个方法callapplybind既然是在函数的原型上, 那么只要是函数就可以调用这三个方法&#xf…...

Cobalt Strike---(2)

数据管理 Cobalt Strike 的团队服务器是行动期间Cobalt Strike 收集的所有信息的中间商。Cobalt Strike 解析来 自它的 Beacon payload 的输出&#xff0c;提取出目标、服务和凭据。 如果你想导出 Cobalt Strike 的数据&#xff0c;通过 Reporting → Export Data 。Cobalt Str…...

docker的命令使用和相关例子

Docker是一种流行的容器化平台&#xff0c;可以帮助开发人员更轻松地构建、发布和管理应用程序。下面是一些Docker的命令使用和相关例子&#xff1a; Docker镜像相关命令&#xff1a; 搜索Docker镜像&#xff1a; docker search 例子&#xff1a;docker search ubuntu 下载D…...

23模式--代理模式

本篇主要聊一些23中模型中的代理模式&#xff1a; 看一下百度百科的解释&#xff1a; 代理模式的定义&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。在某些情况下&#xff0c;一个对象不适合或者不能直接引用另一个对象&#xff0c;而代理对象可以在客户端和目…...

【Linux】信号的产生、保存、捕捉处理 (四种信号产生、核心存储、用户态与内核态、信号集及其操作函数)

文章目录1、什么是信号&#xff1f;2、信号的产生2.1 通过键盘产生信号2.2 通过系统调用产生信号2.3 硬件异常产生的信号2.4 由软件条件产生的信号2.5 进程的核心转储3、信号的保存4、信号的捕捉4.1 用户态和内核态4.2 用户态到内核态的切换4.3 信号捕捉过程5、信号集操作函数以…...

redis经典五种数据类型及底层实现

目录一、Redis源代码的核心部分1.redis源码在哪里2.src源码包下面该如何看&#xff1f;二、我们平时说redis是字典数据库KV键值对到底是什么1.6大类型说明(粗分)2.6大类型说明3.上帝视角4.Redis定义了redisObject结构体4.1 C语言struct结构体语法简介4.2 字典、KV是什么4.3 red…...

三十而立却被裁,打工人要如何应对职场危机?

又到金三银四就业季&#xff0c;对于部分职场人来说&#xff0c;年龄成为了他们找工作的最大限制。 因为绝大部分企业招聘中层干部以下岗位的时候&#xff0c;都会要求年龄不超过35周岁&#xff0c;再加上每年千万毕业生涌入社会&#xff0c;竞争程度相当激烈&#xff0c;这就导…...

java面试-java基础

char 变量能不能存贮一个中文汉字&#xff1f;为什么&#xff1f; char 变量可以存贮一个汉字&#xff0c;因为 Java 中使用的默认编码是 Unicode &#xff0c;一个 char 类型占 2 个字节&#xff08;16 bit&#xff09;&#xff0c;一个汉字是2个字节&#xff0c;所以放一个中…...

Kafka 消息不丢失

Kafka 消息不丢失生产者丢失消费者丢失不丢失配置Kafka 保证消息不丢失&#xff1a;只对已提交的消息 (committed message) 做有限度的持久化保证 已提交的消息&#xff1a;当 n 个 Broker 成功接收到该消息并写入到日志文件后&#xff0c;就告诉生产者该消息已成功提交有限度…...

ASEMI高压MOS管10N65参数,10N65规格,10N65封装

编辑-Z ASEMI高压MOS管10N65参数&#xff1a; 型号&#xff1a;10N65 漏极-源极电压&#xff08;VDS&#xff09;&#xff1a;650V 栅源电压&#xff08;VGS&#xff09;&#xff1a;30V 漏极电流&#xff08;ID&#xff09;&#xff1a;10A 功耗&#xff08;PD&#xff…...

LeetCode-416. 分割等和子集

目录题目分析回溯法动态规划动态规划(压缩)题目来源 416. 分割等和子集 题目分析 这道题目是要找是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 那么只要找到集合里能够出现 sum / 2 的子集总和&#xff0c;就算是可以分割成两个相同元素和子集了…...

2021年 第12届 蓝桥杯 Java B组 省赛真题详解及小结【第2场省赛 2021.05.09】

一、试题A&#xff1a;求余&#xff08;本题总分&#xff1a;5 分&#xff09; 得&#xff1a;5分 本题总分&#xff1a;5 分 【问题描述】 在 C/C/Java/Python 等语言中&#xff0c;使用 % 表示求余&#xff0c;请问 2021%20 的值是多少&#xff1f; 【答案提交】 这是一道结果…...

elasticSearch写入原理

elasticSearch写入原理 最近学习完了es相关的课程整理除了es的核心内容&#xff0c;学习这东西知其然知其所以然&#xff0c;自己按照自己的理解整理了es相关的面试题。先热个身&#xff0c;整理一下es的写入原理&#xff0c;有不对的地方请大家指正。 这些原理的东西我觉得还是…...

第十四届蓝桥杯模拟赛(第三期)Python

1 进制转换 问题描述   请找到一个大于 2022 的最小数&#xff0c;这个数转换成十六进制之后&#xff0c;所有的数位&#xff08;不含前导 0&#xff09;都为字母&#xff08;A 到 F&#xff09;。   请将这个数的十进制形式作为答案提交。 答案&#xff1a;2730 def ch…...

Pytorch模型参数的保存和加载

目录 一、前言 二、参数保存 三、参数的加载 四、保存和加载整个模型 五、总结 一、前言 在模型训练完成后&#xff0c;我们需要保存模型参数值用于后续的测试过程。由于保存整个模型将耗费大量的存储&#xff0c;故推荐的做法是只保存参数&#xff0c;使用时只需在建好模…...

面试热点题:回溯算法之组合 组合与组合总和 III

什么是回溯算法&#xff1f; 回溯算法也可以叫回溯搜索算法&#xff0c;回溯是递归的"副产品",回溯的本质是穷举&#xff0c;然后选出我们需要的数据&#xff0c;回溯本身不是特别高效的算法&#xff0c;但我们可以通过"剪枝"来优化它。 理解回溯算法 回溯…...

java面试-jvm

JVM JVM 是 java 虚拟机&#xff0c;简单来说就是能执行标准 java 字节码的虚拟计算机 JVM 是如何工作的 首先程序在执行之前先要把 Java 代码&#xff08;.java&#xff09;转换成字节码&#xff08;.class&#xff09;&#xff0c;JVM 通过类加载器&#xff08;ClassLoade…...

vscode下载与使用

1.vscode下载 官网下载地址&#xff1a;Download Visual Studio Code - Mac, Linux, Windows下载太慢&#xff0c;推荐文章&#xff1a;解决VsCode下载慢问题_vscode下载太慢_迷小圈的博客-CSDN博客下载太慢&#xff0c;推荐下载链接&#xff1a;https://vscode.cdn.azure.cn/s…...

人员摔倒识别预警算法 opencv

人员摔倒识别预警算法通过opencv网络模型技术&#xff0c;人员摔倒识别预警算法能够智能检测现场画面中人员有没有摔倒&#xff0c;无需人为干预可以立刻抓拍告警。OpenCV的全称是Open Source Computer Vision Library&#xff0c;是一个跨平台的计算机视觉处理开源软件库&…...

华为OD机试题 - 火星文计算(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:火星文计算题目输入输出示例一输入输出说明Code解题思路版权说明…...

AI人工智能 - 初探

1.应用场景 主要用于了解和系统学习AI&#xff0c;从而可以在工作生活中利用AI做一些事。 2.学习/操作 1.文档阅读 下面的内容来自于与chatGPT的对话 2.整理输出 介绍AI 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是计算机科学中的一个分支&…...

Spring-AOP工作流程

Spring-AOP工作流程 3&#xff0c;AOP工作流程 3.1 AOP工作流程 由于AOP是基于Spring容器管理的bean做的增强&#xff0c;所以整个工作过程需要从Spring加载bean说起: 流程1:Spring容器启动 容器启动就需要去加载bean,哪些类需要被加载呢?需要被增强的类&#xff0c;如:B…...

C51---串口发送指令,控制LED灯亮灭

1.Code: #include "reg52.h" #include "intrins.h" sfr AUXR 0x8E; sbit D5 P3^7; void UartInit(void) //9600bps11.0592MHz { //PCON & 0x7F; //波特率不倍速 AUXR 0x01; SCON 0x50; //8位数据,可变波…...

【Wiki】XWiki数据备份

XWiki为主题使用java开发的开源wiki&#xff0c;官网地址如下&#xff1a; https://www.xwiki.org/xwiki/bin/view/Main/ 目录1、 XWiki升级数据备份1.1、 获取XWiki配置的数据库与持久化目录信息1.2 备份数据库信息1.3 备份持久化目录2、XWiki数据迁移如果一个知识库不能确保数…...

ctk框架开发Qt插件应用示例工程

目录 前言 约定 插件工程pluginApp: 主启动工程StartApp: 效果演示 结语...

spring5源码篇(4)——beanFactoryPostProcessor执行/注解bean的装配

spring-framework 版本&#xff1a;v5.3.19 前面研究了beanDefinition的注册&#xff0c;但也仅仅是注册这一动作。那么在spring容器启动的过程中&#xff0c;是何时/如何装配的&#xff1f;以及装配的bean是如何注入的&#xff1f; &#xff08;考虑到xml方式基本不用了以及篇…...

masstransit的message几个高级用法

1&#xff09;问题&#xff0c;Class MessageA 基类&#xff0c;Class MessageB继承自MessageA&#xff1b; 用bus.Publish方法本想把有些消息只发给B队列&#xff0c;结果由于其继承关系A队列也获得了消息&#xff1b; 解决方法用send&#xff0c; Uri uri new Uri(RabbitM…...

漏洞分析丨cve-2012-0003

作者:黑蛋一、漏洞简介这次漏洞属于堆溢出漏洞&#xff0c;他是MIDI文件中存在的堆溢出漏洞。在IE6&#xff0c;IE7&#xff0c;IE8中都存在这个漏洞。而这个漏洞是Winmm.dll中产生的。二、漏洞环境虚拟机调试工具目标软件辅助工具XP-SP3、KaliOD、IDAIE6Windbg组件gflags.exe三…...

rm命令——删除文件或目录

rm命令是英文单词remove的缩写&#xff0c;主要功能是删除文件或目录。 因为删除文件是一个破坏性动作&#xff0c;因此&#xff0c;在使用时需要格外小心&#xff0c;在执行之前一定要再三确认删除的是哪个目录中的什么文件。 rm命令的语法格式如下&#xff1a; rm [选项] …...

【零基础入门学习Python---Python的基本语法使用】

一.Python基本语法使用 Python是一种易学且功能强大的编程语言,具有简洁的语法和广泛的应用领域。在本文中,我们将介绍Python的基本语法使用,以帮助初学者快速入门Python编程。 1.1 注释 Python 支持两种类型的注释:单行注释和多行注释。 单行注释:以 # 符号开头,从 # …...

数据仓库相关概念的解释

数据仓库相关概念的解释 文章目录数据仓库相关概念的解释1 ETL是什么&#xff1f;ETL体系结构2 数据流向何为数仓DW3 ODS 是什么&#xff1f;4 数据仓库层DWDWD 明细层DWD 轻度汇总层&#xff08;MID或DWB&#xff0c;data warehouse basis&#xff09;DWS 主题层&#xff08;D…...

1/4车、1/2车、整车悬架模糊PID控制仿真合集

目录 前言 1. 1/4悬架系统 1.1数学模型 1.2仿真分析 2. 1/2悬架系统 2.1数学模型 2.2仿真模型 2.3仿真分析 3. 整车悬架系统 3.1数学模型 3.2仿真分析 4.总结 前言 前面几篇文章介绍了LQR、SkyHook、H2/H∞、PID控制&#xff0c;接下来会继续介绍滑模、反步法、M…...

Linux性能补丁升级,避免不必要的跨核Wake-Up

导读一个由英特尔发起的、旨在改进Linux内核公平调度程序代码的补丁系列&#xff0c;也看到了来自AMD工程师和其他利益相关者的测试/反馈&#xff0c;并继续进行改进。这个补丁系列的重点是避免在不必要的情况下发生过多的跨核唤醒(Cross-CPU Wake-up)。这样一来&#xff0c;这…...

Spring Cloud Alibaba全家桶(六)——微服务组件Sentinel介绍与使用

前言 本文小新为大家带来 微服务组件Sentinel介绍与使用 相关知识&#xff0c;具体内容包括分布式系统存在的问题&#xff0c;分布式系统问题的解决方案&#xff0c;Sentinel介绍&#xff0c;Sentinel快速开始&#xff08;包括&#xff1a;API实现Sentinel资源保护&#xff0c;…...

拼多多2021笔试真题集 -- 3. 多多的求和计算

多多的求和计算 多多路上从左到右有N棵树&#xff08;编号1&#xff5e;N&#xff09;&#xff0c;其中第i个颗树有和谐值Ai。 多多鸡认为&#xff0c;如果一段连续的树&#xff0c;它们的和谐值之和可以被M整除&#xff0c;那么这个区间整体看起来就是和谐的。 现在多多鸡想请…...

DP算法:动态规划算法

步骤&#xff08;1&#xff09;确定初始状态&#xff08;2&#xff09;确定转移矩阵&#xff0c;得到每个阶段的状态&#xff0c;由上一阶段推到出来&#xff08;3&#xff09;确定边界条件。例题蓝桥杯——印章&#xff08;python实现&#xff09;使用dp记录状态&#xff0c;d…...

一三四——一六七

一三四、JavaScript——_DOM简介 MDNq前端参考文档&#xff1a;DOM 概述 - Web API 接口参考 | MDN (mozilla.org) 一三五、JavaScript——HelloWorld <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta h…...