用c语音写一个avr的频率捕获程序

时间: 2023-03-02 15:16:05 浏览: 39
AVR 是一种微控制器芯片,它可以使用 C 语言进行编程。以下是使用 C 语言编写 AVR 频率捕获程序的基本步骤: 1. 初始化定时器模块:选择定时器模块(如 Timer1),设置时钟源和分频器,以及捕获模式。 2. 等待捕获事件:等待外部事件触发定时器的捕获输入端口(ICP1)。 3. 读取捕获寄存器值:当定时器捕获到外部事件时,将捕获寄存器的值存储到变量中。这个值表示定时器计数器的当前值。 4. 计算频率:根据定时器的时钟源、分频器和捕获寄存器的值,计算出输入信号的频率。 下面是一个使用 C 语言编写 AVR 频率捕获程序的简单示例: ```c #include <avr/io.h> #include <avr/interrupt.h> // 定义捕获寄存器 volatile uint16_t capture_value; int main(void) { // 初始化定时器模块 TCCR1B |= (1 << ICES1); // 上升沿捕获 TCCR1B |= (1 << CS10); // 无分频 TIMSK1 |= (1 << ICIE1); // 允许输入捕获中断 // 允许全局中断 sei(); while (1) { // 等待中断事件 } } // 定义输入捕获中断服务程序 ISR(TIMER1_CAPT_vect) { capture_value = ICR1; // 保存捕获寄存器的值 // 计算频率 // ... } ``` 这个程序使用 Timer1 模块捕获外部信号的上升沿,并使用输入捕获中断来保存捕获寄存器的值。你需要根据具体的应用场景来选择定时器模块、时钟源和分频器,并根据实际需要计算频率。

相关推荐

好的,下面是一个简单的 AVR128 的 PID 控制电压程序: c #include <avr/io.h> #include <util/delay.h> #define Kp 1.0 #define Ki 0.5 #define Kd 0.2 #define VREF 5.0 double pid_control(double setpoint, double measured_value); int main(void) { // 初始化PWM输出 DDRB |= (1 << PB1); TCCR1A |= (1 << COM1A1) | (1 << WGM11); TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS11) | (1 << CS10); ICR1 = 0x00FF; // 初始化ADC ADMUX |= (1 << REFS0); // 使用AVCC作为参考电压 ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // 启用ADC并设置预分频 ADCSRA |= (1 << ADSC); // 开始第一次ADC转换 double setpoint = 2.5; // 设定电压 double measured_value = 0.0; // 测量的电压值 double output = 0.0; // PID 控制输出 while (1) { measured_value = ADC * VREF / 1024.0; // 获取ADC转换结果并计算电压值 output = pid_control(setpoint, measured_value); // 计算PID控制输出 OCR1A = (int)(output / VREF * ICR1); // 将输出转换为PWM占空比并输出 _delay_ms(10); // 等待一段时间后再次获取电压值并进行PID计算 ADCSRA |= (1 << ADSC); // 再次启动ADC转换 } } double pid_control(double setpoint, double measured_value) { static double last_error = 0.0; static double integral = 0.0; double error = setpoint - measured_value; double derivative = error - last_error; integral += error; double output = Kp * error + Ki * integral + Kd * derivative; last_error = error; return output; } 该程序使用了 AVR128 的ADC和PWM模块,通过PID控制算法控制PWM输出电压,使其接近设定值。其中,Kp、Ki、Kd分别是PID控制算法中的比例、积分、微分系数,可以根据实际情况进行调整。VREF是ADC参考电压,本程序使用AVCC作为参考电压。
好的,下面是一个简单的 ATmega128 的 PID 控制电压程序,它与上面的 AVR128 的程序非常相似: c #include <avr/io.h> #include <util/delay.h> #define Kp 1.0 #define Ki 0.5 #define Kd 0.2 #define VREF 5.0 double pid_control(double setpoint, double measured_value); int main(void) { // 初始化PWM输出 DDRD |= (1 << PD5); TCCR0A |= (1 << COM0A1) | (1 << WGM01) | (1 << WGM00); TCCR0B |= (1 << WGM02) | (1 << CS01) | (1 << CS00); OCR0A = 0; // 初始化ADC ADMUX |= (1 << REFS0); // 使用AVCC作为参考电压 ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // 启用ADC并设置预分频 ADCSRA |= (1 << ADSC); // 开始第一次ADC转换 double setpoint = 2.5; // 设定电压 double measured_value = 0.0; // 测量的电压值 double output = 0.0; // PID 控制输出 while (1) { measured_value = ADC * VREF / 1024.0; // 获取ADC转换结果并计算电压值 output = pid_control(setpoint, measured_value); // 计算PID控制输出 OCR0A = (int)(output / VREF * 255); // 将输出转换为PWM占空比并输出 _delay_ms(10); // 等待一段时间后再次获取电压值并进行PID计算 ADCSRA |= (1 << ADSC); // 再次启动ADC转换 } } double pid_control(double setpoint, double measured_value) { static double last_error = 0.0; static double integral = 0.0; double error = setpoint - measured_value; double derivative = error - last_error; integral += error; double output = Kp * error + Ki * integral + Kd * derivative; last_error = error; return output; } 该程序使用了 ATmega128 的ADC和PWM模块,通过PID控制算法控制PWM输出电压,使其接近设定值。其中,Kp、Ki、Kd分别是PID控制算法中的比例、积分、微分系数,可以根据实际情况进行调整。VREF是ADC参考电压,本程序使用AVCC作为参考电压。
实时消息系统通常使用队列和中断来实现。下面是一个简单的实时消息系统的C语言代码示例: c #include <avr/io.h> #include <avr/interrupt.h> // 定义消息结构体 typedef struct { uint8_t type; // 消息类型 uint8_t data[4]; // 消息数据 } Message; // 定义消息队列 #define QUEUE_SIZE 16 volatile Message message_queue[QUEUE_SIZE]; volatile uint8_t queue_front = 0; volatile uint8_t queue_rear = 0; // 定义中断服务函数,接收串口数据,并将消息加入队列 ISR(USART_RX_vect) { Message msg; // 从串口接收数据,并填充消息结构体 msg.type = UDR0; for (int i = 0; i < 4; i++) { while (!(UCSR0A & (1 << RXC0))); msg.data[i] = UDR0; } // 将消息加入队列 uint8_t next_rear = (queue_rear + 1) % QUEUE_SIZE; if (next_rear != queue_front) { message_queue[queue_rear] = msg; queue_rear = next_rear; } } // 定义任务结构体 typedef struct { void (*task)(void); // 任务函数指针 uint16_t period; // 任务执行周期 uint16_t count; // 计数器,用于确定任务何时执行 } Task; // 定义任务列表,包含1个任务 Task task_list[1] = { {task1, 100, 0} }; // 定义计时器计数器 volatile uint16_t timer_count = 0; // 定义中断服务函数,每1ms执行一次 ISR(TIMER1_COMPA_vect) { // 计时器计数器加1 timer_count++; // 遍历任务列表,检查是否有任务需要执行 for (int i = 0; i < 1; i++) { Task *task = &task_list[i]; if (timer_count % task->period == 0) { // 如果计数器能够整除任务执行周期,说明任务需要执行 task->count++; if (task->count == 1) { // 如果是第一次执行任务,直接调用任务函数 task->task(); } else if (task->count >= task->period / 1000) { // 如果计数器达到了任务执行周期,则重置计数器,并执行任务函数 task->count = 0; task->task(); } } } } int main(void) { // 初始化串口,设置波特率为9600 UBRR0H = 0; UBRR0L = 103; UCSR0B |= (1 << RXEN0) | (1 << RXCIE0); UCSR0C |= (1 << UCSZ01) | (1 << UCSZ00); // 初始化定时器1,设置为CTC模式,频率为1MHz,触发中断的时间间隔为1ms TCCR1B |= (1 << WGM12) | (1 << CS10); OCR1A = 999; TIMSK1 |= (1 << OCIE1A); // 开启全局中断 sei(); while (1) { // 处理消息队列中的消息 while (queue_front != queue_rear) { Message msg = message_queue[queue_front]; queue_front = (queue_front + 1) % QUEUE_SIZE; // 根据消息类型执行相应的操作 if (msg.type == 0x01) { // 执行操作1 } else if (msg.type == 0x02) { // 执行操作2 } } } return 0; } // 示例任务函数 void task1(void) { // 发送一条消息到串口 Message msg; msg.type = 0x01; msg.data[0] = 0x11; msg.data[1] = 0x22; msg.data[2] = 0x33; msg.data[3] = 0x44; while (!(UCSR0A & (1 << UDRE0))); UDR0 = msg.type; for (int i = 0; i < 4; i++) { while (!(UCSR0A & (1 << UDRE0))); UDR0 = msg.data[i]; } } 这个实时消息系统使用串口接收中断来接收消息,并将消息加入队列。主循环中处理消息队列中的消息,根据消息类型执行相应的操作。这个实时消息系统可以接收任意类型的消息,并且可以非常方便地扩展支持更多类型的消息。同时,这个实时消息系统也可以执行多个任务,并且每个任务的执行周期可以自由设置。
好的,下面是一个简单的AVR单片机PID控制电机的代码,其中使用了Timer1来产生PWM波形,控制电机转速,使用ADC读取电机的当前速度,利用PID算法来调整PWM的占空比,以达到控制电机转速的目的: #include <avr/io.h> #include <avr/interrupt.h> // 定义PID参数 #define Kp 1.0 #define Ki 0.1 #define Kd 0.01 // 定义PID变量 float setpoint = 0.0; float error = 0.0; float last_error = 0.0; float integral = 0.0; float derivative = 0.0; float output = 0.0; // 定义PWM变量 int duty_cycle = 0; // 定义ADC变量 volatile uint16_t adc_value = 0; // 初始化PID void pid_init() { setpoint = 0.0; error = 0.0; last_error = 0.0; integral = 0.0; derivative = 0.0; output = 0.0; } // 计算PID void pid_compute() { // 读取ADC值 adc_value = ADC; // 计算误差 error = setpoint - adc_value; // 计算积分项 integral += error; // 计算微分项 derivative = error - last_error; last_error = error; // 计算PID输出 output = Kp * error + Ki * integral + Kd * derivative; // 限制输出范围 if (output > 255) { output = 255; } else if (output < 0) { output = 0; } // 更新PWM占空比 duty_cycle = (int)output; } // 初始化ADC void adc_init() { ADMUX |= (1 << REFS0); // 使用AVCC作为参考电压 ADCSRA |= (1 << ADEN); // 启用ADC ADCSRA |= (1 << ADIE); // 启用ADC中断 ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // 设置ADC分频系数128,采样率为125kHz } // 初始化PWM void pwm_init() { TCCR1A |= (1 << COM1A1) | (1 << WGM11); // 使用非反转PWM,设置TOP为ICR1 TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS11); // 使用16位PWM,设置分频系数为8 ICR1 = 255; // 设置TOP值为255 } // 初始化定时器 void timer_init() { TCCR0A |= (1 << WGM01); // 设置定时器0为CTC模式 TCCR0B |= (1 << CS02) | (1 << CS00); // 设置定时器0分频系数为1024 OCR0A = 156; // 设置OCR0A为156,即10ms TIMSK0 |= (1 << OCIE0A); // 启用定时器0中断 } // 定时器0中断服务程序 ISR(TIMER0_COMPA_vect) { pid_compute(); // 计算PID OCR1A = duty_cycle; // 更新PWM占空比 } // ADC中断服务程序 ISR(ADC_vect) { // do nothing } // 主程序 int main() { pid_init(); // 初始化PID adc_init(); // 初始化ADC pwm_init(); // 初始化PWM timer_init(); // 初始化定时器 sei(); // 启用全局中断 while (1) { // do nothing } return 0; } 注意:上面的代码仅供参考,PID参数需要根据具体的电机和应用场景进行调整。同时,为了使PID控制更加稳定,需要对采样周期和PWM频率进行合理的设置。
### 回答1: IIC(Inter-Integrated Circuit)是一种串行通信协议,常用于连接微控制器和外设。如果你想在C语言中实现IIC通信,需要使用IIC的控制器(如ATmega328P),并编写相应的代码来初始化控制器并进行数据传输。以下是一个简单的示例代码: #include <avr/io.h> #define F_CPU 16000000UL #define SCL_CLOCK 100000UL void i2c_init() { TWSR = 0x00; TWBR = ((F_CPU/SCL_CLOCK)-16)/2; TWCR = (1<<TWEN); } void i2c_start() { TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); while (!(TWCR & (1<<TWINT))); } void i2c_stop() { TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN); } void i2c_write(uint8_t data) { TWDR = data; TWCR = (1<<TWINT)|(1<<TWEN); while (!(TWCR & (1<<TWINT))); } uint8_t i2c_read_ack() { TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA); while (!(TWCR & (1<<TWINT))); return TWDR; } uint8_t i2c_read_nack() { TWCR = (1<<TWINT)|(1<<TWEN); while (!(TWCR & (1<<TWINT))); return TWDR; } 这个示例代码中,i2c_init函数初始化IIC控制器,i2c_start函数开始IIC通信,i2c_stop函数停止IIC通信,i2c_write函数向IIC设备发送数据,i2c_read_ack函数从IIC设备读取数据并发送ACK信号,i2c_read_nack函数从IIC设备读取数据并发送NACK信号。你可以根据具体需求对这个示例代码进行修改和扩展。 ### 回答2: I2C(Inter-Integrated Circuit)是一种串行通信协议,常用于连接微控制器和外部设备之间的通信。下面是一个用C语言编写的简单的I2C驱动程序示例,主要实现了I2C总线的初始化、发送数据和接收数据的功能。 c #include <stdio.h> #include <stdint.h> #include <stdbool.h> // 定义I2C的地址 #define I2C_ADDRESS 0x08 // 初始化I2C总线 bool i2c_init() { // 设置I2C初始化的代码 // ... return true; } // 发送数据 bool i2c_send_data(uint8_t* data, uint8_t length) { // 启动I2C传输 // ... // 发送数据 for (uint8_t i = 0; i < length; i++) { // 将数据写入发送寄存器 // ... // 等待传输完成 // ... } return true; } // 接收数据 bool i2c_receive_data(uint8_t* data, uint8_t length) { // 启动I2C传输 // ... // 接收数据 for (uint8_t i = 0; i < length; i++) { // 等待数据接收完成 // ... // 从接收寄存器读取数据 // ... // 将数据保存到数组中 data[i] = received_data; } return true; } int main() { // 初始化I2C总线 bool status = i2c_init(); if (status) { uint8_t send_data[] = {0x01, 0x02, 0x03}; uint8_t receive_data[3]; // 发送数据 status = i2c_send_data(send_data, sizeof(send_data)); if (status) { // 接收数据 status = i2c_receive_data(receive_data, sizeof(receive_data)); if (status) { // 打印接收到的数据 for (uint8_t i = 0; i < sizeof(receive_data); i++) { printf("Received data: 0x%02X\n", receive_data[i]); } } } } return 0; } 以上是一个简单的I2C驱动的示例,其中包含了初始化I2C总线、发送数据和接收数据的函数。在主函数中,我们进行了初始化,并发送一些数据,然后接收到的数据打印出来。注意,上述代码只是一个示例,实际使用时需要根据具体的硬件设备和I2C协议进行相应的调整和修改。 ### 回答3: C语言IIC(Inter-Integrated Circuit)驱动程序是用于控制IIC总线的一个重要组成部分。下面是一个简单的C语言IIC驱动程序的示例: c #include <stdio.h> #include <stdbool.h> #include <avr/io.h> //包含了寄存器和位控制宏定义 #define F_CPU 16000000UL //MCU的工作频率 #include <util/delay.h> #define I2C_SCL_DDR DDRD #define I2C_SCL_PORT PORTD #define I2C_SCL_PIN PD0 #define I2C_SDA_DDR DDRD #define I2C_SDA_PORT PORTD #define I2C_SDA_PIN PD1 // 初始化IIC总线 void I2C_init() { I2C_SCL_DDR |= (1 << I2C_SCL_PIN); // 设置SCL引脚为输出 I2C_SDA_DDR |= (1 << I2C_SDA_PIN); // 设置SDA引脚为输出 } // IIC总线开始条件 void I2C_start() { // 发送开始条件 I2C_SDA_DDR |= (1 << I2C_SDA_PIN); // SDA设置为输出 I2C_SDA_PORT |= (1 << I2C_SDA_PIN); // SDA线置高 I2C_SCL_PORT |= (1 << I2C_SCL_PIN); // SCL线置高 _delay_us(4); // 延时4个us,保证开始条件建立 I2C_SDA_PORT &= ~(1 << I2C_SDA_PIN); // SDA线置低 _delay_us(4); // 延时4个us,产生开始条件 I2C_SCL_PORT &= ~(1 << I2C_SCL_PIN); // SCL线置低 } // IIC总线停止条件 void I2C_stop() { // 发送停止条件 I2C_SDA_DDR |= (1 << I2C_SDA_PIN); // SDA设置为输出 I2C_SDA_PORT &= ~(1 << I2C_SDA_PIN); // SDA线置低 I2C_SCL_PORT |= (1 << I2C_SCL_PIN); // SCL线置高 _delay_us(4); // 延时4个us,保证停止条件建立 I2C_SDA_PORT |= (1 << I2C_SDA_PIN); // SDA线置高 _delay_us(4); // 延时4个us,产生停止条件 } // IIC总线发送一个字节 bool I2C_sendByte(unsigned char byteData) { unsigned char i; for (i = 0; i < 8; i++) { // 设置SDA线的状态 if (byteData & 0x80) { I2C_SDA_PORT |= (1 << I2C_SDA_PIN); // SDA线置高 } else { I2C_SDA_PORT &= ~(1 << I2C_SDA_PIN); // SDA线置低 } I2C_SCL_PORT |= (1 << I2C_SCL_PIN); // SCL线置高 _delay_us(2); // 延时2个us,保证数据稳定 I2C_SCL_PORT &= ~(1 << I2C_SCL_PIN); // SCL线置低 byteData <<= 1; // 位移一位 // 检查ACK信号 I2C_SDA_DDR &= ~(1 << I2C_SDA_PIN); // SDA设置为输入 _delay_us(2); // 延时2个us,让SCL线保持低电平 if (I2C_SDA_PORT & (1 << I2C_SDA_PIN)) { // 没有收到ACK信号 return false; } } I2C_SDA_DDR &= ~(1 << I2C_SDA_PIN); // SDA设置为输入 return true; } int main() { I2C_init(); // 初始化I2C总线 I2C_start(); // 发送开始条件 // 发送数据 if (I2C_sendByte(0x55)) { printf("发送成功!\n"); } else { printf("发送失败!\n"); } I2C_stop(); // 发送停止条件 return 0; } 上述驱动代码是使用C语言编写的一个简单的I2C总线驱动程序示例,可以初始化I2C总线、发送开始条件、发送一个字节数据,并检查ACK信号。此示例代码使用了AVR单片机的寄存器和位操作宏,在使用时需要根据具体的硬件平台进行适配调整。 请注意,由于I2C硬件的具体实现会有所不同,因此在实际应用中可能需要对代码进行一些调整和修改。此示例代码仅供参考使用,具体实现细节可能因硬件平台的不同而有所不同。
单片机C语言程序设计实训100例是一种基于AVR Proteus仿真的学习材料,旨在帮助学习者掌握单片机的编程技能。这份材料提供了100个实例,每个实例包含了相关的源代码。 这些实例涵盖了单片机的各个方面,包括输入输出、中断、定时器、串口通信等。每个实例都具有一定的难度,从基础到高级不等,可以逐步提升程序设计的水平。 通过使用AVR Proteus仿真,学习者可以在计算机上进行程序的编写、调试和仿真测试。这种仿真环境可以模拟真实的硬件运行情况,使学习者可以在不使用实际硬件的情况下进行程序的开发和测试,提高学习的便利性和效率。 每个实例的源代码都是以C语言编写的,学习者可以通过阅读和理解源代码来学习相关的编程技巧和知识。在编程过程中,学习者需要了解单片机的工作原理、寄存器的使用方法、中断的实现等相关知识,这有助于他们深入理解单片机的工作机制和编程方法。 通过完成这100个实例的编程练习,学习者不仅可以熟悉单片机的编程方法,还可以提高解决问题的能力和动手实践的能力。同时,学习者还可以通过仿真结果来验证自己的程序设计是否正确,从中发现和解决问题,提高自己的调试和排错能力。 综上所述,单片机C语言程序设计实训100例基于AVR Proteus仿真源代码,是一份帮助学习者掌握单片机编程技能的学习材料。通过完成这份实验,学习者可以提高自己的编程水平和实践能力。
下面是一个用C语言写的LCD1602液晶显示屏初始化程序,适用于常见的16x2字符型液晶屏,该程序使用的是8位数据总线模式,使用AVR单片机进行控制。 #include <avr/io.h> #include <util/delay.h> #define LCD_DATA_PORT PORTB // LCD数据总线接口 #define LCD_DATA_DIR DDRB // LCD数据总线方向寄存器 #define LCD_CTRL_PORT PORTD // LCD控制线接口 #define LCD_CTRL_DIR DDRD // LCD控制线方向寄存器 #define LCD_RS_PIN PD0 // LCD寄存器选择线 #define LCD_RW_PIN PD1 // LCD读写选择线 #define LCD_E_PIN PD2 // LCD使能线 void lcd_init() { // 设置LCD总线接口为输出模式,控制线接口为输出模式 LCD_DATA_DIR = 0xFF; LCD_CTRL_DIR |= (1 << LCD_RS_PIN) | (1 << LCD_RW_PIN) | (1 << LCD_E_PIN); // 初始化时序 LCD_CTRL_PORT &= ~(1 << LCD_RS_PIN); // RS=0,选择指令寄存器 LCD_CTRL_PORT &= ~(1 << LCD_RW_PIN); // RW=0,写入模式 LCD_CTRL_PORT &= ~(1 << LCD_E_PIN); // E=0,禁用液晶屏 _delay_ms(20); // 等待一段时间 // 发送初始化指令 lcd_write_cmd(0x38); // 设置8位数据总线,2行显示,5x7点阵字符 lcd_write_cmd(0x0C); // 关闭光标显示,开启显示,光标不闪烁 lcd_write_cmd(0x01); // 清屏 _delay_ms(2); // 等待一段时间 lcd_write_cmd(0x06); // 光标右移,不移动屏幕 } void lcd_write_cmd(uint8_t cmd) { LCD_CTRL_PORT &= ~(1 << LCD_RS_PIN); // RS=0,选择指令寄存器 LCD_CTRL_PORT &= ~(1 << LCD_RW_PIN); // RW=0,写入模式 LCD_DATA_PORT = cmd; // 写入指令 LCD_CTRL_PORT |= (1 << LCD_E_PIN); // E=1,启用液晶屏 _delay_us(1); // 等待一段时间 LCD_CTRL_PORT &= ~(1 << LCD_E_PIN); // E=0,禁用液晶屏 _delay_us(50); // 等待一段时间 } void lcd_write_data(uint8_t data) { LCD_CTRL_PORT |= (1 << LCD_RS_PIN); // RS=1,选择数据寄存器 LCD_CTRL_PORT &= ~(1 << LCD_RW_PIN); // RW=0,写入模式 LCD_DATA_PORT = data; // 写入数据 LCD_CTRL_PORT |= (1 << LCD_E_PIN); // E=1,启用液晶屏 _delay_us(1); // 等待一段时间 LCD_CTRL_PORT &= ~(1 << LCD_E_PIN); // E=0,禁用液晶屏 _delay_us(50); // 等待一段时间 } void lcd_clear() { lcd_write_cmd(0x01); // 清屏 _delay_ms(2); // 等待一段时间 } void lcd_putc(char c) { lcd_write_data(c); // 写入字符 } void lcd_puts(const char *s) { while (*s) { lcd_putc(*s++); // 逐个写入字符 } } 在程序中,需要根据具体的硬件接口进行修改,比如LCD_DATA_PORT和LCD_DATA_DIR需要修改为实际使用的控制数据线的寄存器和方向寄存器。需要注意的是,该程序中使用了_delay_ms()和_delay_us()函数,需要根据自己的时钟频率进行调整。

最新推荐

使用AVRStudio设置AVR熔丝位及烧写程序.

使用AVRStudio设置AVR熔丝位及烧写程序. 使用AVRStudio设置AVR熔丝位及烧写程序.

avr_pss_kundur程序模型的word说明

该word为我空间中程序的说明,也就是我当年的大作业。论文格式排版。 这是其摘要: 使用MATLAB软件计算参数,在simulink中搭建发电机三阶数学模型,对Kundur单机无穷大系统仿真。单机无穷大系统分别采用恒定励磁控制...

用avr单片机实现频率计

本程序的硬件环境是avr单片机,软件环境是ICC集成开发环境,最终实现的是对输入信号的频率的测量即频率计。

AVR单片机GCC程序设计.pdf

AVR单片机GCC程序设计.pdf AVR单片机GCC程序设计.pdf AVR单片机GCC程序设计.pdf AVR单片机GCC程序设计.pdf AVR单片机GCC程序设计.pdf AVR单片机GCC程序设计.pdf

ad5300 程序 avr单片机

这是ad5300 程序,其中用的主机是 avr单片机 绝对好用的~ 大家有兴趣的可以参考呀

代码随想录最新第三版-最强八股文

这份PDF就是最强⼋股⽂! 1. C++ C++基础、C++ STL、C++泛型编程、C++11新特性、《Effective STL》 2. Java Java基础、Java内存模型、Java面向对象、Java集合体系、接口、Lambda表达式、类加载机制、内部类、代理类、Java并发、JVM、Java后端编译、Spring 3. Go defer底层原理、goroutine、select实现机制 4. 算法学习 数组、链表、回溯算法、贪心算法、动态规划、二叉树、排序算法、数据结构 5. 计算机基础 操作系统、数据库、计算机网络、设计模式、Linux、计算机系统 6. 前端学习 浏览器、JavaScript、CSS、HTML、React、VUE 7. 面经分享 字节、美团Java面、百度、京东、暑期实习...... 8. 编程常识 9. 问答精华 10.总结与经验分享 ......

无监督视觉表示学习中的时态知识一致性算法

无监督视觉表示学习中的时态知识一致性维信丰酒店1* 元江王2*†马丽华2叶远2张驰2北京邮电大学1旷视科技2网址:fengweixin@bupt.edu.cn,wangyuanjiang@megvii.com{malihua,yuanye,zhangchi} @ megvii.com摘要实例判别范式在无监督学习中已成为它通常采用教师-学生框架,教师提供嵌入式知识作为对学生的监督信号。学生学习有意义的表征,通过加强立场的空间一致性与教师的意见。然而,在不同的训练阶段,教师的输出可以在相同的实例中显著变化,引入意外的噪声,并导致由不一致的目标引起的灾难性的本文首先将实例时态一致性问题融入到现有的实例判别范式中 , 提 出 了 一 种 新 的 时 态 知 识 一 致 性 算 法 TKC(Temporal Knowledge Consis- tency)。具体来说,我们的TKC动态地集成的知识的时间教师和自适应地选择有用的信息,根据其重要性学习实例的时间一致性。

create or replace procedure这句语句后面是自定义么

### 回答1: 是的,"create or replace procedure"语句后面应该跟着自定义的存储过程名。例如: ```sql create or replace procedure my_procedure_name ``` 这里"my_procedure_name"是你自己定义的存储过程名,可以根据具体需求进行命名。 ### 回答2: 不完全是自定义。在Oracle数据库中,"CREATE OR REPLACE PROCEDURE"是一条SQL语句,用于创建或替换一个存储过程。关键词"CREATE"表示创建新的存储过程,关键词"OR REPLACE"表示如果该存储过程

数据结构1800试题.pdf

你还在苦苦寻找数据结构的题目吗?这里刚刚上传了一份数据结构共1800道试题,轻松解决期末挂科的难题。不信?你下载看看,这里是纯题目,你下载了再来私信我答案。按数据结构教材分章节,每一章节都有选择题、或有判断题、填空题、算法设计题及应用题,题型丰富多样,共五种类型题目。本学期已过去一半,相信你数据结构叶已经学得差不多了,是时候拿题来练练手了,如果你考研,更需要这份1800道题来巩固自己的基础及攻克重点难点。现在下载,不早不晚,越往后拖,越到后面,你身边的人就越卷,甚至卷得达到你无法想象的程度。我也是曾经遇到过这样的人,学习,练题,就要趁现在,不然到时你都不知道要刷数据结构题好还是高数、工数、大英,或是算法题?学完理论要及时巩固知识内容才是王道!记住!!!下载了来要答案(v:zywcv1220)。

基于对比检测的高效视觉预训练

10086⇥⇥⇥⇥基于对比检测的高效视觉预训练Ol i vierJ. He´naf f SkandaKoppula Jean-BaptisteAlayracAaronvandenOord OriolVin yals JoaoCarreiraDeepMind,英国摘要自我监督预训练已被证明可以为迁移学习提供然而,这些性能增益是以大的计算成本来实现的,其中最先进的方法需要比监督预训练多一个数量级的计算。我们通过引入一种新的自监督目标,对比检测,任务表示与识别对象级功能跨增强来解决这个计算瓶颈。该目标可提取每幅图像的丰富学习信号,从而在各种下游任务上实现最先进的传输精度,同时需要高达10少训练特别是,我们最强的ImageNet预训练模型的性能与SEER相当,SEER是迄今为止最大的自监督系统之一,它使用了1000多个预训练数据。最后,我们的目标无缝地处理更复杂图像的预训练,例如COCO中的图像,缩小了从COCO到PASCAL的监督迁移学习的差距1. 介绍自从Al