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

单片机14-17

目录

LCD1602

LCD1602液晶显示屏

直流电机驱动(PWM)

LED呼吸灯

直流电机调速

 AD/DA(SPI通信)

AD模数转换

DA数模转换

红外遥控(外部中断)

红外遥控

红外遥控电机调速


LCD1602

LCD1602液晶显示屏

LCD1602.c

#include <REGX52.H>
#include "intrins.h"sbit LCD_RS = P2^6;//引脚定义
sbit LCD_WR = P2^5;
sbit LCD_EN = P2^7;#define LCD_DataPort 	P0//寄存器定义,define不要使用分号void LCD_Delay()		//@11.0592MHz,2ms
{unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j) ;} while (--i);
}/*** @brief  写指令* @param  Command	指令* @retval 无*/
void LCD_WriteCommand(unsigned char Command)//写指令
{LCD_RS = 0;//1为数据,0为指令LCD_WR = 0;//1为读,0为写LCD_DataPort = Command;//放入指令LCD_EN = 1;//使能LCD_Delay();//延时一毫秒LCD_EN = 0;//结束使能LCD_Delay();
}/*** @brief  写数据* @param  Data	数据* @retval 无*/
void LCD_WriteData(unsigned char Data)//写数据
{LCD_RS = 1;//1为数据,0为指令LCD_WR = 0;//1为读,0为写LCD_DataPort = Data;//放入数据LCD_EN = 1;//使能LCD_Delay();//延时一毫秒LCD_EN = 0;//结束使能LCD_Delay();
}/*** @brief  初始化显示屏* @param  无* @retval 无*/
void LCD_Init(void) 
{LCD_WriteCommand(0x38);//八位数据,两行显示,5*7点阵LCD_WriteCommand(0x0C);//显示开,光标关,闪烁关LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动LCD_WriteCommand(0x01);//清屏
}/*** @brief  移动光标到目标位置* @param  Line行	Column列* @retval	无 */
void LCD_SetCursor(unsigned char Line,unsigned char Column)//设置光标位置
{if(Line == 1){LCD_WriteCommand(0x80|(Column - 1));//如果是第一行,那么实际地址即为列-1,//并设置光标位置,为什么是0x80,地址设置DDRAM}else{LCD_WriteCommand(0x80|(Column - 1) + 0x40);//如果是第二行,则进行偏移0x40即为实际地址//并设置光标位置}
}/*** @brief  显示字符* @param  Line	行	* @param 	Column	列	* @param	Char	显示的字符	* @retval 无*/
void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
{LCD_SetCursor(Line,Column);LCD_WriteData(Char);//写入数据
}/*** @brief  显示字符串* @param  Line	行	* @param 	Column	列	* @param	String	显示的字符串	* @retval 无*/
void LCD_ShowString(unsigned char Line,unsigned char Column, unsigned char *String)
{unsigned char i;LCD_SetCursor(Line,Column);for(i = 0;String[i] != '\0';i++)//遍历字符串String{LCD_WriteData(String[i]);//写入数据}
}int LCD_Pow(int X,int Y)
{unsigned char i;int Result = 1;for( i=0;i<Y;i++){Result *= X;//X^Y}return Result;
}/*** @brief  显示无符号数字* @param  Line	行	* @param 	Column	列	* @param	Num	显示的无符号数字	* @retval 无*/
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Num,unsigned char Len)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Len ; i>0 ;i--){//LCD_WriteData(0x30 + Num / LCD_Pow(10,i-1)%10);	//获取各位数值并写入显示屏LCD_WriteData('0' + Num / LCD_Pow(10,i-1)%10);//或者转化为ascii码}
}/*** @brief  显示有符号数字* @param  Line	行	* @param 	Column	列	* @param	Num	显示的有符号数字	* @retval 无*/
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Num,unsigned char Len)
{unsigned char i;unsigned int Num1;LCD_SetCursor(Line,Column);if(Num >= 0 ){LCD_WriteData('+');Num1 = Num;}else{LCD_WriteData('-');Num1 = -Num;}for(i=Len ; i>0 ;i--){//LCD_WriteData(0x30 + Num / LCD_Pow(10,i-1)%10);	//获取各位数值并写入显示屏LCD_WriteData('0' + Num1 / LCD_Pow(10,i-1)%10);//或者转化为ascii码}
}/*** @brief  显示十六进制数字* @param  Line	行	* @param 	Column	列	* @param	Num	显示的十六进制数字	* @retval 无*/
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Num,unsigned char Len)
{unsigned char i;unsigned char SingleNum;LCD_SetCursor(Line,Column);for(i=Len ; i>0 ;i--){SingleNum = Num / LCD_Pow(16,i-1)%16;if(SingleNum < 10){LCD_WriteData('0' + SingleNum);//获取各位数值并写入显示屏}else{LCD_WriteData('A' + SingleNum - 10);//修改偏移量}}
}/*** @brief  显示二进制数字* @param  Line	行	* @param 	Column	列	* @param	Num	显示的二进制数字	* @retval 无*/
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Num,unsigned char Len)
{unsigned char i;LCD_SetCursor(Line,Column);for(i=Len ; i>0 ;i--){LCD_WriteData('0' + Num / LCD_Pow(2,i-1)%2);} 
}
#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"void main(){LCD_Init();LCD_ShowChar(1,1,'A');//显示字符ALCD_ShowString(1,3,"Hello");//显示字符串LCD_ShowNum(1,9,66,2);//显示无符号数字LCD_ShowSignedNum(1,12,-66,2);//显示有符号数字LCD_ShowHexNum(2,1,0xA5,2);//显示十六进制LCD_ShowBinNum(2,4,0xA5,8);//显示二进制LCD_ShowChar(2,13,0xDF);//显示度数符号LCD_ShowChar(2,14,'C');//显示字符CLCD_ShowString(1,16,"Welcome to China!");while( 1 ){LCD_WriteCommand(0x18);//流动字幕(指令集)Delay(500);}}

直流电机驱动(PWM)

LED呼吸灯

main.c

#include <REGX52.H>sbit LED = P2^0;void Delay(unsigned int t)
{while(t--);
}void main(){unsigned char Time,i;while( 1 ){for(Time = 0; Time < 100;Time++){for(i = 0; i < 20;i++){LED = 0;Delay(Time);LED = 1;Delay(100 - Time);}}for(Time = 100; Time > 0;Time--){for(i = 0; i < 20;i++){LED = 0;Delay(Time);LED = 1;Delay(100 - Time);}}}}
直流电机调速

main.c

#include <REGX52.H>
#include "Delay.h"
#include "Nixie.h"
#include "Key.h"
#include "Timer0.h"unsigned char Counter,Compare;
unsigned char KeyNum,Speed;
sbit Motor = P1^0;//ULN2003Dvoid main(){Timer0Init();//Compare值看自己如何设置,主要看与之比较后你想输出高/低电平,//这里是小于输出高电平while( 1 ){KeyNum = Key();if(KeyNum == 1){Speed++;Speed %= 4;//重置为0if(Speed==0){Compare=0;}if(Speed==1){Compare=50;}if(Speed==2){Compare=75;}if(Speed==3){Compare=100;}}Nixie(1,Speed);}}void Timer0_Routine() interrupt 1{TL0 = 0xA4;		//设置定时初值TH0 = 0xFF;		//设置定时初值
//100us定时器Counter++;Counter %= 100;//将Counter刷新为0if(Counter < Compare){Motor = 1;//高电平转}else{Motor = 0;}
}

 AD/DA(SPI通信)

AD模数转换

ET2046.c

#include <REGX52.H>
#include "Delay.h"sbit ET2046_CS = P3^5;
sbit ET2046_DCLK = P3^6;
sbit ET2046_DIN = P3^4;
sbit ET2046_DOUT = P3^7;/*** @brief  相当于当过电阻变化,来输出一些数据* @param  Command	控制字* @retval ADValue	读取到的数据*/
unsigned int ET2046_ReadAD(unsigned char Command)//控制字
{unsigned char i;unsigned int ADValue = 0;ET2046_DCLK = 0;ET2046_CS = 0;//拉低进入时序for(i = 0; i<8 ; i++)//发送一个字节{ET2046_DIN = Command & (0x80 >> i);//获得最高位并将其放入DINET2046_DCLK = 1;ET2046_DCLK = 0;}for(i = 0; i < 16;i++)//读取两个字节长度{ET2046_DCLK = 1;ET2046_DCLK = 0;if(ET2046_DOUT){ADValue |= (0x8000>>i);//提前给三位}Delay(50);}ET2046_CS = 1;//结束时序if(Command & 0x08)//查看为什么模式,若得出为1,则是12位。0则为8位{return ADValue>>8;}else{return ADValue>>4;}
}

ET2046.h

#ifndef __ET2046_H__
#define __ET2046_H__#define ET2046_XP_8				0x9C//0x8C
#define ET2046_YP_8				0xDC
#define ET2046_VBAT_8			0xAC
#define ET2046_AUX_8			0xEC#define ET2046_XP_12				0x94//0x84
#define ET2046_YP_12				0xD4
#define ET2046_VBAT_12			0xA4
#define ET2046_AUX_12				0xE4unsigned int ET2046_ReadAD(unsigned char Command);
#endif

main.c

#include <REGX52.H>
#include "LCD1602.h"
#include "Delay.h"
#include "ET2046.h"unsigned int ADValue;void main(){LCD_Init();LCD_ShowString(1,1,"ADJ  NTC  RG");while( 1 ){ADValue = ET2046_ReadAD(ET2046_XP_8);//XPLCD_ShowNum(2,1,ADValue,3);ADValue = ET2046_ReadAD(ET2046_YP_8);//YPLCD_ShowNum(2,6,ADValue,3);ADValue = ET2046_ReadAD(ET2046_VBAT_8);//LCD_ShowNum(2,11,ADValue,3);Delay(10);}}
DA数模转换

main.c

#include <REGX52.H>
#include "Delay.h"
#include "Nixie.h"
#include "Key.h"
#include "Timer0.h"unsigned char Counter,Compare;sbit DA = P2^1;//DAunsigned char i;
void main(){Timer0Init();//Compare值越小LED越暗while( 1 ){for(i = 0;i < 100;i++){Compare = i;Delay(10);}for(i = 100;i > 0;i--){Compare = i;Delay(10);}}}void Timer0_Routine() interrupt 1{TL0 = 0xA4;		//设置定时初值TH0 = 0xFF;		//设置定时初值Counter++;Counter %= 100;//将Counter刷新为0if(Counter < Compare){DA = 1;}else{DA = 0;}
}

红外遥控(外部中断)

红外遥控

Int0.c

#include <REGX52.H>/*** @brief  外部中断0初始化* @param  无* @retval 无*/
void Int0_Init(void)
{IT0 = 1;//1下降沿触发,0低电平触发IE0 = 0;//中断标志EX0 = 1;//打开中断EA = 1;//允许所有中断PX0	=	1;//中断优先级
}/*外部中断0函数模板
void Int0_Routine(void) interrupt 0
{Num++;}	*/

Timer0.c

#include <REGX52.H>/*** @brief  定时器0初始化* @param  无* @retval 无*/
void Timer0_Init(void)		//1微秒@12.000MHz
{TMOD &= 0xF0;		//设置定时器模式TMOD |= 0x01;		//设置定时器模式TL0 = 0;		//设置定时初值TH0 = 0;		//设置定时初值TF0 = 0;		//清除TF0标志TR0 = 0;		//定时器0开始计时
}/*** @brief  定时器0设置计数器值* @param  Value,要设置的计数器值,范围:0~65535* @retval 无*/
void Timer0_SetCounter(unsigned int Value)
{TH0 = Value / 256;TL0 = Value % 256;
}/*** @brief  定时器0获取计数器值* @param  无* @retval 计数器值,范围:0~65535*/
unsigned int Timer0_GetCounter(void)
{return (TH0 << 8 )| TL0;
}/*** @brief  定时器0启动停止控制* @param  Flag 启动停止标志,1为启动,0为停止* @retval 无*/
void Timer0_Run(unsigned char Flag)
{TR0 = Flag;
}

IR.c

#include <REGX52.H>
#include "Timer0.h"
#include "Int0.h"unsigned int IR_Time;
unsigned char IR_State;unsigned char IR_Data[4];//数据缓存
unsigned char IR_PData;//指向当前位置unsigned char IR_DataFlag;//结束位
unsigned char IR_RepeatFlag;//重置位
unsigned char IR_Address;//地址码
unsigned char IR_Command;//变量码/*** @brief  红外遥控初始化* @param  无* @retval 无*/
void IR_Init(void)
{Timer0_Init();Int0_Init();
}/*** @brief  红外遥控获取到数据帧标志位* @param  无* @retval 是否收到数据帧,1为收到,0为未收到*/
unsigned char IR_GetDataFlag(void)
{if(IR_DataFlag){IR_DataFlag = 0;//清零return 1;//代表收到}return 0;
}/*** @brief  红外遥控获取收到连发帧标志位* @param  无* @retval 是否收到连发帧,1为收到,0为未收到*/
unsigned char IR_GetRepeatFlag(void)
{if(IR_RepeatFlag){IR_RepeatFlag = 0;//清零return 1;//代表收到}return 0;
}/*** @brief  红外遥控获取收到的地址数据* @param  无* @retval 收到的地址数据*/
unsigned char IR_GetAddress(void)
{return IR_Address;
}/*** @brief   红外遥控获取收到的命令数据* @param  无* @retval 收到的命令数据*/
unsigned char IR_GetCommand(void)
{return IR_Command;
}void Int0_Routine(void) interrupt 0
{if(IR_State == 0)//状态0,下降沿触发{Timer0_SetCounter(0);//定时器清零Timer0_Run(1);//定时器启动IR_State = 1;//调整状态为1}else if(IR_State == 1)//为状态1时,等待Start信号或Repeat信号{IR_Time = Timer0_GetCounter();//获取上次中断到此次中断的时间Timer0_SetCounter(0);//便于下次计时if(IR_Time > 12442 - 500 && IR_Time < 12442 + 500 ){IR_State = 2;//置状态为2}else if(IR_Time > 10368 - 500 && IR_Time < 10368 + 500)//接收到Repeat信号{IR_RepeatFlag = 1;//连发帧标志为1Timer0_Run(0);//停止计时器IR_State = 0;//转为空闲}else{IR_State = 1;//搜寻起始信号}}else if(IR_State == 2)//状态2,接收数据{IR_Time = Timer0_GetCounter();Timer0_SetCounter(0);//获得上个中断到这个中断之间的时间,并立即清零if(IR_Time > 1032 - 500 && IR_Time < 1032 + 500 )//如果接收到0{IR_Data[IR_PData/8] &= ~(0x01<<(IR_PData % 8));//将数据存入IR_Data中(32位),对应数据置0IR_PData++;//位置指针自增}else if(IR_Time > 2250 - 500 && IR_Time < 2250 + 500 )//如果接收到1{IR_Data[ IR_PData / 8] |= (0x01<<(IR_PData % 8));//将数据对应位置置1,将数据存入IR_Data中IR_PData++;}else{IR_PData = 0;//数据位置指针清零IR_State = 1;//搜寻起始信号}if(IR_PData >= 32)//如果接收到32位数据{IR_PData = 0;//数据位置指针清零if((IR_Data[0] == ~IR_Data[1]) && (IR_Data[2] == ~IR_Data[3]))//数据验证{IR_DataFlag = 1;IR_Address = IR_Data[0];//存入地址码IR_Command = IR_Data[2];//存入命令码IR_DataFlag = 1;//接收到数据}Timer0_Run(0);//停止定时器IR_State = 0;//恢复空闲}}
}	

main.c

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "IR.h"unsigned char Num;
unsigned char Address;
unsigned char Command;void main(){LCD_Init();LCD_ShowString(1,1,"ADDR   CMD   NUM");LCD_ShowString(2,1,"00     00    000");IR_Init();while( 1 ){if(IR_GetDataFlag() || IR_GetRepeatFlag())//如果收到数据帧或者连续发送{Address = IR_GetAddress();//获取遥控器地址码Command = IR_GetCommand();//获取遥控器命令码LCD_ShowHexNum(2,1,Address,2);//显示遥控器地址码LCD_ShowHexNum(2,8,Command,2);//显示遥控器命令码if(Command == IR_VOL_MINUS)//如果遥控器VOL-按键按下{Num --;}if(Command ==IR_VOL_ADD)//如果遥控器VOL+按键按下{Num ++;}LCD_ShowNum(2,14,Num,3);}}}
红外遥控电机调速

Timer1.c

#include <REGX52.H>/*** @brief  定时器1初始化,100微秒* @param  无* @retval 无*/
void Timer1Init(void)		//100微秒@11.0592MHz
{TMOD &= 0x0F;		//设置定时器模式TMOD |= 0x10;		//设置定时器模式TL1 = 0xA4;		//设置定时初值TH1 = 0xFF;		//设置定时初值TF1 = 0;		//清除TF1标志TR1 = 1;		//定时器1开始计时ET1 = 1;	EA = 1;PT1 = 0;
}/*	定时器中断函数模板
void Timer1_Routine() interrupt 3{static unsigned int T1Count;TL0 = 0xA4;		//设置定时初值TH0 = 0xFF;		//设置定时初值T1Count ++;if( T1Count >= 1000 ){T1Count = 0;}}
*/

Timer0.c

#include <REGX52.H>/*** @brief  定时器0初始化* @param  无* @retval 无*/
void Timer0_Init(void)		//1微秒@12.000MHz
{TMOD &= 0xF0;		//设置定时器模式TMOD |= 0x01;		//设置定时器模式TL0 = 0;		//设置定时初值TH0 = 0;		//设置定时初值TF0 = 0;		//清除TF0标志TR0 = 0;		//定时器0开始计时
}/*** @brief  定时器0设置计数器值* @param  Value,要设置的计数器值,范围:0~65535* @retval 无*/
void Timer0_SetCounter(unsigned int Value)
{TH0 = Value / 256;TL0 = Value % 256;
}/*** @brief  定时器0获取计数器值* @param  无* @retval 计数器值,范围:0~65535*/
unsigned int Timer0_GetCounter(void)
{return (TH0 << 8 )| TL0;
}/*** @brief  定时器0启动停止控制* @param  Flag 启动停止标志,1为启动,0为停止* @retval 无*/
void Timer0_Run(unsigned char Flag)
{TR0 = Flag;
}

Motor.c

#include <REGX52.H>
#include "Timer1.h"sbit Motor = P1^0;//ULN2003D
unsigned char Counter,Compare;/*** @brief  电机初始化* @param  无* @retval 无*/
void Motor_Init()
{Timer1Init();
}/*** @brief  电机设置速度* @param  Speed 要设置的速度,范围0~100* @retval 无*/
void Motor_SetSpeed(unsigned char Speed)
{Compare = Speed;
}void Timer1_Routine() interrupt 3{TL1 = 0xA4;		//设置定时初值TH1 = 0xFF;		//设置定时初值Counter++;Counter %= 100;//将Counter刷新为0if(Counter < Compare){Motor = 1;//高电平转}else{Motor = 0;}
}

main.c

#include <REGX52.H>
#include "Delay.h"
#include "Nixie.h"
#include "Key.h"
#include "Motor.h"
#include "IR.h"unsigned char Command,Speed;void main(){Motor_Init();IR_Init();while( 1 ){if(IR_GetDataFlag())//如果收到数据帧{Command = IR_GetCommand();//获取遥控器命令码if(Command == IR_0){Speed = 0;}	//根据遥控器命令码设置速度if(Command == IR_1){Speed = 1;}if(Command == IR_2){Speed = 2;}if(Command == IR_3){Speed = 3;}if(Speed==0){Motor_SetSpeed(0);}//速度输出if(Speed==1){Motor_SetSpeed(50);}if(Speed==2){Motor_SetSpeed(75);}if(Speed==3){Motor_SetSpeed(100);}}Nixie(1,Speed);}}

相关文章:

单片机14-17

目录 LCD1602 LCD1602液晶显示屏 直流电机驱动&#xff08;PWM&#xff09; LED呼吸灯 直流电机调速 AD/DA&#xff08;SPI通信&#xff09; AD模数转换 DA数模转换 红外遥控&#xff08;外部中断&#xff09; 红外遥控 红外遥控电机调速 LCD1602 LCD1602液晶显示屏 …...

DAY_12(树链剖分)

中途摆烂了几天加上考试比赛啥的&#xff0c;导致目前写博客断了。。差了好几天的题目没学了qwq&#xff0c;现在还是按照每天学的东西来写博客吧 今天主要学了树链剖分&#xff0c;怎么说呢&#xff0c;虽然随便拿出今天写的一道题目来看&#xff0c;码量都是一两百行的&…...

Compose | UI组件(九) | Column,Row - 线性布局

文章目录 前言Column 的含义Column 的使用给 Column 加边框Column 使用 verticalArrangement 定位子项位置Column 使用 horizontalAlignment 定位子组件位置Column 设置了大小&#xff0c;可使用Modifier.align修饰符设置子组件对齐方式 Row 的含义Row 的使用 总结 前言 传统的…...

QT+VS实现Kmeans++

1、Kmeans的原理如下&#xff1a; &#xff08;1&#xff09;首先选取样本中任一数据点作为第一个聚类中心&#xff1b; &#xff08;2&#xff09;计算样本每一个数据点至现所有聚类中心的最近距离&#xff0c;并记录下来&#xff1b; &#xff08;3&#xff09;逐一挑选所…...

上位机图像处理和嵌入式模块部署(算法库的编写)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 作为图像处理的engineer来说&#xff0c;有时候我们需要提供上位机软件&#xff0c;有时候需要提供下位机程序&#xff0c;还有一种情况&#xff0…...

LeetCode1504. Count Submatrices With All Ones

文章目录 一、题目二、题解 一、题目 Given an m x n binary matrix mat, return the number of submatrices that have all ones. Example 1: Input: mat [[1,0,1],[1,1,0],[1,1,0]] Output: 13 Explanation: There are 6 rectangles of side 1x1. There are 2 rectangles…...

(每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第8章 项目整合管理(九)

博主2023年11月通过了信息系统项目管理的考试&#xff0c;考试过程中发现考试的内容全部是教材中的内容&#xff0c;非常符合我学习的思路&#xff0c;因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家&#xff0c;希望更多的人能够通过考试&a…...

帕金森早期诊断准确率提高至 90.2%,深圳先进院联合中山一院提出 GSP-GCNs 模型

中山大学附属第一医院&中科大先进院等研究团队&#xff0c;提出了一种深度学习模型——图信号处理-图卷积网络 (GSP-GCNs)&#xff0c;利用从涉及声调调节的特定任务中获得的事件相关脑电图数据来诊断帕金森病。 震颤、动作迟缓、表情僵硬……提起帕金森病&#xff0c;多数…...

java servlet果蔬产业监管系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web果蔬产业监管系统是一套完善的java web信息管理系统 serlvetdaobean mvc 模式开发 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主 要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5…...

Flask 入门

1. 关于 Flask Flask诞生于2010年&#xff0c; Armin Ronacher的一个愚人节玩笑。不过现在已经是一个用python语言基于Werkzeug工具箱编写的轻量级web开发框架&#xff0c;它主要面向需求简单&#xff0c;项目周期短的小应用。 Flask本身相当于一个内核&#xff0c;其他几乎所…...

微信小程序Skyline在手机端不渲染的问题之一及其解决方式

问题&#xff1a;电脑端是skyline渲染&#xff0c;手机端是webview渲染?如何解? 开发者工具 当前渲染模式&#xff1a;Skyline 当进行预览时手机端却是: 请注意看轮播图的显示情况 请注意看轮播图的显示情况 请注意看轮播图的显示情况 从轮播图上来看,手机端是webview渲染…...

怎样做好Code Review

Code Review方案 定义 Code Review代码评审是指在软件开发过程中&#xff0c;通过对源代码进行系统性检查的过程。通常的目的是查找各种缺陷&#xff0c;包括代码缺陷、功能实现问题、编码合理性、性能优化等&#xff1b;保证软件总体质量和提高开发者自身水平 code review …...

臻于至善,CodeArts Snap 二维绘图来一套不?

前言 我在体验 华为云的 CodeArts Snap 时&#xff0c;第一个例子就是绘制三角函数图像&#xff0c;功能注释写的也很简单。 业务场景中&#xff0c;有一类就是需要产出各种二维图形的&#xff0c;比如&#xff0c;折线图、散点图、柱状图等。 为了提前积累业务素材&#xf…...

STM32学习笔记(二) —— 调试串口

我们在调试程序时&#xff0c;经常会使用串口打印相关的调试信息&#xff0c;但是单片机串口不能直接与 PC 端的 USB 接口通讯&#xff0c;需要用到一个USB转串口的芯片来充当翻译的角色。我们使用的开发板上有这个芯片&#xff0c;所以在打印调试信息的时候直接使用USB线连接开…...

Ubuntu20.0.4下设置frpc开机自启动

目录 一、下载frp 二、解压 三、服务端部署 1.配置 2.运行 三、客户端部署 1、配置 2、后台运行 四、开机启动 1、拷贝frpc.service 2、修改配置 3、启用服务 五、ubuntu20.04使用 rc-local.service设置开机启动 1、建立开机服务添加 [Install] 段 2、授权rc-local.service 3、…...

05 Redis之Benchmark+简单动态字符串SDS+集合的底层实现

3.8 Benchmark Redis安装完毕后会自动安装一个redis-benchmark测试工具&#xff0c;其是一个压力测试工具&#xff0c;用于测试 Redis 的性能。 src目录下可找到该工具 通过 redis-benchmark –help 命令可以查看到其用法 3.8.1 测试1 3.9 简单动态字符串SDS 无论是 Redis …...

【C++】priority_queue优先队列

头文件#include <queue> 优先队列具有队列的所有特性&#xff0c;本质是一个堆实现的&#xff0c;和队列基本操作相同: top 访问队头元素 empty 队列是否为空 size 返回队列内元素个数 push 插入元素到队尾 (并排序) emplace 原地构造一个元素并插入队列 pop 弹出队头元素…...

蓝桥杯---三国游戏

问题描述 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵 X, Y, Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件&#xff0c;每个事件之 间相互独立且最多只会发生一次&#xff0c;当第 i 个事件发生时会分别让 X, Y, Z 增加 Ai , Bi ,Ci 。…...

设计一个分布式ID

为了保证全局唯一性可以用时间作为区分点一部分&#xff0c;时间尽可能细化&#xff0c;可以精确到毫秒&#xff0c;甚至是微秒和纳秒。如果是分布式系统有多态机器&#xff0c;可以根据机器ID再进行以下区分。如哦机器运行的特别快&#xff0c;1毫秒有大量ID生成&#xff0c;可…...

259:vue+openlayers: 显示海量多边形数据,10ms加载完成

第259个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers项目中通过WebGLVectorLayerRenderer方式加载海量多边形数据。这里相当于将海量的数据放在同一个层的source中,然后通过webglTile的方式渲染出这一层。 本示例数据为5000个多边形,加载速度超级快。 直接…...

Go Zero微服务个人探究之路(十)实战走通微服务前台请求调用的一套流程model->rpc微服务->apiHTTP调用

前言 Go语言凭借低占用&#xff0c;高并发等优秀特性成为后台编程语言的新星&#xff0c;GoZero框架由七牛云技术副总裁团队编写&#xff0c;目前已经成为Go微服务框架里star数量最多的框架 本文记录讲述笔者一步步走通前台向后台发出请求&#xff0c;后台api调用rpc服务的相…...

K8s 安装部署-Master和Minion(Node)

K8s 安装部署-Master和Minion(Node) 操作系统版本&#xff1a;CentOS 7.4 Master &#xff1a;172.20.26.167 Minion-1&#xff1a;172.20.26.198 Minion-2&#xff1a;172.20.26.210&#xff08;后增加节点&#xff09; ETCD&#xff1a;172.20.27.218 先安装部署ETCD y…...

从零学习Linux操作系统 第二十部分 mariadb数据库的管理

一、对于数据库的基本介绍 1.什么是数据库 数据库就是个高级的表格软件 2.常见数据库 Mysql Oracle mongodb db2 sqlite sqlserver … 3.Mysql (SUN -----> Oracle) 4.mariadb (Mysql的一种&#xff09; 数据库中的常用名词 1.字段 &#xff1a;表格中的表头 2.表 &…...

数据脱敏和数据加密有什么区别

数据脱敏&#xff1a;主要是为了兼顾数据安全与数据使用&#xff0c;采用专业的数据脱敏算法。 数据加密:通过对数据进行编码来保护数据&#xff0c;获取实际值的唯一方法是使用解密密钥解码数据。 数据加密是可逆的&#xff0c;数据脱敏是不可逆的。 处理方法不同 保护内容…...

主流排序算法

冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a; 基本思想&#xff1a;通过比较相邻元素的大小&#xff0c;不断交换相邻元素的位置&#xff0c;使得较大的元素逐渐“浮”到数组的最后。时间复杂度&#xff1a;O(n^2)。 选择排序&#xff08;Selection Sort&#xf…...

MySql的使用方法

一.什么是MySql MySql是一种数据库管理系统&#xff0c;是用来存储数据的&#xff0c;可以有效的管理数据&#xff0c;数据库的存储介质为硬盘和内存。 和文件相比&#xff0c;它具有以下优点&#xff1a; 文件存储数据是不安全的&#xff0c;且不方便数据的查找和管理&#xf…...

C#,数据检索算法之三元搜索(Ternary Search)的源代码

数据检索算法是指从数据集合&#xff08;数组、表、哈希表等&#xff09;中检索指定的数据项。 数据检索算法是所有算法的基础算法之一。 本文发布 三元搜索&#xff08;Ternary Search&#xff09;的源代码。 1 文本格式 using System; namespace Legalsoft.Truffer.Algo…...

windbg:常用指令

windbg 调试 参考文档 1、viewing-and-editing-global-variables-in-windbg WinDBG 常用调试命令 加载符号 .sympath // 查看当前符号查找路径 .sympath c:\symbols // 将符号查找路径设为&#xff1a;c:\symbols .sympath c:\symbols // 将c:\symbols添加…...

23. 集合类

集合 1. 概述2. 分类2.1 单列集合&#xff08;Collection&#xff09;2.2 双列集合&#xff08;Map&#xff09; 单列集合 Collection、List、Set、ArrayList、LinkedList’、Vector、HashSet、TreeSet、LinkedHashSet双列集合 Map、HashTable、HashMap、TreeMap、Properties、…...

OpenAI平台:引领人工智能的创新与应用

在当今迅速发展的技术世界中&#xff0c;OpenAI已成为人工智能&#xff08;AI&#xff09;研究和应用的先驱。作为一个致力于确保人工智能的安全和广泛受益的组织&#xff0c;OpenAI通过其平台提供了一系列强大的工具和API&#xff0c;这些工具和API正在重塑我们与技术的互动方…...