基于51单片机的简易电子秤

首先看看题目要求:

                            

1.方案论证

(1)压力传感器的论证与选择

方案一:采用惠更斯电桥,当电阻应变片承受载荷产生变形时,其阻值将发生变化。从而使电桥失去平衡,产生相应的差动信号,但其线性度不理想。

方案二:采用全桥电路,此电路对压力的灵敏度比惠更斯电桥增加一倍以上,测量的精度将更加准确,线性度更好。还具有机械滞后小、横向效应小以及体积小的特点。

通过上述两种方案比较,全桥差动压力传感器符合设计要求,称重范围为0~5Kg,满足题目要求的5g~500g的测量范围。

(2) A/D 转换模块的选取

方案一:采用分立元件构成的仪用放大电路对电阻应变式传感器输出的模拟信号进行放大,然后外接高精度的A/D模块将模拟信号转换成数字信号送给单片机进行处理。

方案二:采用集成芯片HX711,其内部PGA和24位A/D,放大倍数可以在128和64两档中选择,24位的精度足够准确的分辨出题设中1g的精度变化要求。通过比较,方案二的电路具有简单且高效的特点,节省了很多电路的调试时间而且降低了实物制作的面积,所以,本设计采用方案二。

(3)单片机模块的论证与选取

方案一:采用最常见的51单片机作为主控芯片,其主频范围在11~32MHz范围内可选择,同时具有32个I/O口,完全满足I/O口的使用,价格合适,便于设计整体电路。

方案二:采用STM32F407,主频最高能达到160Mhz,具有较多的I/O口,能够进行更多的控制。

通过比较,方案二的功能更强。但考虑到价格等情况,本设计最终选取方案一。

2.理论方法与计算

 (1) 满量程输出电压=激励电压*灵敏度 1.0mv/v 例如: 供电电压是 5v 乘以灵敏度 1.0mv/v=满量程 5mv。 相当于有 5Kg 重力产生时候产生 5mV 的电压。

 (2)概述: 711 模块 A 通道带有 128 倍信号增益, 可以将 5mV 的电压放大 128 倍, 然后采样输 出 24bit AD 转换的值, 单片机通过指定时序将 24bit 数据读出。 详细讲解程序计算原理:

 步骤 1: 如何计算传感器供电电压 HX711 可以在产生 VAVDD 和 AGND 电压, 即 711 模块上的 E+ 和 E- 电压。 该电压通过 VAVDD=VBG(R1 +R2 ) /R2 计算。 VBG 为模块儿基准电压 1 . 25v R1 = 20K,R2 = 8.2K 因此得出 VAVDD = 4. 3V (为了降低功耗, 该电压只在采样时刻才有输出, 因此用万用表读取的值可能低于 4.3v, 因 为万用表测量的是有效值。) 

步骤 2: 如何将 AD 值反向转换为重力值。 假设重力为 A Kg, (x<5Kg) , 测量出来的 AD 值为 y 传感器输出, 发送给 AD 模块儿的电压为 A Kg * 4. 3mV / 5Kg = 0. 86A mV 经过 128 倍增益后为 128 * 0. 86A = 1 10. 08AmV

转换为 24bit 数字信号为 110.08A mV * 224 / 4. 3V = 429496. 7296A 所以 y = 429496. 7296A 因此得出 A = y / 429496. 7296 所以得出程序中计算公式 Weight_Shiwu = (unsigned long)((float)Weight_Shiwu/429.5); 特别注意: 因为不同的传感器斜率特性曲线不是完全一样, 因此, 每一个传感器需要矫正这里的 429.5 这个除数, 才能达到精度很高。 修改以下部分代码用于校准(该段程序在 main.c 最上面) #define GapValue 430 当发现测试出来的重量偏大时, 增加该数值。 如果测试出来的重量偏小时, 减小改数值。 该值可以为小数, 例如 429.5

3.电路与程序设计

(1)系统组成:

 

(2)原理框图与各部分电路图:

12864液晶显示电路

 

12864LCD内部构成及功能:它是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器128×64全点阵液晶显示器组成。可完成图形显示,也可以显示8×4个(16×16点阵)汉字或者显示16×4个(8×16点阵)ASCII码。低电压低功耗是其显著特点。

按键电路设计

键盘输入是人机交互界面中重要的组成部分,它是系统接受用户指令的直接途径。键盘是由若干个按键开关组成,键的多少根据单片机应用系统的用途而定。键盘由许多键组成,每一个键相当于一个机械开关触点,当键按下时,触点闭合,当键松开时,触点断开。单片机接收到按键的触点信号后作相应的功能处理。因此,相对于单片机系统来说键盘接口信号是输入信号。

      HX711电路设计

HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。该芯片与后端MCU芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A或通道B,与其内部的低噪声可编程放大器相连。通道A的可编程增益为128或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。通道B则为固定的32增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接器件。上电自动复位功能简化了开机的初始化过程。

报警电路设计

 

报警指示原理分析:报警指示电路是由PNP三极管8050驱动蜂鸣器实现的,单片机I0口控制三极管的基极,当单片机的I0口输出为低电平时,三极管导通,蜂鸣器的正极与电源接通,蜂鸣器通电发出报警声,当单片机I0口输出高电平时,三极管截止,蜂鸣器停止报警。

  1. 系统软件与流程图

系统软件:使用keil4和AD软件

在系统通电后,主程序首先完成系统初始化,其中包括系统变量定义和给系统变量赋初值等,然后调用A/D采集函数,将A/D采集模块输出的24位二进制串行数据转化为十进制,接着进行调零和定标,最后分离出四位十进制数据的千位、百位、十位和个位,调用液晶显示函数,将对应的数值送到对应的液晶上进行显示。

流程图:

4.测试方案与测试结果

测试方案:

(1)精度测试:用2个100g、1个20g1个5g的砝码分别组合来测试本次设计的电子秤的精度。根据显示出来的示重和砝码重量的结果判断是否有偏差,再根据偏差的多少来确定本作品的精度。

(2)计价测试:分别放入不同重量的物体和输入不同的单价,观测是否能准确的得出总价。

(3)去皮测试:先放入一个重物作为“皮”,再按下“去皮按键”,然后将重物置于电子秤上,观察是否能够准确的测出后加重物的重量。

测试结果:

(1)当侧重物体小于50g时,称重误差小于0.5g。

2)当侧重物体在50g及以上时,称重误差小于1g。

5.设计报告结构及规性

设计报告:秤是一种在实际工作和生活中经常用到的测量器具。随着计量技术和电子技术的发展,传统纯机械结构的杆秤、台秤、磅秤等称量装置逐步被淘汰,电子称量装置电子秤、电子天平等以其准确、快速、方便、显示直观等诸多优点而受到人们的青睐。

和传统秤相比较,电子秤利用新型传感器、高精度AD转换器件、单片机设计实现,具有精度高、功能强等特点。本课题设计的电子秤具有基本称重、键盘输入、计算价格、显示、超重报警功能。该电子秤的测量范围为0-10Kg,测量精度达到5g,有高精度,低成本,易携带的特点。电子秤采用液晶显示汉字和测量记过,比传统秤具有更高的准确性和直观性。另外,该电子秤电路简单,使用寿命长,应用范围广,可以应用于商场、超市、家庭等场所,成为人们日常生活中不可少的必需品。

经过整体测试,设计完成的简易电子秤完全符合设计要求。

附加代码

#include <reg52.h>
#include <intrins.h>
#include <string.h>
#define uchar unsigned char
#define uint  unsigned int
bit bdata flag_key;
#include "main.h"
#include "LCD12864.h"
#include "HX711.h"
#include "keyboard.h"
#include "eeprom52.h"
 
//#include "wannianli.h"
//#include "yyxp.h"

unsigned long HX711_Buffer = 0;
unsigned long Weight_Maopi = 0;
unsigned long Weight_Maopi_0 = 0;
int qupi=0;
long Weight_Shiwu = 0;
//键盘处理变量
unsigned char keycode;
unsigned char DotPos;                   //小数点标志及位置

uint GapValue,GapValue1;

unsigned long idata price;     //单价,长整型值,单位为分 
unsigned long idata danjia[8]={11,22,33,44,100,200,300,400}; 
unsigned char count_danjia; 
unsigned long idata money,total_money;     //总价,长整型值,单位为分
//定义标识
volatile bit FlagTest = 0;        //定时测试标志,每0.5秒置位,测完清0
volatile bit FlagKeyPress = 0;  //有键按下标志,处理完毕清0
//校准参数
//因为不同的传感器特性曲线不是很一致,因此,每一个传感器需要矫正这里这个参数才能使测量值很更准确。
//当发现测试出来的重量偏大时,增加该数值。
//如果测试出来的重量偏小时,减小改数值。
//该值可以为小数
//#define GapValue 349
sbit LED=P3^6;
sbit Buzzer = P2^0;
volatile bit ClearWeighFlag = 0; //传感器调零标志位,清除0漂

/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
    SectorErase(0x2000);
    GapValue1=GapValue&0x00ff;
    byte_write(0x2000, GapValue1);
    GapValue1=(GapValue&0xff00)>>8;
    byte_write(0x2001, GapValue1);
    byte_write(0x2060, a_a);    
}

/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
    GapValue   = byte_read(0x2001);
    GapValue   = (GapValue<<8)|byte_read(0x2000);
    a_a      = byte_read(0x2060);
}

/**************开机自检eeprom初始化*****************/
void init_eeprom() 
{
    read_eeprom();        //先读
    if(a_a != 1)        //新的单片机初始单片机内问eeprom
    {
        GapValue  = 3500;
        a_a = 1;
        write_eeprom();       //保存数据
    }    
}
                                                                    
//显示单价,单位为元,四位整数,两位小数
void Display_Price()
{
    LCD12864_write_com(0x88);    
    LCD12864_write_word("单价:    ");

    LCD12864_write_data(price/100 + 0x30);
    LCD12864_write_data(price%100/10 + 0x30);
    LCD12864_write_data('.');
    LCD12864_write_data(price%10 + 0x30);
    LCD12864_write_word("元");
}

//显示重量,单位kg,两位整数,三位小数
void Display_Weight()
{
    LCD12864_write_com(0x90);    
    LCD12864_write_word("重量:  ");
    LCD12864_write_data(' ');
    LCD12864_write_data(Weight_Shiwu/1000 + 0x30);
    LCD12864_write_data('.');
    LCD12864_write_data(Weight_Shiwu%1000/100 + 0x30);
    LCD12864_write_data(Weight_Shiwu%100/10 + 0x30);
    LCD12864_write_data(Weight_Shiwu%10 + 0x30);

    LCD12864_write_word("Kg");
}

//显示总价,单位为元,四位整数,两位小数
void Display_Money()
{
  // unsigned int i,j;
 
   LCD12864_write_com(0x98);                //指针设置
   LCD12864_write_word("总价:  ");
     LCD12864_write_com(0x9f);                //指针设置
   LCD12864_write_word("元");
 

   if (money>=1000)
   {
       LCD12864_write_com(0x9c);
        LCD12864_write_data(' ');
       LCD12864_write_data(money/1000 + 0x30);
       LCD12864_write_data(money%1000/100 + 0x30);
       LCD12864_write_data(money%100/10 + 0x30);
       LCD12864_write_data('.');
       LCD12864_write_data(money%10 + 0x30);
   }
   else if (money>=100)
   {
       LCD12864_write_com(0x9c);
       LCD12864_write_data(' ');
       LCD12864_write_data(0x20);
       LCD12864_write_data(money%1000/100 + 0x30);
       LCD12864_write_data(money%100/10 + 0x30);
       LCD12864_write_data('.');
       LCD12864_write_data(money%10 + 0x30);
   }
    else if(money>=10)
   {
       LCD12864_write_com(0x9c);
       LCD12864_write_data(' ');
       LCD12864_write_data(0x20);
       
       LCD12864_write_data(0x20);
       LCD12864_write_data(money%100/10 + 0x30);
       LCD12864_write_data('.');
       LCD12864_write_data(money%10+ 0x30);
   }   
   else 
     {
       LCD12864_write_com(0x9c);
         LCD12864_write_data(' ');
       LCD12864_write_data(0x20);
       
       LCD12864_write_data(0x20);
        
       LCD12864_write_data(0 + 0x30);
       LCD12864_write_data('.');
       LCD12864_write_data(money%10 + 0x30);
   }  
}

//数据初始化
void Data_Init()
{
   price = 0;
   DotPos = 0;
}
//定时器0初始化
void Timer0_Init()
{
    ET0 = 1;        //允许定时器0中断
    TMOD = 1;       //定时器工作方式选择
    TL0 = 0xb0;     
    TH0 = 0x3c;     //定时器赋予初值
    TR0 = 1;        //启动定时器
}

//定时器0中断
void Timer0_ISR (void) interrupt 1 using 0
{
uchar Counter;
    TL0 = 0xb0;
    TH0 = 0x3c;     //定时器赋予初值

    //每0.5秒钟刷新重量
    Counter ++;
    if (Counter >= 10)
    {
       FlagTest = 1;
       Counter = 0;
    }
}


//按键响应程序,参数是键值
//返回键值:
//         7          8    9      10(清0)
//         4          5    6      11(删除)
//         1          2    3      12(未定义)
//         14(未定义) 0    15(.)  13(确定价格)

void KeyPress(uchar keycode)
{
    switch (keycode)
    {
        case 0:
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
        case 6:
        case 7:
        case 8:
        case 9:    //目前在设置整数位,要注意price是整型,存储单位为分
            if (DotPos == 0)
            {            //最多只能设置到千位
                if (price<100)
                {
                    price=price*10+keycode*10;
                }
            }//目前在设置小数位
            else if (DotPos==1)  //小数点后第一位
            {
                price=price+keycode;
                DotPos=2;
            }
            Display_Price();
            break;
        case 10:   //清零键
//             speak(41);
            if(qupi==0)
                qupi=Weight_Shiwu;
            else
                qupi=0;
            Display_Price();
            //         FlagSetPrice = 0;
            DotPos = 0;
            break;
        case 11:    //删除键,按一次删除最右一个数字
            price=0;
            DotPos=0;
            Display_Price();
            break;
        case 12:       //加
            if(GapValue<10000)
            GapValue++;    
//            Get_Weight();
            break;
        case 13:   //减
            if(GapValue>1)
            GapValue--;
//            Get_Weight();
            break;
        case 14: count_danjia++;
                 if(count_danjia>7)
                 count_danjia=0;
                 price = danjia[count_danjia];
                 Display_Price();
                 break;
        case 15:   //小数点按下 
            DotPos = 1;      //小数点后第一位
            break;

   }
}
//****************************************************
//主函数
//****************************************************
void main()
{
    
//    yyxp_rest=1;
//    yyxp_data=1;
    init_eeprom();  //开始初始化保存的数据
    Init_LCD12864();                                    //初始化LCD1602
   EA = 0;
   Data_Init();
   Timer0_Init();
   //初中始化完成,开断
   EA = 1;
//     Ds1302Init();
//    Get_Maopi();
    LCD12864_write_com(0x80);                        //指针设置
   LCD12864_write_word("欢迎使用电子称  ");    //  
   LCD12864_write_com(0x90);                        //指针设置
   LCD12864_write_word("    初始化中    ");
   LCD12864_write_com(0x88);                        //指针设置
   LCD12864_write_word("    请稍候。。。");
   Delay_ms(2000);
   Get_Maopi();
 
//    Get_Maopi();                //称毛皮重量
//    Weight_Shiwu = 9000;
    while(1)
    {
//每0.5秒称重一次
      if (FlagTest==1/*&&keynum==0*/)
        {
            Get_Weight();
         }
         keycode = Getkeyboard();
                 
      //有效键值0-15
      if (keycode<16)
      {
         KeyPress(keycode);    
         Buzzer=0;
         Delay_ms(100);
         Buzzer=1;
         while(keycode<16)
         {
            if(keycode==12||keycode==13)
            {
                Buzzer=0;
                 Delay_ms(10);
                 Buzzer=1;
                 KeyPress(keycode);
                 Get_Weight();
                 flag_key=1;
            }
            keycode = Getkeyboard();
         }
         write_eeprom();               //保存数据
      }
    }
}
//****************************************************
//称重
//****************************************************
void Get_Weight()
{
    Weight_Shiwu = HX711_Read();
    Weight_Shiwu = Weight_Shiwu - Weight_Maopi;        //获取净重
    if((int)((float)Weight_Shiwu*10/GapValue)<qupi)
    qupi=0;
    Weight_Shiwu = (int)((float)Weight_Shiwu*10/GapValue)-qupi;     //计算实物的实际重量
     
//    Weight_Shiwu = (unsigned int)((float)Weight_Shiwu)-qupi;                                                                 
    if(Weight_Shiwu > 10000||Weight_Shiwu <0)        //超重报警
    {
        Buzzer = !Buzzer;    
        LED=!LED;
//        if(yyxp_busy==1)
//        speak(40);
        LCD12864_write_com(0x94);
       LCD12864_write_word(" -.---");
    }
    else
    {
        if(Weight_Shiwu<10000)
        LED=0;
        else if(Weight_Shiwu>10000)
        LED=1; 
        Buzzer = 1;
//        if(Weight_Shiwu>10)
        {
        Display_Weight();
        money = Weight_Shiwu*price/1000;  //money单位为分
           //显示总金额
           Display_Money();    Display_Price();
        }
    }
}

//****************************************************
//获取毛皮重量
//****************************************************
void Get_Maopi()
{
    unsigned char clear;
mm:    Weight_Maopi_0 = HX711_Read();
    for(clear=0;clear<10;clear++)
    {
//        Buzzer=1;
        LED=1;
        Delay_ms(100);
        LED=0;
        Delay_ms(100);    
    }
    Weight_Maopi = HX711_Read();
    if(Weight_Maopi/GapValue!=Weight_Maopi_0/GapValue)
    goto mm;
    Buzzer=0;
    Delay_ms(500);
    Buzzer=1;

//****************************************************
//MS延时函数(12M晶振下测试)
//****************************************************
void Delay_ms(unsigned int n)
{
    unsigned int  i,j;
    for(i=0;i<n;i++)
        for(j=0;j<123;j++);
}

HX711模块的封装代码:

#include "HX711.h"


//****************************************************
//延时函数
//****************************************************
void Delay__hx711_us(void)
{
    _nop_();
    _nop_();
}

//****************************************************
//读取HX711
//****************************************************
unsigned long HX711_Read(void)    //增益128
{
    unsigned long count; 
    unsigned char i; 
      HX711_DOUT=1; 
    Delay__hx711_us();
      HX711_SCK=0; 
      count=0; 
      while(HX711_DOUT); 
      for(i=0;i<24;i++)
    { 
          HX711_SCK=1; 
          count=count<<1; 
        HX711_SCK=0; 
          if(HX711_DOUT)
            count++; 
    } 
     HX711_SCK=1; 
    count=count^0x800000;//第25个脉冲下降沿来时,转换数据
    Delay__hx711_us();
    HX711_SCK=0;  
    return(count);
}


 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java中线程的状态

Java中线程的状态分为6种。 初始(NEW)&#xff1a;新创建了一个线程对象&#xff0c;但还没有调用start()方法。运行(RUNNABLE)&#xff1a;Java线程中将就绪&#xff08;ready&#xff09;和运行中&#xff08;running&#xff09;两种状态笼统的称为“运行”。 线程对象创建…

gateway的使用

什么是Spring Cloud Gateway 网关作为流量的入口&#xff0c;常用的功能包括路由转发&#xff0c;权限校验&#xff0c;限流等。 Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架&#xff0c;定位于取代 Netflix Zuul。相比 Zuul 来说&#xff0c;Spring Cloud …

ADV7391BCPZ-ASEMI代理亚德诺ADV7391BCPZ原厂芯片

编辑-Z ADV7391BCPZ参数描述&#xff1a; 型号&#xff1a;ADV7391BCPZ VDD&#xff1a;1.8V VAA&#xff1a;3.3V 全驱动输出电流&#xff1a;34.6 mA 低驱动输出电流&#xff1a;4.3 mA 输出电容&#xff1a;10 pF 模拟输出延迟&#xff1a;6 ns DAC模拟输出倾斜&am…

文件一直处于修改状态 git checkout 无法还原的问题解决方法

问题描述 最近在 RT-Thread 时&#xff0c;使用 Git 回退版本验证问题&#xff0c;后来 git pull 拉取最新代码后&#xff0c;发现里面有几个文件&#xff0c;一直为【修改】状态&#xff0c;并且无法还原&#xff0c;git checkout xxx git reset --hard 都用了&#xff0c;依旧…

简单两步创建nVisual建筑场景

nVisual是一款网络基础设施可视化管理软件&#xff0c;通过模型可规划即将建设的机房效果&#xff0c;或者将已有的机房场景复刻至系统中&#xff0c;便于运维管理者清晰的了解机房设备及线缆路由连接关系。 数据初始我们需要将数据中心场景复刻至系统中&#xff0c;建筑场景也…

【Java】抽象类与接口

文章目录 1.抽象类1.1抽象方法 2.接口3.抽象类和接口的区别3.1代码中区分&#xff1a;3.2设计层面区分 在面向对象编程中&#xff0c;抽象是非常重要的一个特征。在Java中可以通过抽象类或接口的形式实现这一特性。 1.抽象类 Java关键字 abstract对应抽象类的使用 1.1抽象方法…

Calico的BGP打通Kubernetes网络和局域网

1、项目背景 随着云原生技术的不断发展&#xff0c;容器化应用已成为企业构建云原生架构的重要方式。而随着集群规模不断扩大&#xff0c;跨主机通信的需求也越来越重要。在 Kubernetes 集群中&#xff0c;Pod 是最小的调度和管理单位&#xff0c;而网络也是 Kubernetes 中最重…

二叉树OJ

文章目录 二叉树OJ根据二叉树创建字符串思路示例代码 二叉树的层序遍历思路示例代码 二叉树的层序遍历 II思路示例代码 二叉树的最近公共祖先思路1示例代码1思路2示例代码2 二叉搜索树与双向链表思路1示例代码1思路2示例代码2 迭代实现二叉树的三种遍历前序遍历思路示例代码 中…

哪些蓝牙耳机戴久不疼?长时间佩戴不疼的蓝牙耳机推荐

现在的真无线耳机已经成为了人们的标配之一了&#xff0c;各个厂家也紧随其后&#xff0c;生产出了多种无线耳机&#xff0c;不少人的选购蓝牙耳机一般都是对音质、佩戴和连接&#xff0c;但通常人们佩戴蓝牙耳机都是在半天左右&#xff0c;小编专门整理了一期舒适度高的耳机&a…

ElasticSeach 集成 springboot

声明是ElasticSearch? ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c; 基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是 当前流行的企业级搜索引擎…

Unity 坐标系

一、左手坐标系与右手坐标系 常见的三维软件都采用笛卡尔坐标系&#xff0c;也就是常见的xyz轴坐标系。笛卡尔坐标系可以是左手坐标系也可以是右手坐标系&#xff0c;如下图所示 两种坐标系是镜像对称的。而Unity采用左手系&#xff0c;且xyz轴的默认方向与图中的左手系完全一…

便携式车用CAN分析仪

产品简介 USBCAN-C系列便携式车用CAN分析仪&#xff0c;通过USB接口快速扩展一路CAN通道&#xff0c;使接入CAN网络非常容易&#xff0c;它具有一体式和小巧紧凑的外形&#xff0c;特别适合于随身携带。CAN接口采用金升阳电源模块和信号隔离芯片实现2500V DC电气隔离&#xff0…

KVM存储池管理与磁盘格式

KVM存储池管理与磁盘格式 KVM必须配置一个目录作为存储磁盘镜像&#xff08;存储卷&#xff09;的目录&#xff0c;我们称这个目录为存储池 存储池管理 默认存储池 /var/lib/libvirt/images/ 创建基于文件夹的存储池&#xff08;目录&#xff09; mkdir -p /data/vmfs定义…

WhatsApp如何让客户参与变得更简单?

WhatsApp对你的品牌来说可能和Twitter和Facebook一样重要&#xff0c;你可能已经把它们纳入你的社交媒体战略。 是的&#xff0c;WhatsApp不仅仅可以用来给同事发短信或与远方的亲戚视频聊天&#xff0c;它也适用于商业。 在发展WhatsApp业务时&#xff0c;小企业主得到了最优…

【网络】Socket编程-UDP篇

文章目录 预备知识源IP地址和目的IP地址源MAC地址和目的MAC地址源端口号和目的端口号"端口号port" 和 "进程ID"认识TCP/UDP协议网络字节序 Socket编程sockaddr结构API接口 简单的UDP网络程序服务器server服务端创建套接字:socket函数**socket的底层原理** …

Unity学习笔记 关于Unity相机的FOV以及水平FOV和垂直FOV之间的转换

前言 关于FOV FOV 是在任何给定时间通过人眼、相机取景器或在显示屏上可见的可观察世界的范围。它指的是整个区域的覆盖范围&#xff0c;而不是单个固定焦点。FOV 还描述了一个人可以看到可见世界的角度。 FOV 越宽&#xff0c;可以看到的可观察世界就越多。它是水平、垂直和对…

使用 OpenCV 进行基于 ESP32 CAM 的目标检测和识别

概述:基于 ESP32 CAM 的目标检测和识别 本教程介绍了使用OpenCV基于 ESP32 CAM的目标检测和识别主题。OpenCV 是一个开源的图像处理库,不仅在工业界而且在研发领域都得到了非常广泛的应用。 这里对于对象检测,我们使用了cvlib 库。该库使用 COCO 数据集上的预训练 AI 模型…

JSON-框架的具体使用

JSON-框架的具体使用 非 SpringBoot 项目 Jackson Jackson 是另一个流行的JSON序列化和反序列化库&#xff0c;具有以下特点 速度快&#xff1a;Jackson 采用了高效的JSON解析算法和字节码生成技术&#xff0c;使得其序列化和反序列化速度非常快。支持全类型序列化&#xff1…

4年外包终于上岸,我只能说别去....

我大学学的是计算机专业&#xff0c;毕业的时候&#xff0c;对于找工作比较迷茫&#xff0c;也不知道当时怎么想的&#xff0c;一头就扎进了一家外包公司&#xff0c;一干就是4年。现在终于跳槽到了互联网公司了&#xff0c;我想说的是&#xff0c;但凡有点机会&#xff0c;千万…

C语言-【移位操作符详解】

这篇文章主要介绍了C语言中移位操作符&#xff0c;文章中通过详细的代码以及有关计算机中零碎的知识点对移位操作符进行了一个更好的解释&#xff0c;需要的小伙伴们可以一起学习学习吖&#xff5e; 移位操作符:移动的是补码的二进制序列。 在C语言当中&#xff0c;有两种移位…