基于ATMEGA16单片机的空调控制器

news2024/11/27 8:23:53

点击链接获取Keil源码与Project Backups仿真图:
https://download.csdn.net/download/qq_64505944/87853101
在这里插入图片描述

源码获取
在这里插入图片描述

主要内容:
本系统采用AVR单片机实现汽车空调的自动控制(双位控制),具有电路结构简单、分立元件少、系统界面友好、操作简单等优点,能满足一般精度要求的公交车空调的自动控制。
基本要求:
1、认真完成系统需求分析,明确数据要求和处理要求;
2、设计出系统的概念模型,画出系统流程图;
3、设计的硬件电路图与程序流程图;
4、源程序代码;
5、系统运行结果符合课程设计要求;
主要参考资料:
[1]王幸之,钟爱琴,王雷,王闪 《AT89系列单片机原理与接口技术》 北京航空航天大学出版社 2004
[2]周爱武,汪海威,肖云.数据库课程设计[M].北京:机械工业出版社,2016
[3]李光才,楼然笛《单片机课程设计实例指导》北京航空航天大学出版社,2017.

完 成 期 限
指 导 教师签名
课程负责人签名
摘要
近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
而51系列单片机是各单片机中最为典型和最有代表性的一种,通过本次课程设计进一步对单片机学习和应用,从而更熟悉单片机的原理和相关设计并提高了开发软、硬件的能力。本设计主要设计一个基于80C51单片机的空调控制电路,并在LED上显示控制的结果,通过两个控制键和4x4键盘来实现时间的调节功能。应用Proteus软件实现单片机空调控制系统系统的设计与仿真。
关 键 词:单片机;空调控制;LED

目录
摘要 III
1 概述 2
1.1 课程设计选题 2
1.2 项目背景 2
1.3课程设计环境 2
2 工作原理 3
2.1 热电阻温度采集 3
2.2 运行状态显示 5
2.3 继电器控制 7
2.4 键盘输入 8
2.5 风向步进电机控制 9
3 仿真 11
4 详细设计 12
总结 25
参考文献 26

	1 概述

1.1 课程设计选题
本次课程设计我选的题目是空调控制电路。
1.2项目背景
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中空调控制电路就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。仿真测试时对空调进行控制
1.3课程设计环境
Atmega16是美国ATMEL公司的高档8位单片机,采用Flash存储器,可以擦写10000次以上、内部集成、四通道PWM、集成8路10位精度ADC、片内经过标定的RC振荡器、采用精简指令集,具有32个通用工作寄存器,具有只需两个时钟周期的硬件乘法器,运算速度快等。由于其集成度高、处理速度快,使得利用AVR单片机进行系统开发只需很少(甚至没有)的外部器件即可实现强大的功能,逐渐在各种场合得到广泛应用,取代其它8位单片机。利用它来开发汽车空调控制系统,只需热电阻、液晶显示模块和一些继电器及其驱动芯片即可实现。

2 工作原理
本系统可以分为五大部分:热电阻温度采集、运行状态显示、继电器控制、键盘输入、风向步进电机控制。

2.1 热电阻温度采集
热电阻传感器以其温度特性稳定、测量精用。
采用Pt1000热电阻作为温度传感器的测量电路原理图如图1 所示。热电阻Rt与三个电阻接成电桥。当温度变化时,使得运算放大器的同相输入端的电位发生变化,经过运算放大器放大之后输入到Atmega16单片机进行AD转换。由于单片机采用5V电压作为ADC的参考电源,而电桥在温度变化为0~100°C时,输出电压范围为0~0.7V,所以确定运算放大电路的放大倍数为7,以获得最佳的测量结果。运算放大电路的电阻按以下公式确定:

取。输出电压变化范围大致是0~5V。
由于ADC的转换精度为10,故当输入电压为5V时,其采样值为1023,根据电桥平衡原理,可得到以下公式:
(1)
其中,N——ADC数据寄存器的值,
U——电桥电源电压,
——Pt1000在0°C时的电阻1000。
Pt1000热电阻的阻值按以下公式计算::
(2)
Rt——温度为t时铂热电阻的电阻值,Ω;
t——温度,℃;
——Pt1000在0°C时的电阻1000。
A——分度常数,A=0.0038623139728
B——分度常数,B=-0.00000065314932626
用Visual Basic.Net根据以上公式(1)、(2)生成用N来查找温度t的程序表格,其代码如下:
Private Sub Pt1000()
Me.Cursor = Cursors.WaitCursor
txtTab.Clear()
Dim U As Integer = 9 '电桥电源电压
'热电阻0度时的电阻值
Dim Pt1000_R0 As Integer = 1000
Dim n As Integer
Dim sngT As Single
Dim sngRt As Single
txtTab.AppendText(“const float Pt1000Tab[]={” & Chr(13) & Chr(10))
For n = 0 To 1023
sngRt = (10000 * n + 7161000 * U) / (7161 * U - 10 * n)
sngT = (-const_A + Sqrt(const_A ^ 2 - 4 * const_B * (1 - sngRt / Pt1000_R0))) / (2 * const_B)
If n < 1023 Then txtTab.AppendText(Format(Abs(sngT), “0.0”) & ", /* " & n & " /")
Else txtTab.AppendText(Format(Abs(sngT), “0.0”) & " /
" & n & " /" & Chr(13) & Chr(10) & “};”)
End If
If n Mod 5 = 0 Then
txtTab.AppendText(Chr(13) & Chr(10))
End If
Next
txtTab.SelectAll()
txtTab.Copy()
Me.Cursor = Cursors.Default
End Sub
生成的程序常数表格(1024个值)部分如下:
const float Pt1000Tab[]={
0.0, /
0 / 0.1, / 1 /0.2, / 2 /0.2,
……
63.4, /
696 /63.5, / 697 /
……
99.3, /
1022 /99.4 / 1023 */
};
图1 Pt1000热电阻温度测量电路
2.2 运行状态显示
本系统采用一块16×4的字符型液晶模块,这种类型的LCD应用很广泛,其控制驱动主芯片为HD44780及其扩展驱动芯片HD44100(或兼容芯片),少量阻、容元件,结构件等装配在PCB板上而成。字符型液晶显示模块目前在国际上已经规范化,无论显示屏规格如何变化,其电特性和接口形式都是统一的。因此只要设计出一种型号的接口电路,在指令设置上稍加改动即可使用各种规格的字符型液晶显示模块。odeVisionAVR集成开发环境集成这种类型LCD的函数,可方便实现LCD的读写,其部分函数及功能简单介绍如下,更详细的资料可查阅各种文献。
函数原型:void lcd_init(unsigned char lcd_columns)
功能:初始化LCD模块,清屏并把显示坐标设定在0 列0 行。LCD模块的列必须指定(例如:16)。这时不显示光标。在使用其它高级LCD函数前,必须先调用此函数。
函数原型:void lcd_clear(void)
功能:清屏并把显示坐标设定在0 列0 行。
函数原型:void lcd_gotoxy(unsigned char x, unsigned char y)
功能:设定显示坐标在x 列y行。列、行。
函数原型:void lcd_putchar(char c)
功能:在当前坐标显示字符c 。
函数原型:void lcd_puts(char *str)
功能:在当前坐标显示SRAM 中的字符串str 。
函数原型:void lcd_putsf(char flash *str)
功能:在当前坐标显示FLASH 中的字符串str 。
在对LCD进行写入显示数据之前,需要对它进行初始化,设定显示参数。
#include <lcd.h>
/使用PORTB连接LCD模块/
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
void main(void){
//定义字符数组
uchar arr[5];
//初始化,指定列数为16
lcd_init(16);
//设定显示坐标为(0,1)
lcd_gotoxy(0,1);
/在(0,1)显示字符串,注意:此字符串存储在Flash只读存储器中/
lcd_putsf(“Run Mode:”);
/*调用“浮点数转换成字符串”函数,
函数原型:void ftoa(float n, unsigned char decimals, char str)
data为浮点数
/
ftoa(data,1,arr);
//设定显示坐标为(0,2)
lcd_gotoxy(0,2);
//显示RAM中字符串数组arr的内容
lcd_puts(arr);
while(1);
}
2.3 继电器控制
Atmega16输出缓冲器具有对称的驱动特性,可以输出和吸收大电流,直接驱动LED,但是仍然不能直接驱动更大电流的器件,如继电器,所以必须接入较大功率的驱动器。常用的驱动方法有74系列功率集成电路驱动、MOC系列光耦合过零触发双向晶闸管驱动、固态继电器驱动等。
本系统采用ULN2003芯片来驱动继电器。其内部结构如图2所示。
ULN2003是达林顿阵列,是专门用来驱动继电器的芯片,甚至在芯片内部做了一个消线圈

图2 ULN2003内部结构图
反电动势的二极管。ULN2003的输出端允许通过IC 电流200mA,饱和压降VCE 约1V左右,耐压BVCEO 约为36V。采用集电极开路输出,输出电流大,故可以直接驱动继电器或固体继电器(SSR)等外接控制器件,也可直接驱动低压灯泡,共可以驱动7路,减少了电路板的连线数量,成本较低,广泛应用于各种工控板,其驱动原理如图3所示。

图3 驱动原理
压缩机离合器继电器采用RS触发器和ULN2003一起控制,这样做的好处是:当单片机受到外界干扰而不断复位或看门狗超时复位时,保证压缩机始终处于开启或关闭状态,有助于延长压缩机的寿命。
2.4 键盘输入
本系统采用3×3矩阵式键盘。通过键盘可以控制系统工作方式(关闭、送风、制冷)、风向步进电机(水平送风、倾斜送风、扫风)、温度设定等。
键盘的行由PD0、PD1、PD2(使能内部上拉电阻)控制,而列则由PC3、PC4、PC5控制,如图4所示。采用程序扫描的方式识别键码,其工作过程如下:
(1)判断键盘中有无键按下。通过以下代码实现:
PORTC&=~0x20;
if((PIND&0x07)!=0x07) {//……}
首先置PC5为“0”,再判断PD0、PD1、PD2是否都为“1”。如果全为“1”,则表明第3列无键按下,否则有键按下,进入消除抖动程序;再置PC4为“0”,再判断PD0、PD1、PD2是否都为“1”。如果全为“1”,则表明第2列无键按下,否则有键按下,进入消除抖动程序;再置PC3为“0”,再判断PD0、PD1、PD2是否都为“1”。如果全为“1”,则表明第1列无键按下,否则有键按下,进入消除抖动程序。

图4 3×3矩阵式键盘
(2),消除抖动。当发现有键按下时,延时一段时间再判断键盘状态,若仍有键保持按下状态,则可以确定有键按下,否则认为是抖动。通过以下代码实现:
delay();
if((PIND&0x07)!=0x07) {//……}
(3)判断键码。以下是识别为“Key2-3”( 第2行第3列)的程序代码,其它按健类似。
if((PIND&0x07)==0x05)
{ // Key 2-3
// uchar key_num[]=“K23”;
// 等待按键释放
while((PIND&0x07)0x05);
//判断换气风机是否在运行
if(ventilator_state
1)
{
ventilator_state=0;
//关闭换气风机
stop_ventilator();
//在LCD上的(12,3)显示“OFF” lcd_gotoxy(12,3);
lcd_putsf(“OFF”);
}
else
{
ventilator_state=1;
//开启换气风机
start_ventilator();
//在LCD上的(12,3)显示“Run”
lcd_gotoxy(12,3);
lcd_putsf(“Run”);
}
return;//识别完毕,返回主程序
}
2.5 风向步进电机控制
Atmega16的定时器能够输出PWM,编程简单,精度高。编程让定时器2工作于相位可调模式,产生高精度的PWM波形输出,调节占空比,以达到控制步进电机不同转角的目的。初始化设置如下:
ASSR=0x00;
/* 相位可调PWM模式,比较匹配时清零OC2,计数为0xff时置位OC2 */
TCCR2=0x64;
TCNT2=0x00;
OCR2=0x00;
TIMSK=0x80; //使能匹配中断

图5 相位可调PWM 模式的时序图

图6 水平送风模式下的PWM波形

图7 倾斜送风模式下的PWM波形

图7 换气风机、压缩机、蒸发器风机处于工作状态

3 仿真
Proteus是目前最好的模拟单片机及外围器件的仿真软件,可以仿真51系列、AVR,PIC等常用的MCU及其外围电路,如LED、LCD、RAM、ROM、键盘、马达、继电器、AD/DA、部分SPI器件、部分器件、74系列、 COMS 4000系列芯片等。利用Proteus可以大大提高开发效率、降低投资,在没有硬件的情况下让开发人员能像Pspice仿真模拟/数字电路那样仿真MCU及外围电路。Proteus提供的可调电阻是“十级可调”而不是“无级可调”,所以本系统采用三个可调电阻模拟Pt1000热电阻,以实现“粗调”、“中调”、“细调”,更真实反映热电阻阻值的细微变化。

图8 LCD显示结果

4 详细设计
具体代码:

#include <mega16.h> 
#include <stdlib.h> 
#include "Pt1000Tab.h"
#include "inc.h"

#asm
   .equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>

bit boolean;   
uchar ventilator_state; 
uchar fan;  
uchar blow; 
uchar run_mode;
uchar temp;
uchar setting_value;
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
//产生PWM,控制步进电机
if (fan==1)
{
   OCR2=64;
}
else if(fan==2)
{
   OCR2=128;
}
}
#define FIRST_ADC_INPUT 0  
#define LAST_ADC_INPUT 1    //最后一通道 ,最大值为7,共8个通道
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
#define ADC_VREF_TYPE 0x40
// ADC中断服务程序
// 自动扫描模拟量输入端口,
interrupt [ADC_INT] void adc_isr(void)
{
register static unsigned char input_index=0;
// 读取转换结果
adc_data[input_index]=ADCW;
// 选择转换通道
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
   input_index=0;
ADMUX=(FIRST_ADC_INPUT|ADC_VREF_TYPE)+input_index;
//启动AD转换
ADCSRA|=0x40;
}
void main(void)
{
float current_temp;//保存当前温度
// Port A 初始化
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x38;
DDRC=0x38;
PORTD=0x1f;
DDRD=0xF8;
ASSR=0x00;
TCCR2=0x64;
TCNT2=0x00;
OCR2=0x00;
ACSR=0x80;
SFIOR=0x00;
ADMUX=FIRST_ADC_INPUT|ADC_VREF_TYPE;
ADCSRA=0xEE;
SFIOR&=0x1F;
lcd_init(16);
#asm("sei")
dis_character(); 
setting_value=25; 
run_mode=0; 
ventilator_state=0;
lcd_gotoxy(12,3); 
lcd_putsf("OFF");  
while (1)
      {    
        scan_key();  //扫描键盘
        blow_mode(); //设定送风方式
        display();   //显示状态参数
        if(run_mode==2)
        {   
            current_temp=Pt1000Tab[adc_data[0]];
            if (current_temp<setting_value)
            {       
              stop_compressor(); 
              //lcd_gotoxy(10,1); 
              //lcd_putsf("Blast");          
            }
            else
            {
              start_compressor();   
              //lcd_gotoxy(10,1); 
              //lcd_putsf("Cool");     
            }        
             
       }
      }                         
}
void start_compressor(void){
  //Start
  PORTD|=0x18;
  PORTD&=~0x10; 
  PORTD|=0x18; 
}
void stop_compressor(void){
  //Stop
  PORTD|=0x18; 
  PORTD&=~0x08; 
  PORTD|=0x18; 
}
void start_ventilator(void) {
  PORTD|=0x40;//换气风机运行
}
void stop_ventilator(void){
  PORTD&=~0x40;//换气风机停止
} 
void start_evaporator_fan(void){
  PORTD|=0x20;//蒸发器风机运行
}
void stop_evaporator_fan(void){
  PORTD&=~0x20;//蒸发器风机停止
} 
/*---------------------------键盘扫描--------------------------*/
void scan_key(void){
/* 
   K11    K12     K13
   K21    K22     K23 
   K31    K32     K33 
 */
 
 //K13 K23 K33  
PORTC&=~0x20; 
if((PIND&0x07)!=0x07) 
{   
   delay();
   if((PIND&0x07)!=0x07) 
   {    
        if((PIND&0x07)==0x06) 
        {  //Key 3-3  
          //uchar key_num[]="K33"; 
          while((PIND&0x07)==0x06);
          switch(blow)
          {
            case 0:
            {
              blow=1;
              lcd_gotoxy(10,2); 
              lcd_putsf("Mode0");
              break;        
            }
            case 1:
            {
              blow=2; 
              lcd_gotoxy(10,2); 
              lcd_putsf("Mode1");
              break;        
            } 
            case 2:
            {
              blow=3;
              lcd_gotoxy(10,2); 
              lcd_putsf("Mode2");              
              break;        
            } 
            case 3:
            {
              blow=0;
              lcd_gotoxy(10,2); 
              lcd_putsf("Mode3");
              break;        
            }                                        
          }
          return;
        }
        if((PIND&0x07)==0x05) 
        {  //Key 2-3   
           //uchar key_num[]="K23";           
           while((PIND&0x07)==0x05); 
                       
           if(ventilator_state==1)
           {
              ventilator_state=0;
              stop_ventilator();
              lcd_gotoxy(12,3); 
              lcd_putsf("OFF");             
           }
           else
           {
              ventilator_state=1;
              start_ventilator(); 
              lcd_gotoxy(12,3); 
              lcd_putsf("Run");                
           }           
           return;
        }
        if((PIND&0x07)==0x03) 
        {  //Key 1-3           
          //uchar key_num[]="K13"; 
          while((PIND&0x07)==0x03); 
          switch(run_mode)
          {
            case 2:
            { //关闭模式 
              stop_evaporator_fan();
              stop_compressor();  
              lcd_gotoxy(10,1); 
              lcd_putsf("OFF  "); 
              run_mode=0;
              break; 
            }
            case 0:
            {
              //送风模式  
              start_evaporator_fan();
              stop_compressor(); 
              lcd_gotoxy(10,1); 
              lcd_putsf("Blast");
              run_mode=1; 
              break;       
            }        
            case 1:
            {
              //制冷模式
              start_evaporator_fan();
              start_compressor(); 
              lcd_gotoxy(10,1); 
              lcd_putsf("Cool ");              
              run_mode=2;
              break;           
            }
          } 
 
          return;
        }   
   }      
}

PORTC|=0x20;

 //K12 K22 K32
PORTC&=~0x10; 
if((PIND&0x07)!=0x07)
{
        if((PIND&0x07)==0x06) 
        {  //Key 3-2
           //uchar key_num[]="K32";
           while((PIND&0x07)==0x06);
           return;
        }
        if((PIND&0x07)==0x05) 
        {  //Key 2-2
           //uchar key_num[]="K22";
           while((PIND&0x07)==0x05);
           if (setting_value<=18)
           {
              setting_value=18;
           } 
           else
           {
              setting_value--;
           }
 
           return;
        }
        if((PIND&0x07)==0x03) 
        {  //Key 1-2
           //uchar key_num[]="K12";
           while((PIND&0x07)==0x03);
           if (setting_value>=28)
           {
              setting_value=28;
           } 
           else
           {
              setting_value++;
           }
           return;
        }
}

PORTC|=0x10;
 //K11 K21 K31
PORTC&=~0x08; 
if((PIND&0x07)!=0x07) 
{   
   delay();
   if((PIND&0x07)!=0x07) 
   {    
        if((PIND&0x07)==0x06) 
        {  //Key 3-1  
          //uchar key_num[]="K31"; 
          while((PIND&0x07)==0x06);
          return;
        }
        if((PIND&0x07)==0x05) 
        {  //Key 2-1   
           //uchar key_num[]="K21";           
           while((PIND&0x07)==0x05); 
           return;
        }
        if((PIND&0x07)==0x03) 
        {  //Key 1-1           
           //uchar key_num[]="K11"; 
           while((PIND&0x07)==0x03);  
          return;
        }   
   }      

}
PORTC|=0x08;

}
void blow_mode(void){
switch(blow)
{
  case 0:
  { 
    fan=0;
    break;
  }     
  case 1:
  {
    fan=1;
    break;
  } 
  case 2:
  { 
    fan=2;
    break;
  }  
  case 3:
  {
    temp++;
    if(temp==5)
    {
      boolean=~boolean;          
    }
    if (boolean==1)
    {
      fan=1;
    }
    else
    {
      fan=2;
    }  
    break;
  }      
}
} 
void delay(void){
uint i,j;
for (i=0;i<10;i++)
  { 
  for (j=0;j<10;j++)
     {}
  }
}
void dis(uchar channel,uchar x,uchar y){
   uchar arr[5];  
   ftoa(Pt1000Tab[adc_data[channel]],1,arr);
   lcd_gotoxy(x,y); 
   lcd_puts(arr); 
} 
void display(void){  
   uchar setting[3];
   dis(0,2,0);
   itoa(setting_value,setting);
   lcd_gotoxy(12,0); 
   lcd_puts(setting); 
}
void dis_character(void){   
   lcd_gotoxy(0,0); 
   lcd_putsf("T:"); 
   
   lcd_gotoxy(8,0); 
   lcd_putsf("Set:");    
   
   lcd_gotoxy(0,1); 
   lcd_putsf("Run  Mode:");  
   lcd_gotoxy(10,1); 
   lcd_putsf("OFF  "); 

   lcd_gotoxy(0,2); 
   lcd_putsf("Blow Mode:"); 
    
   lcd_gotoxy(10,2); 
   lcd_putsf("Mode0");  
   
   lcd_gotoxy(0,3); 
   lcd_putsf("Ventilator:");     
}
#define uint unsigned int
#define uchar unsigned char  
#define ulong unsigned long

void blow_mode(void);
void start_compressor(void);
void stop_compressor(void); 
void start_ventilator_fan(void);
void stop_ventilator_fan(void); 
void start_evaporator_fan(void);
void stop_evaporator_fan(void); 
void dis(uchar channel,uchar x,uchar y);
void display(void);
void delay(void);
void scan_key(void); 
void dis_character(void);
 

总结
《单片机》这门课程我已经学了一个学期了,在这一个学期的学习过程中,我一开始不怎么懂得编程,但慢慢的我现在已经不仅会读程序还会写程序了。真为自己一个学期来努力学到的单片机知识只是而感到高兴。怎么学单片机?也常看到有人说学了好几个月可就是没有什么进展。当然,受限于每个人受到的教育水平不同和个人理解能力的差异,学习起来会有快慢之分,但我感觉最重的就是学习方法。一个好的学习方法,能让你事半功倍,这里说说我学习单片机的经历和方法。我觉得学习单片机首先要懂得C语言,因为单片机大多说都是靠程序来实现的,如果看不懂程序或则不懂的编程是很难学会单片机的。学习单片机首先要明白一个程序是怎么走的,要完全懂得程序每一个步骤的意思。其次要懂得每一条指令的意思,不能盲目地去靠背指令,这是记得不牢靠的,最主要的还是靠了解。学习单片机最主要的对89C51芯片内部结构有全方面的,只要了解了89C51才能知道单片机实现什么样的功能和作用,才能对单片机有更深一步的了解。通过一个学期《单片机》这门课程的学习,我对单片机也有了一些理解。 在本次单片机课程设计中,使我对单片机的认识有了更深刻的理解。系统以51单片机为核心部件,利用汇编软件编程,通过键盘控制和数码管显示实现了基本功能,能实现本设计题目的基本要求和发挥部分。由于于时间有限和本身知识水平的限制,本系统还存在一些不够完善的地方,在接下来的学习中应该努力改善。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【大数据基石】Hadoop环境搭建

文章目录 前言配置hosts关闭防火墙配置SSH免密下载Hadoop解压Hadoop到指定目录添加环境变量修改Hadoop配置文件core-site.xmlhdfs-site.xmlyarn-site.xmlmapred-site.xmlworkershadoop-env.sh 其他2台服务器也这样配置初始化NameNode启动hdfs启动Yarn启动历史记录服务器 ✨这里…

[中间件漏洞]tomcat漏洞复现

目录 Tomcat 远程代码执行漏洞&#xff08;CVE-2017-12615&#xff09; 漏洞描述 漏洞原理 漏洞复现 漏洞修复 tomcat弱口令&war远程部署 漏洞原理 漏洞复现 漏洞修复 Apache Tomcat文件包含漏洞(CVE-2020-1938&#xff09; 漏洞复现 漏洞修复 Tomcat 远程代码执行漏洞…

ffmpeg之AVFormatContext详细解释

AVFormatContext 作用 AVFormatContext主要起到了管理和存储媒体文件相关信息的作用。它是一个比较重要的结构体&#xff0c;在FFmpeg中用于表示媒体文件的格式上下文&#xff0c;其中包含了已经打开的媒体文件的详细信息&#xff0c;包括媒体文件的格式、媒体流的信息、各个媒…

1 行代码开启「密钥检测」,给敏感数据加上防护锁

&#x1f4a1; 近日&#xff0c;在「DevSecOps 软件安全开发实践」课程上&#xff0c;极狐(GitLab) 高级专业服务交付工程师韩飞、极狐(GitLab) 前端工程师任治桐&#xff0c;分享了密钥检测的背景、应用及处理&#xff0c;并演示了极狐GitLab 密钥检测功能&#xff0c;快用 1 …

视频文件损坏无需再苦恼!快速修复方法分享!

如今录制视频或者从互联网下载视频都很简单&#xff0c;这些视频可以从笔记本电脑、电视甚至智能手机上用于观看或上传到自媒体平台/社交平台。 但视频有时会出现损坏的问题&#xff0c;导致视频无法正常播放&#xff0c;出现这种情况怎么办&#xff1f; 导致视频文件损坏的原…

家居购项目 1.分页导航 2.购物车 3.订单生成

文章目录 &#x1f400;Java后端经典三层架构&#x1f407;MVC模型&#x1f407;开发环境搭建&#x1f407;会员注册&#x1f333;前端验证用户注册信息&#x1f333;思路分析&#x1f349;创建表&#x1f349;创建实体类&#x1f349;DAO&#x1f34c;MemberDAOImpl &#x1f…

怎么编辑pdf里面的文字?好用工具分享

PDF文件是一种非常常见的电子文档格式&#xff0c;它具有通用性、易分享、易打印的特点&#xff0c;因此广泛应用于各个领域中。然而&#xff0c;PDF文件通常是只读的&#xff0c;如果需要修改其中的文字&#xff0c;就需要使用专业的PDF编辑软件或者在线编辑工具。 市场上有很…

cuda编程学习——原子函数(十)

前言 参考资料&#xff1a; 高升博客 《CUDA C编程权威指南》 以及 CUDA官方文档 CUDA编程&#xff1a;基础与实践 樊哲勇 文章所有代码可在我的GitHub获得&#xff0c;后续会慢慢更新 文章、讲解视频同步更新公众《AI知识物语》&#xff0c;B站&#xff1a;出门吃三碗饭 …

文心一言 VS 讯飞星火 VS chatgpt (28)-- 算法导论5.1 3题

三、假设你希望以1/2的概率输出0与 1。你可以自由使用一个输出0或1的过程 BIASED-RANDOM。它以某概率 p 输出1&#xff0c;概率 1-p 输出0&#xff0c;其中 0<p<1 &#xff0c;但是 p 的值未知。请给出一个利用 BIASED-RANDOM 作为子程序的算法&#xff0c;返回一个无偏的…

pwm led

PWM Dimming (脉冲宽度调制) 调光——是一种利用简单的数字脉冲&#xff0c;反复开关灯光LED驱动器的调光技术。通过程序控制输出宽、窄不同的数字式脉冲&#xff0c;即可简单地实现改变输出电流&#xff08;电压&#xff09;&#xff0c;从而调节LED灯的亮度。 当PWM不是满占空…

真无线蓝牙耳机哪个牌子好用?六款真无线蓝牙耳机品牌推荐

无论我们是看视频还是在路上听音乐&#xff0c;真无线蓝牙耳机可以丰富我们的一天。然而&#xff0c;问题是有太多的选择&#xff0c;许多人不知道哪一款的性价比高音质好&#xff0c;下面小编特意整理了一期性价比高音质好的蓝牙耳机。 第一款&#xff1a;南卡小音舱lite2 蓝…

运维小白必学篇之基础篇第一集:Linux相关命令实验

Linux相关命令实验 实验者&#xff1a;胡 阳 命令提示符 【rootlocalhost ~】# 【当前登录系统的用户主机名 当前工作目录】提示符 &#xff08;# 表示 管理员&#xff09; &#xff08;&#xff04; 表示 普通用户&#xff09; 基本格式&#xff1a;命令 【选项】 【…

一文带你学习前端 - 自动化测试

theme: devui-blue 前端自动化测试 1. 自动化测试基本概念介绍 前言 一般我们实现功能&#xff0c;基本都是两部分写代码&#xff0c;调试/测试。写代码和测试的时间&#xff0c;基本都是55分。如果是测试逻辑&#xff0c;可能要打一下log&#xff0c;或者打断点去调试。测…

行业报告 | 工业机器视觉深度报告——兼具高成长和成熟技术的AI应用赛道

原创 | 文 BFT机器人 01 核心要点 核心观点: 工业机器视觉是高技术壁垒、商业模式成熟、国产替代迅速、行业快速发展的优秀赛道。行业端&#xff1a;3C电子是最主要的行业&#xff0c;新能源行业增速最快&#xff0c;受益于质量管控政策和行业高增速。技术端&#xff1a;大模型…

让工作效率提升10倍:十大AIGC工具评测

AI技术的普及已经在近年来不断增长。这种技术已经改变了我们与电脑的互动方式&#xff0c;让我们能够更高效、更自然地完成任务。本文将展示10个基于ChatGPT和GPT-3 AI模型构建的最强大的资源&#xff0c;使您更容易充分利用它们的潜力。因此&#xff0c;如果您想利用AI技术改进…

DiscoTOC - 自动内容表格

示例 桌面 移动终端 特性 toc table of contents&#xff08;内容列表&#xff09; 通过菜单上面的设置按钮&#xff0c;根据当前内容的状况一键生成 toc 列表Toc 将会一直在页面中尽显显示 —— 滚动内容与 topic 的链接是同步的当你滚动过当前页面中中的主题的时候&#…

Python numpy - 数组的创建与访问

目录 一 数组array的创建途径 1 列表list 2 函数array 3 函数arange 4 函数zeros 5 函数eyes 6 随机函数randn/ randint 二 数组array的访问 1 访问形状/元素个数/数据类型 2 访问一维数组的位置/范围 3 访问二维数组的位置/范围 4 用&#xff1a;访问二维数组的…

美国餐饮连锁集团【CAVA Group】申请纽交所IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;来自美国的餐饮连锁集团【CAVA Group】近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纽交所IPO上市&#xff0c;股票代码为(CAVA) &#xff0c;CAVA Group…

基于SSM的疫情物资管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

公民开发者学习无代码编程,从CRUD开始

目录 1 创建数据表2 创建新增页面3 新增功能开发4 预览总结 自从Forrester2014年提出低代码的概念后&#xff0c;对于编程人员重新进行了划分。使用传统开发工具&#xff0c;使用代码进行编程的叫专业开发人员。使用低代码或者无代码开发工具&#xff0c;作为企业内部的人员&am…