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

BTS7960 直流电机控制程序

/*************正转逻辑*****************/

LEN=1

REN=1

while()

{

LPWN=0

DELAY

LPWM=1

DELAY

}

/************反转逻辑******************/

LEN=1

REN=1

while()

{

RPWN=0

DELAY

RPWM=1

DELAY

}
/******************************/

/***2025 测试直流电机正反转past***/    
/***2024 11 21板2025 4 16 *L908CODE4240**/                 
              #include     <REG52.H>  
              #include     "intrins.h"           //
              #include     "stdio.h"
              #include     <stdlib.h>
              #define      uint unsigned int
              #define      uchar unsigned char
              sbit         SCL=P1^1;
              sbit         SDA=P1^0;
              sbit         INTPUT1=P1^2;         //电机A左行
              sbit         INTPUT2=P1^3;         //电机A右行
              sbit         INTPUT3=P1^4;         //电机B左行
              sbit         INTPUT4=P1^5;         //电机B右行
              sbit         OUTPUT1=P3^0;         //电机A左行
              sbit         OUTPUT2=P3^1;         //电机A右行
              sbit         OUTPUT3=P3^2;         //电机B左行
              sbit         OUTPUT4=P3^3;         //电机B右行
              sbit         D1_ADD=P5^4;          //
              sbit         D1_DEC=P1^6;          //
              sbit         L1_PWM=P3^5;          //
              sbit         L1_EN=P3^4;           // 高电平使能 低电平关闭
              sbit         R1_PWM=P3^6;          //
              sbit         R1_EN=P3^7;           //
              //sbit         L1_PWM=P3^5;          //
              //sbit         L1_EN=P3^3;           // 高电平使能 低电平关闭
              //sbit         R1_PWM=P3^0;          //
              //sbit         R1_EN=P3^1;           //
              bit          MOTORARUN_L;          //电机A左行启动标志 0关闭 1启动
              bit          MOTORARUN_R;          //电机A右行启动标志 0关闭 1启动
              uchar        count = 0;
              uchar        aa;
              uchar        kcounter,kstatus;     //按键计数标志 按键状态标志
              uchar        time1;          //电机占空比
              uchar        timeA;          //
              #define      high 1
              #define      low 0
              #define      uint unsigned int     //
              #define      uchar unsigned char   //
              #define      CMD_IDLE     0        //空闲模式
              #define      CMD_READ     1        //IAP字节读命令
              #define      CMD_PROGRAM  2        //IAP字节编程命令
              #define      CMD_ERASE    3        //IAP扇区擦除命令
              #define      ENABLE_IAP   0x82     //if SYSCLK<20MHz
              #define      IAP_ADDRESS  0x1600   //时间 EEPROM首地址
              #define      IAP_ADDRESS1 0x1800   //时间 EEPROM首地址
              typedef      unsigned char BYTE;   //Catch_Up接上Catch_Dwon接下
              typedef      unsigned int WORD;
uchar code show1[]=
{
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",0*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*"1",1*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",2*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*"3",3*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*"4",4*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*"5",5*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,/*"6",6*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*"7",7*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",8*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,/*"9",9*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x1F,0x01,0x01,0x01,0x01,0x1F,0x00,/*"A",10*/
0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,/*"D",11*/
0x08,0xF8,0x00,0xF8,0x00,0xF8,0x08,0x00,0x00,0x03,0x3E,0x01,0x3E,0x03,0x00,0x00,/*"W",12*/
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,/*"O",13*/
0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,/*"N",14*/
};    
uchar code show2[]=
{
0x08,0x08,0x08,0x08,0x88,0x78,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,
0x20,0x10,0x48,0x46,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x40,0x40,0x00,/*"左",0*/
0x08,0x08,0x08,0x08,0xC8,0x38,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,
0x08,0x04,0x02,0x01,0xFF,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0xFF,0x00,0x00,0x00,/*"右",1*/
0x80,0x60,0xF8,0x07,0x00,0x04,0x74,0x54,0x55,0x56,0x54,0x54,0x74,0x04,0x00,0x00,
0x00,0x00,0xFF,0x00,0x03,0x01,0x05,0x45,0x85,0x7D,0x05,0x05,0x05,0x01,0x03,0x00,/*"停",2*/
0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,
0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,/*"止",3*/
0x00,0x00,0x00,0xFC,0x44,0x44,0x44,0x45,0x46,0x44,0x44,0x44,0x44,0x7C,0x00,0x00,
0x40,0x20,0x18,0x07,0x00,0xFC,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFC,0x00,0x00,/*"启",4*/
0x40,0x44,0xC4,0x44,0x44,0x44,0x40,0x10,0x10,0xFF,0x10,0x10,0x10,0xF0,0x00,0x00,
0x10,0x3C,0x13,0x10,0x14,0xB8,0x40,0x30,0x0E,0x01,0x40,0x80,0x40,0x3F,0x00,0x00,/*"动",5*/
0x00,0x04,0x84,0x84,0x94,0xE4,0x85,0x86,0x84,0xC4,0xB4,0x84,0x84,0x84,0x80,0x00,
0x80,0x60,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"产",6*/
0x20,0x20,0x20,0xBE,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xBE,0x20,0x20,0x20,0x00,
0x00,0x80,0x80,0xAF,0xAA,0xAA,0xAA,0xFF,0xAA,0xAA,0xAA,0xAF,0x80,0x80,0x00,0x00,/*"量",7*/
0x40,0x40,0x42,0xCC,0x00,0x80,0x88,0x88,0xFF,0x88,0x88,0xFF,0x88,0x88,0x80,0x00,
0x00,0x40,0x20,0x1F,0x20,0x40,0x50,0x4C,0x43,0x40,0x40,0x5F,0x40,0x40,0x40,0x00,/*"进",8*/
0x40,0x40,0x42,0xCC,0x00,0x00,0xFF,0x49,0x49,0xC9,0x49,0x49,0x7F,0x80,0x00,0x00,
0x00,0x40,0x20,0x1F,0x20,0x40,0x5F,0x48,0x44,0x40,0x41,0x42,0x45,0x58,0x40,0x00,/*"退",9*/
0x00,0x00,0x04,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x04,0x04,0xFC,0x00,0x00,0x00,
0x00,0x80,0x40,0x20,0x18,0x06,0x01,0x00,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x00,/*"刀",10*/
0x00,0x10,0x88,0xC4,0x33,0x40,0x48,0x48,0x48,0x7F,0x48,0xC8,0x48,0x48,0x40,0x00,
0x02,0x01,0x00,0xFF,0x00,0x02,0x0A,0x32,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x00,/*"待",11*/
0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,
0x04,0x03,0x00,0xFF,0x00,0x83,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00,/*"机",12*/
};
/*************Pin Define***************/
              void      Initial_LY096BG30();
              void      Delay_50ms(uint Del_50ms);
              void      fill_picture(uchar fill_Data);
              void      IIC_Start();
              void      IIC_Stop();
              void      Write_IIC_Command(uchar IIC_Command);
              void      Write_IIC_Data(uchar IIC_Data);
              bit       Write_IIC_Byte(uchar IIC_Byte);
              void      dis_Value(uchar s);
/*---------------延时子程序----------------*/
              void delay (uint ms)
              {
              uint i,j;
              for(i=0;i<ms;i++)
              for(j=0;j<2;j++)
              ;
              }
/**************Delay*******************************/
              void     Delay_50ms(uint Del_50ms)        //
              {
               uint m;
               for(;Del_50ms>0;Del_50ms--)
               for(m=62450;m>0;m--);
              }
/*************关所有输出*******************************/             
               void reset_io()
               {
               L1_PWM=1;                         //
               L1_EN=1;                          //
               R1_PWM=1;                         //
               R1_EN=1;                          //
               }
/*----关闭IAP----------------------------*/
              void IapIdle()
              {
              IAP_CONTR = 0;                     //关闭IAP功能
              IAP_CMD = 0;                       //清除命令寄存器
              IAP_TRIG = 0;                      //清除触发寄存器
              IAP_ADDRH = 0x80;                  //将地址设置到非IAP区域
              IAP_ADDRL = 0;
              }
/*-从ISP/IAP/EEPROM区域读取一字节-*/
              BYTE IapReadByte(WORD addr)
              {
              BYTE dat;                          //数据缓冲区
              IAP_CONTR = ENABLE_IAP;            //使能IAP
              IAP_CMD = CMD_READ;                //设置IAP命令
              IAP_ADDRL = addr;                  //设置IAP低地址
              IAP_ADDRH = addr >> 8;             //设置IAP高地址
              IAP_TRIG = 0x5a;                   //写触发命令(0x5a)
              IAP_TRIG = 0xa5;                   //写触发命令(0xa5)
              _nop_();                           //等待ISP/IAP/EEPROM操作完成
              dat = IAP_DATA;                    //读ISP/IAP/EEPROM数据
              IapIdle();                         //关闭IAP功能
              return dat;                        //返回
              }
/*-写一字节数据到ISP/IAP/EEPROM区域-*/
              void IapProgramByte(WORD addr, BYTE dat)
              {
              IAP_CONTR = ENABLE_IAP;            //使能IAP
              IAP_CMD = CMD_PROGRAM;             //设置IAP命令
              IAP_ADDRL = addr;                  //设置IAP低地址
              IAP_ADDRH = addr >> 8;             //设置IAP高地址
              IAP_DATA = dat;                    //写ISP/IAP/EEPROM数据
              IAP_TRIG = 0x5a;                   //写触发命令(0x5a)
              IAP_TRIG = 0xa5;                   //写触发命令(0xa5)
              _nop_();                           //等待ISP/IAP/EEPROM操作完成
              IapIdle();
              }
/*---扇区擦除---------------*/
              void IapEraseSector(WORD addr)
              {
              IAP_CONTR = ENABLE_IAP;            //使能IAP val=IapReadByte(IAP_ADDRESS+1);
              IAP_CMD = CMD_ERASE;               //设置IAP命令
              IAP_ADDRL = addr;                  //设置IAP低地址
              IAP_ADDRH = addr >> 8;             //设置IAP高地址
              IAP_TRIG = 0x5a;                   //写触发命令(0x5a)
              IAP_TRIG = 0xa5;                   //写触发命令(0xa5)
              _nop_();                           //等待ISP/IAP/EEPROM操作完成
              IapIdle();
              }
/****************按键计数器状态寄存器归零*************/
               void RstKey()
               {
               kcounter=0;                       //按键计数器归零
               kstatus=0;                        //状态寄存器归零
               }
/*****************按键低电平检测函数*****************/
               void   LowVoltKey(void)           //按键计数器状态标志加一
               {
               kcounter++;                       
               kstatus++;     
               delay(5);                         //延时                  
               }
/*****************按键高电平检测函数*****************/
               void    HighVoltKey(void)         //按键计数器加一 状态标志归零
               {
               kcounter++;                       //按键计数器加一
               kstatus=0;                        //按键状态标志归零
               delay(5);                         //延时
               }
/*******************IIC Start******************/
              void IIC_Start()
              {
               SCL=high;
//Delay_us(1);        
               SDA=high;
               _nop_();
               SDA=low;
               _nop_();_nop_();
               SCL=low;
              }
/*************IIC Stop*************************/
              void IIC_Stop()
              {
              SDA=low;
              _nop_();
              SCL=high;
              _nop_();_nop_();
              SDA=high;
              }
/*****************IIC Write byte***************/
              bit Write_IIC_Byte(unsigned char IIC_Byte)
              {
              unsigned char i;
               bit Ack_Bit;                    //应答信号
               for(i=0;i<8;i++)        
               {
               if(IIC_Byte & 0x80)        //1?0?
               SDA=high;
               else
               SDA=low;
//Delay_us(1);
               SCL=high;
               _nop_();_nop_();
               SCL=low;
//Delay_us(1);
               IIC_Byte<<=1;            //loop
               }
              SDA=high;                        //释放IIC SDA总线为主器件接收从器件产生应答信号    
              _nop_();_nop_();
              SCL=high;                     //第9个时钟周期
              _nop_();_nop_();
              Ack_Bit=SDA;                    //读取应答信号
              SCL=low;
              return Ack_Bit;    
              }  
/*************IIC Write Command*****************/
              void Write_IIC_Command(unsigned char IIC_Command)
              {
              IIC_Start();
              Write_IIC_Byte(0x78);            //Slave address,SA0=0
              Write_IIC_Byte(0x00);            //write command
              Write_IIC_Byte(IIC_Command);
              IIC_Stop();
              }
/****************IIC Write Data*****************/
              void Write_IIC_Data(unsigned char IIC_Data)
              {
              IIC_Start();
              Write_IIC_Byte(0x78);            
              Write_IIC_Byte(0x40);            //write data
              Write_IIC_Byte(IIC_Data);
              IIC_Stop();
              }
/***************设置参数显示******************/
               void dis_Val1(uchar s)
               {
               uchar x,y;
               uint i=0;
               uchar A1,A2,A3;
               A1=s/100;
               A2=(s-A1*100)/10;
               A3=s-A1*100-A2*10;
               for(y=0;y<2;y++)                  //百位显示
               {
               Write_IIC_Command(0XB4+y);        //纵向页
               Write_IIC_Command(00);            //横向离左部边缘开始的距离
               Write_IIC_Command(0X10);          //横向第四个字
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A1*16]);     //0--A字符表
                }
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A2*16]);
                }
               }
                for(y=0;y<2;y++)                 //十位显示
                {
                Write_IIC_Command(0XB4+y);       //纵向页
                Write_IIC_Command(00);           //横向离左部边缘开始的距离
                Write_IIC_Command(0X11);         //横向第五个字
                 for(x=0;x<8;x++)                //横向像素
                 {
                 Write_IIC_Data(show1[x+y*8+A3*16]);
                 }
                }
               }
/***************设置参数显示******************/
               void dis_Val2(uchar s)
               {
               uchar x,y;
               uint i=0;
               uchar A1,A2,A3;
               A1=s/100;
               A2=(s-A1*100)/10;
               A3=s-A1*100-A2*10;
               for(y=0;y<2;y++)                  //百位显示
               {
               Write_IIC_Command(0XB4+y);        //纵向页
               Write_IIC_Command(00);            //横向离左部边缘开始的距离
               Write_IIC_Command(0X14);          //横向第四个字
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A1*16]);//0--A字符表
                }
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A2*16]);
                }
               }
                for(y=0;y<2;y++)                 //十位显示
                {
                Write_IIC_Command(0XB4+y);       //纵向页
                Write_IIC_Command(00);           //横向离左部边缘开始的距离
                Write_IIC_Command(0X115);         //横向第五个字
                 for(x=0;x<8;x++)                //横向像素
                 {
                 Write_IIC_Data(show1[x+y*8+A3*16]);
                 }
                }
               }
/***************定时器参数显示******************/
               void dis_Val(uchar s)
               {
               uchar x,y;
               uint i=0;
               uchar A1,A2,A3;
               A1=s/100;
               A2=(s-A1*100)/10;
               A3=s-A1*100-A2*10;
               for(y=0;y<2;y++)                  //百位显示
               {
               Write_IIC_Command(0XB6+y);        //纵向页
               Write_IIC_Command(00);            //横向离左部边缘开始的距离
               Write_IIC_Command(0X12);          //横向第四个字
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A1*16]); //0--A字符表
                }
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A2*16]);
                }
               }
                for(y=0;y<2;y++)                 //十位显示
                {
                Write_IIC_Command(0XB6+y);       //纵向页
                Write_IIC_Command(00);           //横向离左部边缘开始的距离
                Write_IIC_Command(0X13);         //横向第五个字
                 for(x=0;x<8;x++)                //横向像素
                 {
                 Write_IIC_Data(show1[x+y*8+A3*16]);
                 }
                }
               }
/***************设置参数显示******************/
               void dis_Val4(uchar s)
               {
               uchar x,y;
               uint i=0;
               uchar A1,A2,A3;
               A1=s/100;
               A2=(s-A1*100)/10;
               A3=s-A1*100-A2*10;
               for(y=0;y<2;y++)                  //百位显示
               {
               Write_IIC_Command(0XB6+y);        //纵向页
               Write_IIC_Command(00);            //横向离左部边缘开始的距离
               Write_IIC_Command(0X15);          //横向第四个字
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A1*16]);//0--A字符表
                }
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A2*16]);
                }
               }
                for(y=0;y<2;y++)                 //十位显示
                {
                Write_IIC_Command(0XB6+y);       //纵向页
                Write_IIC_Command(00);           //横向离左部边缘开始的距离
                Write_IIC_Command(0X16);         //横向第五个字
                 for(x=0;x<8;x++)                //横向像素
                 {
                 Write_IIC_Data(show1[x+y*8+A3*16]);
                 }
                }
               }
/********************picture**********************/
              void cleardisp()
              {
              uchar x,y;
              for(y=0;y<8;y++)
               {
               Write_IIC_Command(0xb0+y);
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x10);
                for(x=0;x<128;x++)               //横向像素
                {
                Write_IIC_Data(0X00);
                }
               }
              }
/***********************Initial code*********************/
              void  Initial_LY096BG30()
              {
              Write_IIC_Command(0xAE);   //display off
              Write_IIC_Command(0x20);     //Set Memory Addressing Mode    
              Write_IIC_Command(0x10);     //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
              Write_IIC_Command(0xb0);     //Set Page Start Address for Page Addressing Mode,0-7
              Write_IIC_Command(0xc8);      //Set COM Output Scan Direction
              Write_IIC_Command(0x00);   //---set low column address
              Write_IIC_Command(0x10);   //---set high column address
              Write_IIC_Command(0x40);   //--set start line address
              Write_IIC_Command(0x81);   //--set contrast control register
              Write_IIC_Command(0x7f);
              Write_IIC_Command(0xa1);   //--set segment re-map 0 to 127
              Write_IIC_Command(0xa6);   //--set normal display
              Write_IIC_Command(0xa8);   //--set multiplex ratio(1 to 64)
              Write_IIC_Command(0x3F);   //
              Write_IIC_Command(0xa4);   //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
              Write_IIC_Command(0xd3);   //-set display offset
              Write_IIC_Command(0x00);   //-not offset
              Write_IIC_Command(0xd5);   //--set display clock divide ratio/oscillator frequency
              Write_IIC_Command(0xf0);   //--set divide ratio
              Write_IIC_Command(0xd9);   //--set pre-charge period
              Write_IIC_Command(0x22);   //
              Write_IIC_Command(0xda);   //--set com pins hardware configuration
              Write_IIC_Command(0x12);
              Write_IIC_Command(0xdb);   //--set vcomh
              Write_IIC_Command(0x20);   //0x20,0.77xVcc
              Write_IIC_Command(0x8d);   //--set DC-DC enable
              Write_IIC_Command(0x14);   //
              Write_IIC_Command(0xaf);   //--turn on oled panel
             }
/*-----------------------------------------*/
              void red_eeprom(void)
              {
              time1=IapReadByte(IAP_ADDRESS);    //十位
              }
/***************************************/              
              void write_eeprom( )
              {
              IapEraseSector(IAP_ADDRESS);       //扇区擦除      
              IapProgramByte(IAP_ADDRESS,time1); /**/
              }                                    
/********************显示待机**********************/
              void Diswait()
              {
              uchar x,y;
              uint  Cnt=32;
              for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb6+y);        //竖向第一行    待
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x10);          //横向第一个字
                for(x=0;x<16;x++)                //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*11]); //字符表第7个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb6+y);        //竖向第一行    机
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x11);          //横向第二个字
                for(x=0;x<16;x++)                //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*12]);//字符表第8个字
                }
               }
              }
/************电机一前进*****/
              void LEFT_FORWARD()  
              {
              uchar x,y;
              uint  Cnt=32;
              for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行    左
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x10);          //横向第一个字
                for(x=0;x<16;x++)                //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*0]); //字符表第7个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行    启
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x11);          //横向第二个字
                for(x=0;x<16;x++)                //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*8]);//字符表第8个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行    动
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x12);          //横向第二个字
                for(x=0;x<16;x++)                //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*4]);//字符表第8个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行    进
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x13);          //横向第二个字
                for(x=0;x<16;x++)                //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*5]);//字符表第8个字
                }
               }
              }
/*************电机一后退****/
              void LEFT_BACK()  
              {
              uchar x,y;
              uint  Cnt=32;
              for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行    左
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x14);          //横向第一个字
                for(x=0;x<16;x++)                //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*0]);//字符表第7个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行    启
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x15);          //横向第二个字
                for(x=0;x<16;x++)                //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*9]);  //字符表第8个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行    动
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x16);          //横向第二个字
                for(x=0;x<16;x++)                //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*4]);//字符表第8个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行    进
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x17);          //横向第二个字
                for(x=0;x<16;x++)                //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*5]);//字符表第8个字
                }
               }
              }
/**************电机一左进停止***/
              void Left_ForStop()  
              {
              uchar x,y;
              uint  Cnt=32;
              for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行 左
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x10);          //横向第一个字
                for(x=0;x<16;x++)                //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*0]); //字符表第7个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行 进
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x11);          //横向第二个字
                for(x=0;x<16;x++)                //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*8]); //字符表第8个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行 停
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x12);          //横向第二个字
                for(x=0;x<16;x++)                //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*2]);//字符表第8个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行  止
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x13);          //横向第二个字
                for(x=0;x<16;x++)                //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*3]);//字符表第8个字
                }
               }
              }
/**************电机一左退停止***/
              void Left_BackStop()  
              {
              uchar x,y;
              uint  Cnt=32;
              for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行 左
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x14);          //横向第一个字
                for(x=0;x<16;x++)                //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*0]); //字符表第7个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行 退
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x15);          //横向第二个字
                for(x=0;x<16;x++)                //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*9]); //字符表第8个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行 停
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x16);          //横向第二个字
                for(x=0;x<16;x++)                //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*2]); //字符表第8个字
                }
               }
//
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行 止
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x17);          //横向第二个字
                for(x=0;x<16;x++)                //横向像素
                {
                Write_IIC_Data(show2[x+y*16+Cnt*3]); //字符表第8个字
                }
               }
              }
/**************定时中断*************************/
               void timer0() interrupt 1
               {
                aa++;
               if(aa>=30)                        //指示灯计数30取反
                {
                OUTPUT4=~OUTPUT4;
                aa=0;
                }
                if(MOTORARUN_L==1)
                 {
                  timeA++;                       //计数加
                  if(timeA<time1)                //小于设置值
                  {
                   L1_PWM=0;                     //输出低电平
                  }
                  else if(timeA>time1&&timeA<99) //大于设置值小于MAX 99
                  {
                  L1_PWM=1;                      //输出高电平
                  timeA=0;                       //计数值归零
                  }
                  else if(timeA>99)
                  {
                  timeA=0;                       //计数值归零
                  }
                 }
                 else  if(MOTORARUN_L==0)
                 {
                  L1_PWM=1;
                //  L1_EN=0;
                 }
                 if(MOTORARUN_R==1)
                 {
                 timeA++; //计数加
                 if(timeA<time1) //time=20
                 {
                  R1_PWM=0;
                 }
                 else if(timeA>time1&&timeA<99)
                 {
                 R1_PWM=1;
                 timeA=0;
                 }
                 else if(timeA>99)
                 {
                 R1_PWM=0;
                 timeA=0;
                 }
                }
                else  if(MOTORARUN_R==0)
                {
                 R1_PWM=1;
               }
            }
/**************TMOD***********************************/                             
/**|    定时器1       | |      定时器0          |**/
/***GATE  C/T  M1  M0     GATE  C/T  M1  M0    ***/
//M1 M0  00  13位定时器/计数器,兼容8048定时模式,TL1使用低五位,TH1使用全部八位
//M1 M0  01  16位定时器/计数器
//M1 M0  10  8位自动重载定时器,当溢出时将TH1的值自动载入TL1
//M1 M0     11  定时器1无效
//M1 M0     11  定时器0作为双八位定时器/计数器,TL0作为八位定时器/计数器,通过标准定时器0
//的控制位控制,TH0仅作为一个八位定时器,由定时器1    的控制位控制    
/*************************************************/
              void   main( )                     /*主程序开始*/
              {
              // P3M0=0XFF;                         //强推挽
              // P3M1=0X00;
               MOTORARUN_L=0;                     //电机A左使能关闭
               MOTORARUN_R=0;                     //电机A右使能关闭
               reset_io();                         //
               Initial_LY096BG30();              //初始化显示屏
               Delay_50ms(2);
               cleardisp();                         //清除显示
               Diswait();                        //显示待机
               Left_ForStop();
               Left_BackStop();                 //RIGHT
               red_eeprom();                      //
               dis_Val1(time1);                     //
               dis_Val2(time1);                     //
               TMOD&=0xF0;                       //设置定时器模式
               TL0=0x00;                         //设置定时初始值
               TH0=0x28;                         //设置定时初始值
               ET0=1;
               TF0=1;                             //清除TF0标志
               TR0=1;                             //定时器0开始计时
               EA=1;                             //
               while(1)            
               {
/***************电机一延时参数加*************/
                 dis_Val(aa);
                 dis_Val4(count);
                 RstKey();                         //按键复位
                 for(;kcounter<5;)               //按键循环5次
                  {
                   if(!D1_ADD)                      //按键低电平
                   {
                   LowVoltKey();
                   }
                   else if(~!D1_ADD)             //按键高电平
                   {
                   HighVoltKey();
                   }
                  }
                  if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/
                  {                              /*循环检测 */
                  time1++;
                  if(time1>99)
                  time1=0;
                  write_eeprom();
                  dis_Val1(time1);
                  }
/***************电机一延时参数减*************/
                 RstKey();                         //按键复位
                 for(;kcounter<5;)              //按键循环5次
                  {
                   if(!D1_DEC)                      //按键低电平
                   {
                   LowVoltKey();
                   }
                   else if(~!D1_DEC)             //按键高电平
                   {
                   HighVoltKey();
                   }
                  }
                  if(kstatus>=4)                 /*按键状态标志大于等于3为有效值*/
                  {                              /*循环检测 */
                  time1--;
                  if(time1<1)
                  time1=99;
                  write_eeprom();
                  dis_Val1(time1);
                  }

//电机一左进   开左使能 关右使能 0关 1开
                RstKey();
                if(MOTORARUN_L==0)                 //如果电机左进关闭状态
                {
                 for(;kcounter<5;)               //按键循环5次
                 {
                  if(!INTPUT1)                   //按键低电平
                  {
                  LowVoltKey();                  //按键低电平 计数器加一状态标志加一
                  }
                  else if(~!INTPUT1)             //按键高电平
                  {
                  HighVoltKey();                 //按键计数器加一    状态标志归零
                  }
                 }
                 if(kstatus>=3)                  /*按键状态标志大于等于3为有效值*/
                 {  
                 OUTPUT3=0;
                 MOTORARUN_L=1;                  //电机左运行标志
                 MOTORARUN_R=0;                  //电机右运行标志
                 L1_EN=1;                         //
                 LEFT_FORWARD();                 //显示电机左进
                 }
                }
//电机一左进停止  关左近使能 0关 1开
                RstKey();                         //高电平关电机左进
                if(MOTORARUN_L==1)                 //如果电机左进开启状态
                {
                 for(;kcounter<5;)               //按键循环5次
                 {
                  if(~!INTPUT1)                  //按键高电平
                  {
                  LowVoltKey();                  //按键低电平 计数器加一状态标志加一
                  }
                  else if(!INTPUT1)              //按键低电平
                  {
                  HighVoltKey();                 //按键计数器加一    状态标志归零
                  }
                 }
                 if(kstatus>=3)                  /*按键状态标志大于等于3为有效值*/
                 {  
            //     L1_EN=0;
                 OUTPUT3=1;
                 MOTORARUN_L=0;
                 Left_ForStop();                 //显示左进停止
                 }
                }
//电机一左退   开右使能 关左使能 0关 1开
                RstKey();
                if(MOTORARUN_R==0)                 //如果电机左退关闭状态
                {
                 for(;kcounter<5;)                //按键循环5次
                 {
                  if(!INTPUT2)                    //按键低电平
                  {
                  LowVoltKey();                   //按键低电平 计数器加一状态标志加一
                  }
                  else if(~!INTPUT2)              //按键高电平
                  {
                  HighVoltKey();                  //按键计数器加一    状态标志归零
                  }
                 }
                 if(kstatus>=3)                   /*按键状态标志大于等于3为有效值*/
                 {  
                 OUTPUT2=0;
                 MOTORARUN_R=1;                      //电机右运行标志
                 MOTORARUN_L=0;                      //电机左运行标志
                 R1_EN=1;
                 LEFT_BACK();                     //显示电机左退
                 }
                }
//电机一左退停止  关右使能 0关 1开
                RstKey();                         //高电平关电机左退
                if(MOTORARUN_R==1)                 //如果电机左退开启状态
                {
                 for(;kcounter<5;)                //按键循环5次
                 {
                  if(~!INTPUT2)                    //按键高电平
                  {
                  LowVoltKey();                   //按键低电平 计数器加一状态标志加一
                  }
                  else if(!INTPUT2)              //按键低电平
                  {
                  HighVoltKey();                  //按键计数器加一    状态标志归零
                  }
                 }
                 if(kstatus>=3)                   /*按键状态标志大于等于3为有效值*/
                 {  
            //     R1_EN=0;
                 OUTPUT2=1;
                 MOTORARUN_R=0;
                 Left_BackStop();                 //显示左退停止
                 }
                }
               }     
              }                    //L908 CODE4240 12 17

/**********************************************
        项目名称1路PWM频率0-200占空比0-100% 步进5
版本号2025.0128
基本参数
         1.单片机型号:STC15W408AS 兼容15F
         2.串口波特率:9600
         3.串口校验位:none
         4.串口停止位:1
         5.地址        NO
         6.IRC频率:12.000000MHz
目    录
         一、宏定义区
         二、函数声明区
         三、IO定义区
         四、变量声明区
         五、主函数区
         六、子函数区
         七、所有初始化函数
         八、所有中断函数
         九、EEPROM擦写函数
***********************************************/
//==========================================================
//                一、宏定义区
//==========================================================
              #include       <STC15.H>           //头文件
              #include       <intrins.h>         //库函数文件
              #define        FOSC 12000000L      //IRC频率  
              typedef        unsigned int u16;     //对数据类型进行声明定义
              typedef        unsigned char u8;
//==========================================================
//                二、函数声明区
//==========================================================
              void           UartInit(void);        //9600bps@24MHz
              void           Timer0_Init(void);        //25微秒@24MHz
              void           Timer2_Init(void);        //100微秒@24MHz
              void           Init_IO(void);         //IO初始化
              void           key_san(void);           //按键扫描程序
              void           sedusart(u8 x);      //串口发送测试void sedusart(10)
              void           delayms(u16 c);      //1ms误差 0us
//==========================================================
//                 三、IO定义区
//==========================================================
              sbit           S1 = P5^4;           //按键频率加
              sbit           S2 = P1^6;           //按键频率减
              sbit           S3 = P5^5;           //按键占空比加
              sbit           S4 = P1^7;           //按键占空比减
              sbit           PWM1 = P3^6;           //输出1
              sbit           Led = P3^3;             //LED
//===========================================================
//                  四、变量声明区
//===========================================================
              u8             data recive[10];        //声明数组,接收到的数据缓存
              u8             data recive_1[10];      //声明数组,接收到的数据缓存
              u8             data time;              //软件计时,延时读取通讯数据
              u8             data num;               //通讯字节计数专用
              u8             UART_FIG;               //串口接收标志位
              u16            Time_1US,F_Hz,CT,Step;       //F_HZ=100倍(20000对应200HZ)  CT=50(占空比50%)     Step(步进数)
//===========================================================
//                  五、主函数区
//===========================================================
              main()
              {
               Init_IO();                        //IO初始化
               UartInit();                       //串口初始化
               F_Hz = 55;                         //初始值频率
               CT   =    50;                     //初始值占空比10%
               Step =     5;                     //步进数
               Timer2_Init();                     //定时器2初始化
               while(1)
                {
                key_san();
        //静态数码管显示
//         Pout1 = !Pout1;
                }
              }    
//==========================================================
//           六、子函数区
//==========================================================
// 描述:控制函数
              void key_san(void)
              {
               if(S1 == 0)                         //频率加
               {
               if(++Time_1US>20000)                 //
                if(S1 == 0)
                {
                 Time_1US = 0;
                 F_Hz = F_Hz/100;                 //缩小100倍
                 F_Hz = F_Hz + Step;             //
                 if(F_Hz>=200)                     //
                 {
                 F_Hz=0;                         //
                 }     
                 Timer2_Init();
                 Led = 0;
                }          
               }
              if(S2 == 0)                         //频率减
               {
               if(++Time_1US>20000)                 //
               if(S2 == 0)
                {
                Time_1US = 0;
                F_Hz = F_Hz/100;                 //缩小100倍
                F_Hz = F_Hz - Step;                 //
                if(F_Hz==0)
                 {
                 F_Hz=200;
                 }
                Timer2_Init();                     //
                Led = 0;
                }               
               }
               if(S3 == 0)                         //占空比加
               {
               if(++Time_1US>20000)                 //
               if(S3 == 0)                         //
                {
                Time_1US = 0;                     //
                CT = CT + Step;                     //
                if(CT>=100){CT=0;}                 //
//             Timer2_Init();
                Led = 0;
                }               
               }
               if(S4 == 0)                         //占空比减
               {
               if(++Time_1US>20000)                 //频率
                if(S4 == 0)
                {
                Time_1US = 0;                     //F_HZ
                CT = CT - Step;                     //占空比-步进数
                if(CT==0){CT=100;}                 //占空比
//             Timer2_Init();
                Led = 0;
                }               
               }
              }
//=========================================================
//           七、所有初始化函数
//=========================================================
              void UartInit(void)        //9600bps@12.000MHz
              {
              SCON = 0x50;        //8位数据,可变波特率
              AUXR |= 0x40;        //定时器时钟1T模式
              AUXR &= 0xFE;        //串口1选择定时器1为波特率发生器
              TMOD &= 0x0F;        //设置定时器模式
              TL1 = 0xC7;            //设置定时初始值
              TH1 = 0xFE;            //设置定时初始值
              ET1 = 0;            //禁止定时器中断
              TR1 = 1;            //定时器1开始计时
              ES  = 1;            //打开串口中断
              EA  = 1;            //打开总中断
              }
//=========================================================
//             定时器2初始化
//=========================================================
              void Timer2_Init(void)        //1000微秒@12.000MHz
              {  
              AUXR |= 0x04;                      //定时器2为1T模式
              F_Hz = F_Hz*100;                   //*100 总分频20000HZ
              T2L = (65536-FOSC/2/F_Hz);         //初始化计时值
              T2H = (65536-FOSC/2/F_Hz) >> 8;            
              AUXR |= 0x10;                      //定时器2开始计时

//    INT_CLKO = 0x04;                 //使能定时器2的时钟输出功能
              IE2 |= 0x04;                       //开定时器2中断
              EA  = 1;                           //打开总中断
              if(F_Hz == 0||F_Hz == 20000)       //当频率值为0或200Hz关闭输出
               {
                  IE2 &= ~0x04;                   //关闭中断
               AUXR &= ~0x10;                  //定时器2停止计时
               PWM1 = 0;
               }
              }
//=========================================================
//             初始化IO口函数
//=========================================================
              void Init_IO(void)        //IO初始化
              {
              P1M0 = 0x00;
              P1M1 = 0x00;
              P3M0 = 0x01;
              P3M1 = 0x00;
              S1 = S2 = S3 = S4 = 1;
              PWM1 = 0;
              Led = 1;
              }    
//=========================================================
//             八、所有中断函数
//=========================================================
// 描述:定时器0中断函数,1毫秒进入一次中断
void time0() interrupt 1     //定时器0中断程序
{
//    u16 x;
//
//    PWM2 = !PWM2;
//    Led = !Led;
//    x++;
//    if(x>=10)
//    {
//
//        x = 0;
//    }    
//    time--;
//    if(time<=1)
//    {
//        num=0;
//    }
}
//=========================================================
//            定时器2中断程序
//=========================================================
              void t2int() interrupt 12             //定时器2中断程序,
              {      
              u16 CT1,CT2;                   //CT占空比数0-100  CT2分频常数2   CT2为占空比计数器0-100
              CT2++;
              if(CT2>=2)
               {
               CT2 = 0;
               CT1++;
               if(CT1>=CT)
                {
                PWM1 = 0;                         //
                }
                 else{PWM1 = 1;}
                if(CT1>=100)
                {
                CT1 = 0;
                }
                }
              }
//=========================================================
//            串口中断通信
//=========================================================
              void exter0() interrupt 4       //串口中断通信
              {
               if(RI==1)
               {
               recive[num++]=SBUF;//接收一个字节
               if(num>=2)
                {
                F_Hz = recive[0];
                CT   =    recive[1];
//                 F_Hz = F_Hz*100;
//                 T2L = (65536-FOSC/2/F_Hz);                 //初始化计时值
//                 T2H = (65536-FOSC/2/F_Hz) >> 8;    
                Timer2_Init();
                Led = 0;
                num=0;                                 
                }  //防止缓存数据超限             
                RI=0;
               }
               time=10;             //数据延时读取时间
               if(num>=2)
               {
               num=0;
               }         
              }

相关文章:

BTS7960 直流电机控制程序

/*************正转逻辑*****************/ LEN1 REN1 while() { LPWN0 DELAY LPWM1 DELAY } /************反转逻辑******************/ LEN1 REN1 while() { RPWN0 DELAY RPWM1 DELAY } /******************************/ /***2025 测试直流电机正反转past…...

vue3 uniapp vite 配置之定义指令

动态引入指令 // src/directives/index.js import trim from ./trim;const directives {trim, };export default {install(app) {console.log([✔] 自定义指令插件 install 触发了&#xff01;);Object.entries(directives).forEach(([key, directive]) > {app.directive(…...

Mysql-JDBC

JDBCUtils public class JDBCUtils {/*** 工具类的构造方法一般写成私有*/private JDBCUtils(){}//静态代码块再类加载的时候执行&#xff0c;且执行一次static{try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackT…...

如何在爬虫中合理使用海外代理?在爬虫中合理使用海外ip

我们都知道&#xff0c;爬虫工作就是在各类网页中游走&#xff0c;快速而高效地采集数据。然而如果目标网站分布在多个国家或者存在区域性限制&#xff0c;那靠普通的网络访问可能会带来诸多阻碍。而这时&#xff0c;“海外代理”俨然成了爬虫工程师们的得力帮手&#xff01; …...

安卓环境搭建开发工具下载Gradle下载

1.安装jdk(使用java语言开发安卓app) 核心库 java.lang java.util java.sq; java.io 2.安装开发工具(IDE)android studio https://r3---sn-2x3elnel.gvt1-cn.com/edgedl/android/studio/install/2023.3.1.18/android-studio-2023.3.1.18-windows.exe下载完成后一步一步安装即…...

k8s+helm部署tongweb7云容器版(by lqw)

安装准备 1.联系销售获取安装包和授权&#xff08;例如&#xff1a;tongweb-cloud-7.0.C.6_P3.tar.gz&#xff09;。 2.已安装docker和k8s集群&#xff0c;参考&#xff1a; k8s集群搭建 3.有对应的docker私库&#xff0c;没有的可以参考&#xff1a; harbor搭建 4.docker已经…...

关于DApp、DeFi、IDO私募及去中心化应用开发的综合解析

一、DApp&#xff08;去中心化应用&#xff09;技术开发 1. 技术架构与开发流程 分层架构 &#xff1a; 前端层 &#xff1a;使用React/Vue.js构建用户界面&#xff0c;通过Web3.js或Ethers.js与区块链交互。 智能合约层 &#xff1a;以太坊系常用Solidity&#xff0c;Solana…...

招贤纳士|Walrus 亚太地区招聘高级开发者关系工程师

职位介绍&#xff1a; 开发者关系团队&#xff08;Developer Relations&#xff09;通过线上线下方式与开发者社区互动&#xff0c;提供专业支持和指导&#xff0c;帮助他们在 Sui 和 Walrus 上构建下一代 Web3 应用。团队通过与社区对话&#xff0c;了解开发者的痛点&#xf…...

Qt实现文件传输客户端(图文详解+代码详细注释)

Qt实现文件传输客户端 1、 客户端UI界面设计2、客户端2.1 添加网络模块和头文件2.2 创建Tcp对象2.3 连接按钮2.3.1 连接按钮连接信号与槽2.3.2 连接按钮实现 2.4 读取文件2.4.1 连接读取文件的信号与槽2.4.2 读取文件槽函数实现2.5 进度条2.5.1 设置进度条初始值2.5.2 初始化进…...

STL详解 - list的模拟实现

目录 1. list 的基本结构 1.1 构造函数 2. 迭代器的实现 2.1 构造函数 2.2 自增和自减操作符 2.3 比较操作符 2.4 解引用和箭头操作符 3. list 容器的实现 3.1 构造函数 3.2 拷贝构造 3.3 赋值运算符重载 3.4 析构函数 3.5 迭代器相关函数 3.6 插入和删除函数 3.…...

ROS 2 的bag

ROS 1 和 ROS 2 的bag包互转方法 1. 安装rosbags工具&#xff1a; 使用pip安装最新版本的rosbags库&#xff08;确保版本大于等于0.9.15&#xff09; pip install rosbags --upgrade 2. db3文件bag包互转&#xff1a;使用rosbags-convert命令进行转换 rosbags-convert --sr…...

微软承认Win11出现极端错误,只能强制关机或重装系统

最近&#xff0c;不少使用 Windows 11 的用户反映&#xff0c;在系统更新后&#xff0c;“Windows Hello”突然失效&#xff0c;原本便捷的人脸识别和PIN登录功能统统无法使用。更糟的是&#xff0c;有人在重置系统后直接被挡在系统门外&#xff0c;这让人不禁发问&#xff1a;…...

bininote: 使用AI将视频转换了Markdown笔记

GitHub&#xff1a;https://github.com/JefferyHcool/BiliNote 更多AI开源软件&#xff1a;发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI BiliNote 是一个开源的 AI 视频笔记助手&#xff0c;支持通过哔哩哔哩、YouTube 等视频链接&#xff0c;自动提取内容并生…...

Python自动化办公

第五篇&#xff1a;Python自动化办公&#xff1a;10行代码搞定重复性工作 适合读者&#xff1a;职场人士、数据分析师 | 阅读时长&#xff1a;12分钟 引言 每天重复处理Excel、PDF或邮件&#xff1f;Python可以帮你自动化这些枯燥任务&#xff0c;节省90%的时间。本文通过实际…...

使用 tcpdump 工具,捕获并分析

一、 文章概述 使用 tcpdump 工具&#xff0c;捕获并分析了与 SM-DP&#xff08;Subscription Management Data Preparation&#xff09; 服务器之间进行 TLS&#xff08;Transport Layer Security&#xff09; 握手的过程的数据包&#xff0c;并对其进行了详细解读。 二、 主…...

【LInux网络】socket 编程 - 从ip端口到接口详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

MCP:构建大型语言模型与外部系统无缝交互的标准协议架构

目录 引言MCP概述 2.1 MCP的定义2.2 MCP的起源与发展MCP的核心设计原理 3.1 上下文传递与交互3.2 数据安全与隐私保护3.3 统一通信协议MCP架构设计详解 4.1 模块化设计4.2 组件解析 4.2.1 Client Agent4.2.2 Context Manager4.2.3 API Adapter4.2.4 Security Layer4.3 设计原则…...

50常用控件_QPushButton

目录 QPushButton添加图标 QPushButton添加快捷键 代码示例: 按钮的重复触发 使用 QPushButton 表示一个按钮.这也是当前我们最熟悉的一个控件了 OPushButton 继承自 QAbstractButton .这个类是一个抽象类是其他按钮的父类 抽象类 这个类包含了 纯虚函数无法创建出实例(对象…...

Java的ForkJoinPool:深入理解并发编程的利器

在现代软件开发中&#xff0c;多核处理器的普及使得并发编程成为提升应用性能的关键。Java作为一门广泛使用的编程语言&#xff0c;提供了丰富的并发工具&#xff0c;其中ForkJoinPool是Java 7引入的一个强大组件&#xff0c;专为处理可递归分解的任务设计。它通过分治算法和工…...

结合 Python 与 MySQL 构建你的 GenBI Agent_基于 MCP Server

写在前面 商业智能(BI)正在经历一场由大型语言模型(LLM)驱动的深刻变革。传统的 BI 工具通常需要用户学习复杂的界面或查询语言,而生成式商业智能 (Generative BI, GenBI) 则旨在让用户通过自然语言与数据交互,提出问题,并获得由 AI 生成的数据洞察、可视化建议甚至完整…...

道路运输安全员企业负责人考试内容与范围

道路运输企业主要负责人&#xff08;安全员&#xff09;考证要求 的详细说明&#xff0c;适用于企业法定代表人、分管安全负责人等需取得的 《道路运输企业主要负责人和安全生产管理人员安全考核合格证明》&#xff08;交通运输部要求&#xff09;。 考试内容与范围 1. 法律法…...

一体化安全管控平台:消防“一张图”与APP统一管理的创新模式

在科技飞速发展的当下&#xff0c;智慧消防已成为消防救援行业不可阻挡的发展趋势。随着城市化进程的加速&#xff0c;城市规模不断扩大&#xff0c;建筑结构愈发复杂&#xff0c;传统的消防管理模式逐渐暴露出诸多弊端&#xff0c;难以满足现代社会对消防安全的高标准要求。 智…...

利用pnpm patch给第三方库打补丁

如果在使用第三方库的时候, 发现bug, 但是等不了官方补丁, 可以使用pnpm patch给第三方库打补丁来解决, 类似 git diff, 操作如下: 在package.json所在目录的命令行执行 pnpm patch jiaminghi/data-view执行完这个命令后会生成临时文件夹供你编辑, 然后开始编辑这个临时文件夹…...

Spark-SQL(三)

一. 数据加载与保存 1. 数据加载: spark.read.load 是加载数据的通用方法。 spark.read.format("…")[.option("…")].load("…") 1&#xff09;format("…")&#xff1a;指定加载的数据类型。 2&#xff09;load("…"…...

centosu7 二进制安装mysql5.7

一、准备工作 1. 卸载原有MariaDB&#xff08;如有&#xff09; sudo yum remove -y mariadb-libs sudo rm -rf /var/lib/mysql 2. 安装依赖 sudo yum install -y libaio numactl openssl-devel 3. 创建MySQL用户和目录 sudo groupadd mysql sudo useradd -r -g mysql -s…...

生物信息与自动化控制1 - 传感器数据采集与PID 算法的应用

1. 生物过程自动化控制 在生物制药、发酵工程等生物过程中&#xff0c;可以利用生物信息学技术分析生物反应的机理和代谢网络&#xff0c;然后通过自动化控制系统对生物过程进行实时监测和优化控制&#xff0c;以提高生物产品的产量和质量。例如&#xff0c;在发酵过程中&…...

npm包管理工具理解

一、当前维护者&#xff1a;GitHub&#xff08;微软旗下&#xff09; 2018 年&#xff0c;npm 公司被 GitHub 收购&#xff1b; 2020 年&#xff0c;GitHub 被微软收购。 因此&#xff0c;目前 npm 公共仓库由 GitHub 团队负责运维&#xff0c;微软提供底层基础设施支持&#…...

Uniapp 使用Android studio进行离线打包

一.需求 开发Uniapp项目时&#xff0c;使用HBuilderX进行云打包&#xff0c;会经常遇到两个方面的问题&#xff0c;当天的打包的次数受到了限制和打包的时间会比较长&#xff0c;因此&#xff0c;对于离线打包其需求还是比较常见的&#xff0c;这篇文章记录一下对Uniapp的项目…...

mcp和API区别

MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;与传统API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;在技术架构、集成方式和应用场景等方面存在显著差异&#xff0c;以下是主要区别的总结&#x…...

ASP.NET 中 Cache 的常规使用方法

在 ASP.NET 中&#xff0c;Cache 类提供了一种在服务器内存中存储数据的方法&#xff0c;可以显著提高应用程序性能。以下是 Cache 的常规使用方法&#xff1a; 1. 基本缓存操作 添加缓存项 // 最简单的添加方式 Cache["key"] "value";// 使用 Insert …...

TextIn ParseX文档解析参数使用指南(第一期)

TextIn ParseX通用文档解析作为一款适配多样化场景的PDF解析工具&#xff0c;在基础识别能力以上&#xff0c;还提供了便捷、完善的参数配置功能&#xff0c;便于用户根据自身需求调整&#xff0c;获得所需输出结果。在TextIn技术社群&#xff0c;我们的产品团队也经常接到关于…...

[图论]生成树 引言

生成树 引言 生成树&#xff1a;一个连通图的生成树是该图的一个极小连通子图。生成树中含有图中全部(设 V V V个)顶点及构成一棵树的 V − 1 V-1 V−1条边&#xff0c;且生成树中不应有环。最小生成树(MST)&#xff1a;图的所有生成树中&#xff0c;边权之和最小的生成树。显…...

生信小白学Rust-02

基本类型 Rust 每个值都有其确切的数据类型&#xff0c;总的来说可以分为两类&#xff1a;基本类型和复合类型。 基本类型意味着它们往往是一个最小化原子类型&#xff0c;无法解构为其它类型&#xff08;一般意义上来说&#xff09;&#xff0c;由以下组成&#xff1a; 数值…...

Docker Compose 中配置 Host 网络模式

在 Docker Compose 中配置 Host 网络模式时&#xff0c;需通过 network_mode 参数直接指定容器使用宿主机的网络栈。以下是具体配置方法及注意事项&#xff1a; 1. 基础配置示例 在 docker-compose.yml 文件中&#xff0c;为需要启用 Host 模式的服务添加 network_mode: "…...

SQL Server 2022 安装常见问题及解决方法

一、系统要求不满足​ 1. 硬件配置不足​ SQL Server 2022 对硬件有一定要求&#xff0c;若内存、磁盘空间不足&#xff0c;安装可能失败。例如&#xff0c;32 位系统至少需要 1GB 内存&#xff0c;64 位系统至少 2GB&#xff0c;且安装过程需预留足够磁盘空间。​ 解决方法&a…...

解决 AWS RDS MySQL mysqldump 导入sql SET @@GLOBAL 权限不足问题

在使用 mysqldump 导出数据库时&#xff0c;导出的 SQL 文件通常会包含一些 SET 语句&#xff0c;例如 SET MYSQLDUMP, SET SESSION, SET GLOBAL 等&#xff0c;这些语句用于设置会话或全局变量以确保数据一致性和兼容性。然而&#xff0c;在 AWS RDS MySQL 环境中&#xff0c;…...

加油站小程序实战教程11会员注册

目录 1 创建API2 搭建页面布局3 绑定事件总结 上一篇我们介绍了我的页面&#xff0c;显示未开通界面的搭建。当用户点击开通会员时&#xff0c;我们给出弹窗提示用户进行手机号授权&#xff0c;得到手机号之后我们调用API来完成会员的注册。本篇我们介绍一下会员注册的流程。 1…...

基于stm32的手机无线充电研究

标题:基于stm32的手机无线充电研究 内容:1.摘要 随着智能手机的普及&#xff0c;无线充电技术成为了研究热点。本研究的目的是设计并实现基于STM32的手机无线充电系统。采用电磁感应原理&#xff0c;以STM32微控制器为核心控制单元&#xff0c;设计了发射端和接收端电路。通过…...

如何快速隔离被攻击的服务器以防止横向渗透

当发现服务器被攻击时&#xff0c;迅速隔离是防止攻击者横向移动的关键措施。以下是快速隔离服务器的系统化方法&#xff1a; 一、立即网络隔离措施 1. 物理隔离&#xff08;最彻底&#xff09; 直接拔掉服务器的网线&#xff08;对物理服务器&#xff09; 关闭服务器电源&a…...

Ngrok 内网穿透实现Django+Vue部署

目录 Ngrok 配置 注册/登录 Ngrok账号 官网ngrok | API Gateway, Kubernetes Networking Secure Tunnels 直接cmd运行 使用随机生成网址&#xff1a;ngrok http 端口号 使用固定域名生成网址&#xff1a;ngrok http --domain你的固定域名 端口号 Django 配置 1.Youre a…...

信息学奥赛一本通 1508:Easy SSSP

【题目链接】 ybt 1508&#xff1a;Easy SSSP 【题目考点】 1. SPFA算法 判断负环 【解题思路】 使用SPFA统计整个图中是否有负环&#xff0c;初始需要将所有顶点都入队。 可以假想存在一个超级源点&#xff0c;第0号顶点。第0号顶点到第1到第n号顶点都有权值为0的边。 &a…...

兔子桌面官方下载-兔子桌面TV版-安卓电视版官方免费下载新版

想要体验兔子桌面 TV 版带来的诸多便利&#xff0c;下载安装非常简单。以下为你详细介绍官方免费下载新版的步骤&#xff1a; 安卓电视盒子下载方法 确保电视盒子已连接网络&#xff0c;打开盒子自带的浏览器&#xff0c;访问兔子桌面官方网站。 在官网找到 TV 版下载入口&am…...

国标GB28181视频平台EasyCVR视频汇聚系统,打造别墅居民区智能监控体系

一、现状背景 随着国家经济的快速增长&#xff0c;生活水平逐渐提高&#xff0c;私人别墅在城市、乡镇和农村的普及率也在逐年增加。然而&#xff0c;由于别墅区业主经济条件较好&#xff0c;各类不法事件也日益增多&#xff0c;主要集中在以下几个方面&#xff1a; 1&#x…...

天元证券|奶粉行业结构性回暖 乳企竞速全龄化、国际化

在过去几年中&#xff0c;中国婴配粉市场经历了量价齐增&#xff0c;量减价增&#xff0c;量减价减的三个周期。历经多年行业深度洗牌与竞争格局重塑&#xff0c;2024年中国婴配粉市场回暖态势愈发清晰可辨。 日前&#xff0c;包括中国飞鹤、澳优、健合集团在内的多家奶粉股披露…...

JVM:对象的实例化、直接内存

一、对象的实例化 对象实例化步骤&#xff1a; 首先加载对象所属类的相关信息&#xff0c;若该类存在父类&#xff0c;那么要将父类的信息也加载进来&#xff0c;依此类推接着在堆中为对象分配内存&#xff0c;有两种分配方法&#xff1a;当堆内存空间较为规整时&#xff0c;…...

Qwen2.5-Omni 7B 模型部署:镜像下载、环境安装及 demo 启动指南

本文采用docker方式启动 参考&#xff1a;https://github.com/QwenLM/Qwen2.5-Omni 下载模型 modelscope download --model Qwen/Qwen2.5-Omni-7B --local_dir /usr/local/ai/models/Qwen2.5-Omni-7B 下载docker镜像&#xff08;耗时较长&#xff0c;耐心等待&#xff09; d…...

【DeepSeek答】如何成为一名科技领域陪同口译,阶段性学习目标是什么

问&#xff1a;请问我怎样能成为一名陪同口译&#xff1f;需要学习哪些方面&#xff1f;如何阶段性达成目标&#xff1f;我每天晚上可以抽出一个小时学习&#xff0c;周六日全天学习。请帮我具体规划出阶段性的学习路线&#xff0c;并且给出学习教材 DeepSeek答&#xff1a; 根…...

AN(G|C)LE as an OpenCL Compute Driver

AN{G|C}LE as an OpenCL Compute Driver References Vulkanised 2024 https://vulkan.org/events/vulkanised-2024 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/...

在云服务器的 Linux 系统中安装 Python 的步骤(以常见发行版 Ubuntu/CentOS 为例)

一、Ubuntu/Debian 系统安装 Python 1. 更新系统包列表 sudo apt update && sudo apt upgrade -y2. 安装编译依赖 sudo apt install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev…...

spark-SQL核心编程课后总结

通用加载与保存方式 加载数据&#xff1a;Spark-SQL的 spark.read.load 是通用加载方法&#xff0c;借助 format 指定数据格式&#xff0c;如 csv 、 jdbc 、 json 等&#xff1b; load 用于指定数据路径&#xff1b; option 在 jdbc 格式时传入数据库连接参数。此外&#xff0…...