嵌入式学习——硬件(IIC、ADC)——day56

1. IIC

1.1 定义(同步串行半双工通信总线)

        IIC(Inter-Integrated Circuit)又称I2C,是是IICBus简称,所以中文应该叫集成电路总线。是飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展而来的一种同步串行半双工通信总线方式。该总线允许同时连接多个设备(芯片)。每块芯片在总线上拥有特定的地址。自2006年10月1日起,使用I²C协议已经不需要支付专利费,但制造商仍然需要付费以获取IIC从属设备地址。

1.2 作用

  1. 设备间通信:I²C用于微控制器和各种外围设备(如传感器、EEPROM、ADC/DAC、LCD显示器等)之间的数据传输。
  2. 多主多从结构:I²C支持多主多从架构,允许多个主设备和多个从设备在同一总线上通信。
  3. 地址分配:每个从设备在总线上都有一个唯一的地址,主设备通过该地址来选择并与特定从设备通信。
  4. 时钟同步:I²C使用单主时钟同步,主设备生成时钟信号,从设备响应时钟信号进行数据传输。
  5. 双向数据传输:I²C支持双向数据传输,主设备可以向从设备发送数据,也可以从从设备读取数据。

1.3 IIC的组网模式

       上图所示是IIC的总线的使用场景,所有挂载在IIC总线上的设备都有两根信号线,一根是数据线SDA,另一根是时钟线SCL。这两个信号线都是双向的。

       作为一种通信方式,IIC总线在某一时刻,总线只允许有一个设备处于发送状态,所发出的数据被总线上所有的设备所接收。IIC通信协议包含有设备地址,只有发送方携带的地址与某个接收方的地址相同时,接收方才真正执行相关的指令。

       IIC总线规定,设备在空闲时,两根总线都处于高电平状态。为保证这种状态,数据线SDA和时钟线SCL都要外接上拉电阻。上拉电阻的阻值一般位4.7~10K。。I2C 总线标准模式下速度可以达到 100Kb/S,快速模式下可以达到 400Kb/S。I2C 总线工作是按照一定的协议来运行的,接下来就看一下 I2C 协议。

1.4 IIC代码

#include <s3c2440.h>
#include <string.h>
#include <stdio.h>
#include "led.h"
#include "key.h"
#include "interrupt.h"
#include "delay.h"
#include "pwm.h"#define ADDRESS 0X08void init_wdt(void)	//初始化看门狗,禁止启动,关闭看门狗
{WTCON &= ~(1 << 0);
}void init_clk(void)
{unsigned int t = MPLLCON; //将PCLK频率存入变量设置好再进行修改,防止频率修改中途器件因为频率过高而短路t &= ~((0xff << 12) | (0x3f << 4) | (3 << 0)); //利用锁相环将12MHz倍频t |= ((127 << 12) | (2 << 4) | (1 << 0)); //配置fclk频率大约为400MhzCLKDIVN |= ((2 << 1) | (1 << 0));//分频,配置HCLK为100MHz,HCLK为50MHz	MPLLCON = t;//将所有频率配置好再进行设置,防止器件被烧坏
}unsigned char buffer[128] = {0};//存储pc给s3c2440发送,s3c2440接收到的字符串
unsigned char tmpbuffer[128];
unsigned int pos;//已经收到字符的个数,下一个要收到字符的位置void uart0_handler(void)
{if (SUBSRCPND & (1 << 0))//如果UART0接收到了数据{buffer[pos++] = URXH0;			}SUBSRCPND = SUBSRCPND;	
}void init_uart0(void)
{unsigned int t = 0;GPHCON &= ~(0x0f << 4);GPHCON |= ((2 << 6) | (2 << 4));//设置中断模式,串口电路引脚寄存器功能t = ULCON0;		//9600 n 8 1 波特率? 校验位? 数据位? 停止位t &= ~(1 << 6);//不使用红外模式t &= ~(7 << 3);//无奇偶校验t &= ~(1 << 2);//每帧 1 个停止位t |= (3 << 0);//每帧用于发送或接收的数据位的个数8位ULCON0 = t;t = UCON0;	 //s3c2440给电脑发送数据用轮询   电脑给s3c2440发送数据,s3c2440接收数据触发中断t &= ~(3 << 10);//选PCLK给 UART 波特率t &= ~(3 << 8);//发送接收方式改为脉冲方式t &= ~(0x0f << 4);// 都设置为普通模式t &= ~(0x0f << 0);t |= (0x05 << 0);//设置UART模式发送轮询  接收模式为中断UCON0 = t;INTSUBMSK &= ~(1 << 0);//uart子中断改为可服务状态enable_irq(IRQ_UART0);//配置中断为IRQ模式,让中断处于可服务模式	  //配置接收的中断register_irq(IRQ_UART0 ,uart0_handler);UBRDIV0 = 325;//波特率分频寄存器 50000000/9600/16-1约等于325pos = 0;		 	 
}void uart0_send_char(unsigned char ch)
{UTXH0 = ch;	// UART0 要发送的数据   UART 发送缓冲 寄存器while(0 == (UTRSTAT0 & (1 << 2)));//数据发完的标志   UART TX/RX 状态 寄存器	
}void send_buffer(const char *p, unsigned int len)
{unsigned int i;for(i = 0;i < len;++i){uart0_send_char(*p++);}
}int parse(const char *p, unsigned int len)//分析上位机pc端发送的信息
{int i = 0;int n = 0;unsigned char tmpnum = 0;if (p[0] != 0xaa || p[len-1] != 0x0D)//判断起始校验位{n = 0;}if (p[1] != ADDRESS) //判断是否为正确的下位机{n = 0;}for (i = 0; i < 8; i++){tmpnum += p[i];}if (p[8] != tmpnum)	 //判断校验位是否正确{n = 0;}if (0x01 == p[2])//调频{n = 1;}else if (0x02 == p[2]) //点灯{n = 2;}return n;	
}int i2c_finished = 0; //中断触发条件void i2c_handler(void)//一条指令发送结束当ACK回复结束触发中断
{i2c_finished = 1;	
} void init_i2c(void)//初始化IIC
{GPECON &= ~((unsigned int)0x0f << 28);GPECON |= ((unsigned int)0x0a << 28);//初始化24C02的I2CSDA、I2CSCLIICCON |= (1 << 7);//允许IIC 总线应答使能位  回复ACKIICCON |= (1 << 6);//50000000/512约等于96000 小于100k IIC 总线发送时钟预分频器的时钟源选择位IICCON |= (1 << 5);//IIC 总线 Tx/Rx 中断使能/禁止位	允许enable_irq(IRQ_I2C);//使能中断register_irq(IRQ_I2C, i2c_handler);//注册中断//	GPECON &= ~((unsigned int)0x0F << 28);
//	GPECON |= ((unsigned int)2 << 30) | (2 << 28);
//
//	IICCON |= (1 << 7) | (1 << 6) | (1 << 5);
//	IICCON &= ~(0x0F << 0);
//
//    enable_irq(IRQ_I2C);
//	register_iqr(IRQ_I2C, i2c_handler);
}void do_and_wait_ack(void)
{i2c_finished = 0;IICCON &= ~(1 << 4); //发送使能,清除挂起位while (0 == i2c_finished)//判断是否发送完成{udelay(100);//不能立马读取,要等一下	}	
}void at24c02_write(unsigned char device_address, unsigned char reg_address, const unsigned char *data, unsigned char n)//主机写——设备地址、寄存器地址、要写入数据的指针、数据字节数 
{unsigned int i = 0;IICDS = device_address;//写设备地址IICSTAT = 0xF0;	//模式选择 主发送模式、产生起始信号、使能 Rx/Txdo_and_wait_ack();//使能数据发送并等待发送结束返回ack触发中断IICDS = reg_address;//写设备中寄存器地址do_and_wait_ack();//使能数据发送并等待发送结束返回ack触发中断for (i = 0; i < n; ++i)//页写,循环发送所有数据{IICDS = *data++;do_and_wait_ack();	}IICSTAT = 0xD0;//模式选择 主发送信号、产生停止信号、使能 Rx/TxIICCON &= ~(1 << 4); //发送使能,清除挂起位udelay(100);//		
}void at24c02_read(unsigned char device_address, unsigned char reg_address, unsigned char *data, unsigned char n)//主机读(从机发数据给主机)——设备地址、寄存器地址、要读出数据的指针、数据字节数
{unsigned int i = 0;IICDS = device_address;//写设备地址IICSTAT = 0xF0;	//模式选择 主发送模式、产生起始信号、使能 Rx/Txdo_and_wait_ack();//使能数据发送并等待发送结束返回ack触发中断IICDS = reg_address;//写设备中寄存器地址do_and_wait_ack();//使能数据发送并等待发送结束返回ack触发中断IICDS = device_address;//写设备地址IICSTAT = 0xB0;	//模式选择 主接收模式、产生起始信号、使能 Rx/Txdo_and_wait_ack();//使能数据发送并等待发送结束返回ack触发中断*data = IICDS;	//第一次没用do_and_wait_ack();	for (i = 0; i < n; ++i){if ((n - 1) == i){IICCON &= ~(1 << 7);//回复NACK			}*data++ = IICDS;do_and_wait_ack();		}IICSTAT = 0x90;IICCON |= (1 << 7);IICCON &= ~(1 << 4);udelay(100);	
}int main(void)
{char s[100] = {0};init_wdt();init_led();init_key();init_clk();init_delay();init_uart0();init_i2c();at24c02_write(0xA0, 0x00, "ABCDEF", 6);at24c02_read(0xA0, 0x00, (unsigned char *)s, 6);while(1){if(pos != 0){mdelay(100);at24c02_write(0xA0, 0x00, buffer, pos);at24c02_read(0xA0, 0x00, (unsigned char *)s, pos);send_buffer(s, pos);pos = 0;}		}}

2. ADC滤波(中值滤波、高斯滤波、高斯加权均值滤波、最小二乘法)

#include <s3c2440.h>
#include <string.h>
#include <stdio.h>
#include "led.h"
#include "key.h"
#include "interrupt.h"
#include "delay.h"
#include "pwm.h"#define ADDRESS 0X08void init_wdt(void)	//初始化看门狗,禁止启动,关闭看门狗
{WTCON &= ~(1 << 0);
}void init_clk(void)
{unsigned int t = MPLLCON; //将PCLK频率存入变量设置好再进行修改,防止频率修改中途器件因为频率过高而短路t &= ~((0xff << 12) | (0x3f << 4) | (3 << 0)); //利用锁相环将12MHz倍频t |= ((127 << 12) | (2 << 4) | (1 << 0)); //配置fclk频率大约为400MhzCLKDIVN |= ((2 << 1) | (1 << 0));//分频,配置HCLK为100MHz,HCLK为50MHz	MPLLCON = t;//将所有频率配置好再进行设置,防止器件被烧坏
}unsigned char buffer[128] = {0};//存储pc给s3c2440发送,s3c2440接收到的字符串
unsigned char tmpbuffer[128];
unsigned int pos;//已经收到字符的个数,下一个要收到字符的位置void uart0_handler(void)
{if (SUBSRCPND & (1 << 0))//如果UART0接收到了数据{buffer[pos++] = URXH0;			}SUBSRCPND = SUBSRCPND;	
}void init_uart0(void)
{unsigned int t = 0;GPHCON &= ~(0x0f << 4);GPHCON |= ((2 << 6) | (2 << 4));//设置中断模式,串口电路引脚寄存器功能t = ULCON0;		//9600 n 8 1 波特率? 校验位? 数据位? 停止位t &= ~(1 << 6);//不使用红外模式t &= ~(7 << 3);//无奇偶校验t &= ~(1 << 2);//每帧 1 个停止位t |= (3 << 0);//每帧用于发送或接收的数据位的个数8位ULCON0 = t;t = UCON0;	 //s3c2440给电脑发送数据用轮询   电脑给s3c2440发送数据,s3c2440接收数据触发中断t &= ~(3 << 10);//选PCLK给 UART 波特率t &= ~(3 << 8);//发送接收方式改为脉冲方式t &= ~(0x0f << 4);// 都设置为普通模式t &= ~(0x0f << 0);t |= (0x05 << 0);//设置UART模式发送轮询  接收模式为中断UCON0 = t;INTSUBMSK &= ~(1 << 0);//uart子中断改为可服务状态enable_irq(IRQ_UART0);//配置中断为IRQ模式,让中断处于可服务模式	  //配置接收的中断register_irq(IRQ_UART0 ,uart0_handler);UBRDIV0 = 325;//波特率分频寄存器 50000000/9600/16-1约等于325pos = 0;		 	 
}void uart0_send_char(unsigned char ch)
{UTXH0 = ch;	// UART0 要发送的数据   UART 发送缓冲 寄存器while(0 == (UTRSTAT0 & (1 << 2)));//数据发完的标志   UART TX/RX 状态 寄存器	
}void send_buffer(const char *p, unsigned int len)
{unsigned int i;for(i = 0;i < len;++i){uart0_send_char(*p++);}
}int parse(const char *p, unsigned int len)//分析上位机pc端发送的信息
{int i = 0;int n = 0;unsigned char tmpnum = 0;if (p[0] != 0xaa || p[len-1] != 0x0D)//判断起始校验位{n = 0;}if (p[1] != ADDRESS) //判断是否为正确的下位机{n = 0;}for (i = 0; i < 8; i++){tmpnum += p[i];}if (p[8] != tmpnum)	 //判断校验位是否正确{n = 0;}if (0x01 == p[2])//调频{n = 1;}else if (0x02 == p[2]) //点灯{n = 2;}return n;	
}int i2c_finished = 0; //中断触发条件void i2c_handler(void)//一条指令发送结束当ACK回复结束触发中断
{i2c_finished = 1;	
} void init_i2c(void)//初始化IIC
{GPECON &= ~((unsigned int)0x0f << 28);GPECON |= ((unsigned int)0x0a << 28);//初始化24C02的I2CSDA、I2CSCLIICCON |= (1 << 7);//允许IIC 总线应答使能位  回复ACKIICCON |= (1 << 6);//50000000/512约等于96000 小于100k IIC 总线发送时钟预分频器的时钟源选择位IICCON |= (1 << 5);//IIC 总线 Tx/Rx 中断使能/禁止位	允许enable_irq(IRQ_I2C);//使能中断register_irq(IRQ_I2C, i2c_handler);//注册中断//	GPECON &= ~((unsigned int)0x0F << 28);
//	GPECON |= ((unsigned int)2 << 30) | (2 << 28);
//
//	IICCON |= (1 << 7) | (1 << 6) | (1 << 5);
//	IICCON &= ~(0x0F << 0);
//
//    enable_irq(IRQ_I2C);
//	register_iqr(IRQ_I2C, i2c_handler);
}void do_and_wait_ack(void)
{i2c_finished = 0;IICCON &= ~(1 << 4); //发送使能,清除挂起位while (0 == i2c_finished)//判断是否发送完成{udelay(100);//不能立马读取,要等一下	}	
}void at24c02_write(unsigned char device_address, unsigned char reg_address, const unsigned char *data, unsigned char n)//主机写——设备地址、寄存器地址、要写入数据的指针、数据字节数 
{unsigned int i = 0;IICDS = device_address;//写设备地址IICSTAT = 0xF0;	//模式选择 主发送模式、产生起始信号、使能 Rx/Txdo_and_wait_ack();//使能数据发送并等待发送结束返回ack触发中断IICDS = reg_address;//写设备中寄存器地址do_and_wait_ack();//使能数据发送并等待发送结束返回ack触发中断for (i = 0; i < n; ++i)//页写,循环发送所有数据{IICDS = *data++;do_and_wait_ack();	}IICSTAT = 0xD0;//模式选择 主发送信号、产生停止信号、使能 Rx/TxIICCON &= ~(1 << 4); //发送使能,清除挂起位udelay(100);//		
}void at24c02_read(unsigned char device_address, unsigned char reg_address, unsigned char *data, unsigned char n)//主机读(从机发数据给主机)——设备地址、寄存器地址、要读出数据的指针、数据字节数
{unsigned int i = 0;IICDS = device_address;//写设备地址IICSTAT = 0xF0;	//模式选择 主发送模式、产生起始信号、使能 Rx/Txdo_and_wait_ack();//使能数据发送并等待发送结束返回ack触发中断IICDS = reg_address;//写设备中寄存器地址do_and_wait_ack();//使能数据发送并等待发送结束返回ack触发中断IICDS = device_address;//写设备地址IICSTAT = 0xB0;	//模式选择 主接收模式、产生起始信号、使能 Rx/Txdo_and_wait_ack();//使能数据发送并等待发送结束返回ack触发中断*data = IICDS;	//第一次没用do_and_wait_ack();	for (i = 0; i < n; ++i){if ((n - 1) == i){IICCON &= ~(1 << 7);//回复NACK			}*data++ = IICDS;do_and_wait_ack();		}IICSTAT = 0x90;IICCON |= (1 << 7);IICCON &= ~(1 << 4);udelay(100);	
}void init_adc(void)	//初始化ADC
{unsigned int t;t = ADCCON;t |= (1 << 14);	//使能预分频t &= ~(0xff << 6);t |= (49 << 6);//给预分频值t &= ~(0x07 << 3);// 模拟输入通道选择AIN0(引脚)t &= ~(1 << 2);// 正常工作模式t |= (1 << 1);//使能ADC转换ADCCON = t;
}void do_adc(void)
{int i = 0;unsigned int ret = 0;//存每次转换好的ADC的值unsigned int adc_buffer[10];//存十次adc采样的值unsigned long long sum = 0;//存十次采样的总和char s[10] = {0};ret = ADCDAT0;//取出转化的值for (i = 0; i < 10; ++i){while (0 == (ADCCON & (1 << 15)))//转换结束标志位、判断ADC是否处理结束ret = ADCDAT0 & 0x3ff;//取出转化的值(只要低十位) adc_buffer[i] = ret;}for (i = 0; i < 10; ++i){sum += adc_buffer[i];}sprintf(s, "%llu\n", sum / 10);//求平均值send_buffer((const char *)s, strlen(s));
}int main(void)
{
//	char s[100] = {0};init_wdt();init_led();init_key();init_clk();init_delay();init_uart0();init_i2c();init_adc();do_adc();
//	at24c02_write(0xA0, 0x00, "ABCDEF", 6);
//	at24c02_read(0xA0, 0x00, (unsigned char *)s, 6);while(1){do_adc();
//		if(pos != 0)
//		{
//			mdelay(100);
//			at24c02_write(0xA0, 0x00, buffer, pos);
//			at24c02_read(0xA0, 0x00, (unsigned char *)s, pos);
//			send_buffer(s, pos);
//			pos = 0;
//		}		}
}

1. eeprom电容可擦除、可编程的rom

2. IIC总线上两根线都给高电平,如何保证两根总线上为高电平,给两根总线上都加上拉电阻

10k或4.7k

3.IIC数据高位先行

SCK时钟信号主机提供、数据信号SDA

主机在时钟高电平拉低数据线为起始,主机在时钟高电平拉高终止

红主机、绿从机

主机写,从机给主机应答ACK、

主机读,主机给从机非应答NACK

时钟高电平数据要保持稳定

4. 面试问题

简述IIC时序

5. 

末尾0往硬盘写数据,1从硬盘读数据

6. 每完成一步, 产生一次中断

7. 应答ack不应答nack

发ACK时刻,产生中断

7. 第一次读取的数据是无效的

8. 

ADC只能转电压

八位0~255

十位0~1023

十二位0~4095

n位ADC为比较器的个数

ADC工作原理:逐次逼近法(类似于二分查找)

ksps

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/366079.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux高并发服务器开发(八)Socket和TCP

文章目录 1 IPV4套接字结构体2 TCP客户端函数 3 TCP服务器流程函数代码粘包 4 三次握手5 四次挥手6 滑动窗口 1 IPV4套接字结构体 2 TCP客户端 特点&#xff1a;出错重传 每次发送数据对方都会回ACK&#xff0c;可靠 tcp是打电话的模型&#xff0c;建立连接 使用连接 关闭连接…

【代码随想录】【算法训练营】【第49天】 [300]最长递增子序列 [674]最长连续递增序列 [718]最长重复子数组

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 49&#xff0c;周二&#xff0c;坚持不了一点~ 题目详情 [300] 最长递增子序列 题目描述 300 最长递增子序列 解题思路 前提&#xff1a;最大递增子序列的长度 思路&#xff1a;动态规划 d…

RedHat9 | podman容器-续集

一、管理容器存储和网络资源 使用容器来运行简单的进程&#xff0c;然后退出。可以配置容连续运行特定服务&#xff0c;如数据库服务。如果持续运行服务&#xff0c;需要向容器添加更多的资源&#xff0c;如持久存储或对其他网络的访问权限。 针对企业容器平台上的大型部署&a…

汽车零部件材料耐候性测试氙光太阳辐射系统试验箱

概述 汽车零部件等领域的材料耐候性测试是一项关键的质量控制环节&#xff0c;它关乎汽车部件在各种气候条件下的性能表现和寿命。塑料件光照老化实验箱&#xff0c;即氙灯老化试验箱&#xff0c;在其中扮演着至关重要的角色。通过模拟自然环境中的光照、温度、湿度等条件&…

遇到多语言跨境电商系统源码问题?这里有解决方案!

从手机到电脑&#xff0c;从线下到线上&#xff0c;如今&#xff0c;跨境电商正在打破地域界限&#xff0c;成为全球贸易的新引擎。在这个全球化的背景下&#xff0c;跨境电商平台的运营也面临着一系列的挑战&#xff0c;其中之一就是多语言问题。如果你遇到了多语言跨境电商系…

【HALCON】如何实现hw窗口自适应相机拍照成像的大小

前言 在开发一个喷码检测软件的时候碰到相机成像和hw窗体的大小不一致&#xff0c;hw太小显示不完全成像的图片&#xff0c;这使得成像不均匀&#xff0c;现场辨别起来比较不直观&#xff0c;因此需要对其进行一个调整。 解决 省略掉读取图片的环节&#xff0c;我们只需要将…

全国产化飞腾模块BIOS下修复系统启动文件

1、背景介绍 全国产飞腾模块采用麒麟信安操作系统&#xff0c;当系统下面的grub.cfg文件被用户误操作导致无法启动时&#xff0c;可以在BIOS下通过U盘中备份的grub.cfg替换硬盘上原来的grub.cfg文件&#xff0c;从而实现启动。 2、操作步骤 首先进入BIOS命令行模式&#xff…

2.3章节Python中的数值类型

1.整型数值 2.浮点型数值 3.复数   Python中的数值类型清晰且丰富&#xff0c;主要分为以下几种类型&#xff0c;每种类型都有其特定的用途和特性。 一、整型数值 1.定义&#xff1a;整数类型用于表示整数值&#xff0c;如1、-5、100等。 2.特点&#xff1a; Python 3中的…

Ubuntu(通用)—网络加固—ufw+防DNS污染+ARP绑定

1. ufw sudo ufw default deny incoming sudo ufw deny in from any to any # sudo ufw allow from any to any port 5353 protocol udp sudo ufw enable # 启动开机自启 # sudo ufw reload 更改后的操作2. 防ARP欺骗 华为云教程 arp -d删除dns记录arp -a显示arp表 ipconfi…

拆分盘投资策略解析:机制、案例与风险考量

一、引言 随着互联网技术的迅猛发展和金融市场的不断创新&#xff0c;拆分盘这一投资模式逐渐崭露头角&#xff0c;成为投资者关注的焦点。它基于特定的拆分策略&#xff0c;通过调整投资者持有的份额和单价&#xff0c;实现了看似稳健的资产增长。本文旨在深入探讨拆分盘的运…

MySQL-数据操作类型的角度理解 S锁 X锁

文章目录 1、S锁和S锁互相兼容2、S锁和X锁互斥3、X锁和X锁也互斥4、X锁和S锁也互斥5、select * from account for update;6、select * from account for update nowait;7、select * from account for update skip locked; 1、S锁和S锁互相兼容 2、S锁和X锁互斥 3、X锁和X锁也互…

在线疫苗预约小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;工作人员管理&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;疫苗管理&#xff0c;论坛管理&#xff0c;公告管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;公告&#xff0c;疫苗…

K 近邻、K-NN 算法图文详解

1. 为什么学习KNN算法 KNN是监督学习分类算法&#xff0c;主要解决现实生活中分类问题。根据目标的不同将监督学习任务分为了分类学习及回归预测问题。 KNN&#xff08;K-Nearest Neihbor&#xff0c;KNN&#xff09;K近邻是机器学习算法中理论最简单&#xff0c;最好理解的算法…

【Android面试八股文】性能优化相关面试题: 什么是内存抖动?什么是内存泄漏?

文章目录 一、什么是内存抖动?内存抖动的问题卡顿OOM(Out Of Memory)二、什么是内存泄漏(Memory Leak)?引用计数法可达性分析法一、什么是内存抖动? 在Java中,每创建一个对象,就会申请一块内存,存储对象信息; 每分配一块内存,程序的可用内存也就少一块; 当程序…

(1)Jupyter Notebook 下载及安装

目录 1. Jupyter Notebook是什么&#xff1f;2. Jupyter Notebook特征3. 应用3. 利用Google Colab安装Jupyter Notebook3.1 什么是 Colab&#xff1f;3.2 访问 Google Colab 1. Jupyter Notebook是什么&#xff1f; 百度百科: Jupyter Notebook&#xff08;此前被称为 IPython …

C语言部分复习笔记

1. 指针和数组 数组指针 和 指针数组 int* p1[10]; // 指针数组int (*p2)[10]; // 数组指针 因为 [] 的优先级比 * 高&#xff0c;p先和 [] 结合说明p是一个数组&#xff0c;p先和*结合说明p是一个指针 括号保证p先和*结合&#xff0c;说明p是一个指针变量&#xff0c;然后指…

R语言 | 使用ggplot绘制柱状图,在柱子中显示数值和显著性

原文链接&#xff1a;使用ggplot绘制柱状图&#xff0c;在柱子中显示数值和显著性 本期教程 获得本期教程示例数据&#xff0c;后台回复关键词&#xff1a;20240628。&#xff08;PS&#xff1a;在社群中&#xff0c;可获得往期和未来教程所有数据和代码&#xff09; 往期教程…

Windows宝塔面板部署ThinkPHP8.0创建Vue项目案例

安装ThinkPHP8.0 登录宝塔面板&#xff0c;创建一个站点。 输入composer代码&#xff0c;执行完成后自动创建TP目录 composer create-project topthink/think tp 网站目录设置为tp&#xff0c;运行目录设置为public 设置PHP版本为8.0以上&#xff0c;不然会出现下面的报错代…

1-5题查询 - 高频 SQL 50 题基础版

目录 1. 相关知识点2. 例题2.1.可回收且低脂的产品2.2.寻找用户推荐人2.3.大的国家2.4. 文章浏览 I2.5. 无效的推文 1. 相关知识点 sql判断&#xff0c;不包含null&#xff0c;判断不出来distinct是通过查询的结果来去除重复记录ASC升序计算字符长度 CHAR_LENGTH() 或 LENGTH(…

js实现blockly后台解释器,可以单步执行,可以调用c/c++函数

实现原理 解析blockly语法树&#xff0c;使用js管理状态&#xff0c;实际使用lua执行&#xff0c;c/c函数调用使用lua调用c/c函数的能力 可以单行执行 已实现if功能 TODO for循环功能 函数功能 单步执行效果图 直接执行效果图 源代码 //0 暂停 1 单步执行 2 断点 //创建…