c类地址的分配子网的具体分析过程?

某网络分配了一个C类地址:201.222.5.0假设需要20个子网,每个子网有5台主机
试确定子网掩码,各子网的地址,并为各个子网中的每一主机分配地址

对于给定的C类地址201.222.5.0,我们需要确定子网掩码,并将其分配为20个子网,每个子网中有5台主机。

子网掩码用于确定网络地址和主机地址的边界。在IPv4中,子网掩码是32位的二进制数,前面是网络地址,后面是主机地址。子网掩码的二进制表示中,连续的1表示网络地址的部分,连续的0表示主机地址的部分。

首先,我们需要确定所需的子网数量,即20个子网。为了满足每个子网有5台主机的要求,我们需要至少5个主机地址。因此,我们可以使用3位来表示主机地址,剩下的29位来表示网络地址。

接下来,我们根据29位的网络地址来计算子网掩码。子网掩码通常由全1的连续位和全0的连续位组成。

网络地址:201.222.5.0
子网掩码:11111111.11111111.11111000.00000000

将子网掩码转换为十进制表示,则为255.255.248.0。

现在,我们将网络地址划分为20个子网。由于我们使用了3位作为主机地址,所以剩下的前26位用于网络地址。

对于每个子网,我们需要确定子网的网络地址和广播地址,然后分配给每个主机一个地址。

下面是每个子网的详细过程:

  1. 子网1:网络地址:201.222.5.0,广播地址:201.222.5.31

    • 主机1:201.222.5.1
    • 主机2:201.222.5.2
    • 主机3:201.222.5.3
    • 主机4:201.222.5.4
    • 主机5:201.222.5.5
  2. 子网2:网络地址:201.222.5.32,广播地址:201.222.5.63

    • 主机1:201.222.5.33
    • 主机2:201.222.5.34
    • 主机3:201.222.5.35
    • 主机4:201.222.5.36
    • 主机5:201.222.5.37
  3. 子网3:网络地址:201.222.5.64,广播地址:201.222.5.95

    • 主机1:201.222.5.65
    • 主机2:201.222.5.66
    • 主机3:201.222.5.67
    • 主机4:201.222.5.68
    • 主机5:201.222.5.69

......
以此类推,依次分配剩下的子网。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/890742
  • 你也可以参考下这篇文章:从软件开发角度去看当前的市面上的电子烟
  • 除此之外, 这篇博客: 【C应用】红外遥控小车程序分析(下)——红外传输数据程序分析中的 程序分析: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 我们在globalvariable.h中对红外数据接收引脚进行定义:

    //红外遥控,红外接收器数据线,外部中断 PD10
    #define IRIN_PIN         GPIO_Pin_10
    #define IRIN_GPIO        GPIOD
    #define IRIN_PORTSOURCE  GPIO_PortSourceGPIOD
    #define IRIN_PINSOURCE   GPIO_PinSource10
    #define IRIN_EXITLINE    EXTI_Line10
    #define IRIN_IRQCH       EXTI15_10_IRQn
    #define IRIN             GPIO_ReadInputDataBit(IRIN_GPIO, IRIN_PIN)//读GPIO_PIN_10的电平,如果为高则为1,低为0
    

    我们对红外模块部分建立一个文件IRControl.c(infrared radiation)和一个头文件IRControl.h

    #ifndef __IRCTROL_H_
    #define __IRCTROL_H_
    
    #include "stm32f10x.h"
    
    extern unsigned char ir_rec_flag;//接收数据标志位 1 有新数据 0 没有
    extern char ctrl_comm;//控制指令
    extern unsigned char continue_time;
    void IRCtrolInit(void);
    void IRIntIsr(void);
    
    #endif
    

    IRControl.c

    其次利用定时器TIM3产生一个1微妙的延时,因此在IRControl.c配置定时器中断时可进行如下配置:

    #include "IRCtrol.h"
    #include "interface.h"
    
    unsigned char ir_rec_flag=0;//接收数据标志位 1 有新数据 0 没有
    unsigned char IRCOM[3];//定义数组存放四个数据
    
    void Time3Init(void)
    {
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        TIM_TimeBaseStructure.TIM_Period = 1;
        TIM_TimeBaseStructure.TIM_Prescaler = (72 - 1);//72M / 72 = 1us
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    }
    //定时器TIM3产生1us 延时
    void DelayUs(vu32 nCount)
    {
      u16 TIMCounter = nCount;
      TIM_Cmd(TIM3, ENABLE);
      TIM_SetCounter(TIM3, TIMCounter);
      while (TIMCounter>1)
      {
        TIMCounter = TIM_GetCounter(TIM3);//得到计数器的值
      }
      TIM_Cmd(TIM3, DISABLE);
    }
    

    在IRControl.c中进行外部中断配置:

    /********************外部中断配置 红外遥控配置************************/    
    void IRCtrolInit(void)
    {
    	GPIO_InitTypeDef  GPIO_InitStructure;
    	EXTI_InitTypeDef  EXTI_InitStructure;//定义一个外部中断相关的结构体
    	NVIC_InitTypeDef  NVIC_InitStructure; //定义一个中断的结构体
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);
    	GPIO_InitStructure.GPIO_Pin = IRIN_PIN;//配置使能GPIO管脚
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//配置GPIO模式,输入上拉
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//配置GPIO端口速度
    	GPIO_Init(IRIN_GPIO , &GPIO_InitStructure);
    		
    	GPIO_EXTILineConfig(IRIN_PORTSOURCE , IRIN_PINSOURCE);
    	EXTI_InitStructure.EXTI_Line = IRIN_EXITLINE;//将对应的GPIO口连接到中断线上
    	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//中断事件类型,下降沿
    	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//选择模式,中断型
    	EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能该中断
    	EXTI_Init(&EXTI_InitStructure);//将配置好的参数写入寄存器
    			
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);	 //阶级为0,不可嵌套
    	NVIC_InitStructure.NVIC_IRQChannel = IRIN_IRQCH;//打开PINA_8的外部中断
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//主优先级0,最高
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	//子优先级,最低
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;	//使能该模块中断
    	NVIC_Init(&NVIC_InitStructure);	//中断初始化,将结构体定义的数据执行
    	Time3Init();
    }
    
    /********************延时0.14毫秒************************/  
    void DelayIr(unsigned char x)  
    {
      while(x--)
     {
      DelayUs(140);
     }
    }
    
    
    /********************红外数据接收函数************************/
    void IRIntIsr(void)
    {
         unsigned char j,k,N=0;
    //检测误传输信号
    	 DelayIr(15);//任意的延时时间
    	 if (IRIN==1) //读端口PD10数据为1,确认接收到信号
            { 
    	      return;
    	    } 
    	  continue_time = 40;//连发信号,该程序在main.c中,表示指令持续 40*5 = 200ms 无指令停车。5毫秒是tick_5ms产生。
    //意思是我的PD10开始检测到了高电平信号,但是超过200毫秒没有别的信号进来,就让小车停车。
    //确认IR信号出现
          while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。这么写的很有意思,因为起始码是一个持续9毫秒低电平信号,我们默认它产生,此时的IRIN为0,那么对其取反就是检测其是否为高电平,一举两得。
          {
            DelayIr(1);
          }
    
         for (j=0;j<4;j++)         //收集四组数据
          { 
             for (k=0;k<8;k++)        //每组数据有8位
                {
                  while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。可以理解为起始码为9毫秒低电平和4.5毫秒高电平组成,4.5毫秒高电平结束后就是用户码和数据码,而用户码和数据码的1是由0.65毫秒低电平和0356毫秒的高电平组成(共1.125毫秒),逻辑0则是由0.56毫秒低电平和1.69毫秒高电平组成(共2.25毫秒)。
                    {
                     DelayIr(1); 
                     }
                   while (!IRIN)          //等IR变为高电平
                    { 
                     DelayIr(1);
                     }
    
    //计算IRIN高电平时长,用以确定是逻辑0还是1。
                   while(IRIN)           
                    {
                      DelayIr(1);
                      N++;           
                   if (N>=30)   //超过4.2毫秒自动退出
    	              { 
    	                return;
                      }                  
                    }                   
    
    //根据计时长短进行二进制识别
         IRCOM[j]=IRCOM[j] >> 1;                  //最高位右移一位,数据最高位补“0”,
         if (N>=8) 
           {
             IRCOM[j] = IRCOM[j] | 0x80;
            }  //如果大于8*0.14=1.12毫秒,数据最高位补“1”否则
            N=0;//重新对N赋值
          }//end for k
       }//end for j
       
    	k = ~IRCOM[3];//数组计数从0开始,所以数组中的3代表对第四位的数据取反,第四位是数据为的取反,故对数据位反码取反就是数据码本身。
       if (IRCOM[2] != k)//对数据进行较验,如果数据码不等于数据反码取反,则退出。
       { 
         return; }
    	 
    		 //指令转换
    		 
    		 switch(IRCOM[2])//读取数据码
    		 {
    			 case 0x46: ctrl_comm = COMM_UP;break;
    			 case 0x15: ctrl_comm = COMM_DOWN;break;
    			 case 0x44: ctrl_comm = COMM_LEFT;break;
    			 case 0x43: ctrl_comm = COMM_RIGHT;break;
    			 case 0x40: ctrl_comm = COMM_STOP;break;
    			 default :  return;
    		 }
    		 ir_rec_flag = 1;
    	
    }
    

     主函数main.c

    char ctrl_comm = COMM_STOP;//控制指令
    unsigned char continue_time=0;
    int main(void)
    {
    	delay_init();
    	GPIOCLKInit();
    	IRCtrolInit();
    	TIM2_Init();
    	MotorInit();
     while(1)
     {	 
    	 		if(tick_5ms >= 5)//5ms 
    		{
    			tick_5ms = 0;
    			tick_200ms++;
    			if(tick_200ms >= 40)
    			{
    				tick_200ms = 0;
    			}
    			
    			continue_time--;//200ms 无接收指令就停车
    			if(continue_time == 0)
    			{
    				continue_time = 1;
    				CarStop();
    			}
    			if(ir_rec_flag == 1)//接收到红外信号
    			{
    				ir_rec_flag = 0;
    				switch(ctrl_comm)
    				{
    					case COMM_UP:    CarGo();break;
    					case COMM_DOWN:  CarBack();break;
    					case COMM_LEFT:  CarLeft();break;
    					case COMM_RIGHT: CarRight();break;
    					case COMM_STOP:  CarStop();break;
    					default : break;
    				}
    			}
    		}
    		
     }
    }
    
    

    往期博客:

    红外遥控小车程序分析(上)——四轮马达方向控制程序分析

    一文看懂Modbus通信协议(下)

  • 您还可以看一下 尹成老师的C语言系列之 队列与特殊链表课程中的 环形链表与选猴子小节, 巩固相关知识点

来自GPT的回答:


对于给定的C类地址201.222.5.0,我们可以通过以下步骤来确定子网掩码、子网地址和主机地址的分配:

确定所需的子网数量:
根据题目要求,需要创建20个子网,每个子网有5台主机。这意味着我们需要足够的主机位来容纳每个子网的主机,同时还需要保留一些位用于网络地址和广播地址。

确定子网掩码:
子网掩码用于划分网络地址和主机地址。由于我们有20个子网,可以使用5位作为子网位,因为2^5 = 32,可以容纳20个子网。剩余的7位用于主机位。

二进制表示为:
子网掩码: 11111111.11111111.11111000.00000000
十进制表示为:
子网掩码: 255.255.248.0

确定子网地址:
子网地址是根据给定的C类地址和子网掩码来确定的。我们将子网掩码与C类地址进行按位与操作来获得子网地址。

子网地址 = C类地址 & 子网掩码

以十进制表示为:
子网地址 = 201.222.0.0

分配主机地址:
对于每个子网,我们可以从主机位中选择一个范围来分配主机地址。由于每个子网有5台主机,我们可以使用3位来表示主机地址。

对于每个子网,主机地址的范围是:
第一个主机地址 = 子网地址 + 1
最后一个主机地址 = 子网地址 + 主机数量 - 2

以十进制表示为:
第一个子网的主机范围:201.222.0.1 - 201.222.0.5
第二个子网的主机范围:201.222.0.6 - 201.222.0.10
...
第二十个子网的主机范围:201.222.4.236 - 201.222.4.240

注意:主机范围中的第一个地址用于子网地址,最后一个地址用于广播地址,因此实际上可用的主机地址数量是4个。

这样,我们确定了子网掩码、子网地址和各个子网中每个主机的地址分配方案。请记住,以上是一个基本的示例,实际情况中可能还需要考虑其他因素,如路由配置、子网间的通信等。