跪求以下zigbee程序协调器S1在哪部分控制电机转动?急急急急急急

/*********************************************************************

  • INCLUDES */ #include "OSAL.h" #include "AF.h" #include "ZDApp.h" #include "ZDObject.h" #include "ZDProfile.h"

#include "GenericApp.h"
#include "DebugTrace.h"

#if !defined( WIN32 )
#include "OnBoard.h"
#endif

/* HAL /
#include "hal_lcd.h"
#include "hal_led.h"
#include "hal_key.h"
#include "hal_uart.h"
/
RTOS /
#if defined( IAR_ARMCM3_LM )
#include "RTOS_App.h"
#endif

/
********************************************************************

  • MACROS */ #define LIGHT P0_5 //定义P0.5口为光敏控制端 #define SMOKE P0_6 //定义P0.6口为烟雾控制端 #define LED P1_0 #define A1 P1_4 //定义步进电机连接端口 #define B1 P1_5 #define C1 P1_6 #define D1 P1_7

#define uchar unsigned char
#define uint unsigned int
uint8 motorstatus,CS,CCS,Cmotorstatus;
uchar phasecw[4] ={0x80,0x40,0x20,0x10};//正转 电机导通相序 D-C-B-A
uchar phaseccw[4]={0x10,0x20,0x40,0x80};//反转 电机导通相序 A-B-C-D
static void MotorData(uchar data);
static void MotorCW(void);
static void MotorCCW(void);
static void MotorStop(void);
static void InitIO(void);
static void Delay_MS(uint Time);// ms延时
uint8 AppTitle[] = "ALD2530 Motor"; //应用程序名称
uint8 LedState = 0;
uint8 ucEdDir = 0; //终端1为正转 2为反转
uint8 ucDirection = 1; //1为正转 2为反转
uint8 ucSpeed = 2; //速度2-10之间
uint8 DataBuf[3];
uint8 count,Ccount;
/*********************************************************************

  • MACROS */

/*********************************************************************

  • CONSTANTS */

/*********************************************************************

  • TYPEDEFS */

/*********************************************************************

  • GLOBAL VARIABLES */ // This list should be filled with Application specific Cluster IDs. const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS] = { GENERICAPP_zigbee1 };

const SimpleDescriptionFormat_t GenericApp_SimpleDesc =
{
GENERICAPP_ENDPOINT, // int Endpoint;
GENERICAPP_PROFID, // uint16 AppProfId[2];
GENERICAPP_DEVICEID, // uint16 AppDeviceId[2];
GENERICAPP_DEVICE_VERSION, // int AppDevVer:4;
GENERICAPP_FLAGS, // int AppFlags:4;
GENERICAPP_MAX_CLUSTERS, // byte AppNumInClusters;
(cId_t *)GenericApp_ClusterList, // byte *pAppInClusterList;
GENERICAPP_MAX_CLUSTERS, // byte AppNumInClusters;
(cId_t *)GenericApp_ClusterList // byte *pAppInClusterList;
};

// This is the Endpoint/Interface description. It is defined here, but
// filled-in in GenericApp_Init(). Another way to go would be to fill
// in the structure here and make it a "const" (in code space). The
// way it's defined in this sample app it is define in RAM.
endPointDesc_t GenericApp_epDesc;

/*********************************************************************

  • EXTERNAL VARIABLES */

/*********************************************************************

  • EXTERNAL FUNCTIONS */

/*********************************************************************

  • LOCAL VARIABLES */ byte GenericApp_TaskID; // Task ID for internal task/event processing // This variable will be received when // GenericApp_Init() is called. devStates_t GenericApp_NwkState;

byte GenericApp_TransID; // This is the unique message ID (counter)

afAddrType_t GenericApp_DstAddr;

/*********************************************************************

  • LOCAL FUNCTIONS */ static void GenericApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg ); static void GenericApp_HandleKeys( byte shift, byte keys ); static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pckt ); static void GenericApp_SendTheMessage( void );

#if defined( IAR_ARMCM3_LM )
static void GenericApp_ProcessRtosMessage( void );
#endif
#define LED P1_2
/*********************************************************************

  • NETWORK LAYER CALLBACKS */

/*********************************************************************

  • PUBLIC FUNCTIONS */

void GenericApp_Init( uint8 task_id )
{
GenericApp_TaskID = task_id;
GenericApp_NwkState = DEV_INIT;
GenericApp_TransID = 0;
InitIO(); //初始化电机IO引脚
P0DIR&=~(1<<5|1<<6);//P05 P06输入
P1DIR|=0X01;//P10输出
motorstatus=0;//电机状态标志0
//Cmotorstatus=1;
// Device hardware initialization can be added here or in main() (Zmain.c).
// If the hardware is application specific - add it here.
// If the hardware is other parts of the device add it in main().

//以下三句,是设置终端向协调器单播
GenericApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
GenericApp_DstAddr.endPoint = GENERICAPP_ENDPOINT;
GenericApp_DstAddr.addr.shortAddr = 0x0000;

// Fill out the endpoint description.
GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT;
GenericApp_epDesc.task_id = &GenericApp_TaskID;
GenericApp_epDesc.simpleDesc
= (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc;
GenericApp_epDesc.latencyReq = noLatencyReqs;

// Register the endpoint description with the AF
afRegister( &GenericApp_epDesc );

// Register for all key events - This app will handle all key events
RegisterForKeys( GenericApp_TaskID );

// Update the display
#if defined ( LCD_SUPPORTED )
HalLcdWriteString( "GenericApp", HAL_LCD_LINE_1 );
#endif

ZDO_RegisterForZDOMsg( GenericApp_TaskID, End_Device_Bind_rsp );
ZDO_RegisterForZDOMsg( GenericApp_TaskID, Match_Desc_rsp );

#if defined( IAR_ARMCM3_LM )
// Register this task with RTOS task initiator
RTOS_RegisterApp( task_id, GENERICAPP_RTOS_MSG_EVT );
#endif
}

uint16 GenericApp_ProcessEvent( uint8 task_id, uint16 events )
{
uint8 i;
afIncomingMSGPacket_t *MSGpkt;
afDataConfirm_t *afDataConfirm;

// Data Confirmation message fields
byte sentEP;
ZStatus_t sentStatus;
byte sentTransID; // This should match the value sent
(void)task_id; // Intentionally unreferenced parameter

if ( events & SYS_EVENT_MSG )
{
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );
while ( MSGpkt )
{
switch ( MSGpkt->hdr.event )
{
case ZDO_CB_MSG:
GenericApp_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );
break;

    case KEY_CHANGE://此处是按键事件函数是S1按键按下触发的事件,主要是实现光敏的控制
      GenericApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );//按键触发函数执行
      break;

    case AF_DATA_CONFIRM_CMD:
      // This message is received as a confirmation of a data packet sent.
      // The status is of ZStatus_t type [defined in ZComDef.h]
      // The message fields are defined in AF.h
      afDataConfirm = (afDataConfirm_t *)MSGpkt;
      sentEP = afDataConfirm->endpoint;
      sentStatus = afDataConfirm->hdr.status;
      sentTransID = afDataConfirm->transID;
      (void)sentEP;
      (void)sentTransID;

      // Action taken when confirmation is received.
      if ( sentStatus != ZSuccess )
      {
        // The data wasn't delivered -- Do something
      }
      break;

    case AF_INCOMING_MSG_CMD://有数据接收到,所触发的函数事件
      GenericApp_MessageMSGCB( MSGpkt );//接收到协调器发来的数据,并进行执行。
      break;

    case ZDO_STATE_CHANGE:
      GenericApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
      if ( (GenericApp_NwkState == DEV_ZB_COORD)
          || (GenericApp_NwkState == DEV_ROUTER)
          || (GenericApp_NwkState == DEV_END_DEVICE) )
      {
        // Start sending "the" message in a regular interval.
        osal_start_timerEx( GenericApp_TaskID,
                            GENERICAPP_SEND_MSG_EVT,
                            GENERICAPP_SEND_MSG_TIMEOUT );
      }
      break;

    default:
      break;
  }

  // Release the memory
  osal_msg_deallocate( (uint8 *)MSGpkt );

  // Next
  MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID );
}

// return unprocessed events
return (events ^ SYS_EVENT_MSG);

}

5个回答

急急急
急急急
急急急
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

// Send a message out - This event is generated by a timer
// (setup in GenericApp_Init()).
if ( events & GENERICAPP_SEND_MSG_EVT )
{
// Send "the" message
GenericApp_SendTheMessage();//此处是终端发送烟雾状态值给到协调器的函数
if(motorstatus%2)//判断此状态值,此状态值是奇数的时候 ,光敏可以控制电机,当其是偶数的时候,不进行控制
{
if(LIGHT==0&&CS==0)//此处是判断当前有光,并且CS变量为0的时候,才执行下面的语句,初始化状态下CS=0的
{
CS=1;//将CS变量赋值为1,上面的语句就不能执行第二次了。这样就保证了电机只工作一段时间并停止
CCS=0;//CCS变量为0
count=0; //时间赋值位0
}
if(count<20&&CS)//判断时间值是否小于20并且CS是否为1,此处时间值是0小于20成立,CS上面已经赋值为1,所以成立,执行下面的语句
{
count++;//变量不断进行数据加
for(i=0;i<50;i++)//这里的for循环是实现步进电机给充足的脉冲,让其正常的运转起来
MotorCCW(); //顺时针转动
}

if(LIGHT&&CCS==0)//此处是判断当前没有光,并且CCS变量为0的时候,才执行下面的语句,初始化状态下CCS=0的
{
  CS=0;//CS变量重新为0,那么最上面的光敏判断就可以进行继续执行了。
 CCS=1;//将CSS变量赋值为1,上面的语句就不能执行第二次了。这样就保证了电机只工作一段时间并停止
  count=0;  //时间赋值位0
}
  if(count<20&&CCS)//判断时间值是否小于20并且CS是否为1,此处时间值是0小于20成立,CCS上面已经赋值为1,所以成立,执行下面的语句
  {
      count++;//变量不断进行数据加
  for(i=0;i<50;i++)//这里的for循环是实现步进电机给充足的脉冲,让其正常的运转起来
    MotorCW();      //逆时针转动
  }

}

if(Cmotorstatus==0)//此变量是协调器按键S2所赋予的,协调器按键S2按下形成奇偶数,从而判断此值如果是偶数的时候,进行执行。此处的变量值是从下面的接收函数当中获取的,可以结合接收函数来看
{
if(ucEdDir==0X01)//如果此时方向为1,那么电机顺时针转动。方向位置也是协调器S1按键所赋予的,此处看接收函数的数据
{

  if(Ccount<20)//判断当前的变是否小于20,默认情况下是0,所以此语句是真,可以执行
  {
    Ccount++;;//变量不断进行数据加
 for(i=0;i<50;i++)//这里的for循环是实现步进电机给充足的脉冲,让其正常的运转起来
      MotorCW();       //顺时针转动
  }
  else//当变量值超过20之后,10s完成之后
  {
  Ccount=0;//此处的计数变量重新赋值为0,这样在下一次工作的时候,就可以重新计数
  ucEdDir=0;//方向位变为0,这样子上面的IF语句就不能再执行了,那么电机就会工作一段时间之后,停止
  }
}
if(ucEdDir==0x02)//如果此时方向为2,那么电机逆时针转动。方向位置也是协调器S1按键所赋予的,此处看接收函数的数据
{

  if(Ccount<20)//判断当前的变是否小于20,默认情况下是0,所以此语句是真,可以执行
  {
    Ccount++;//变量不断进行数据加
      for(i=0;i<50;i++)//这里的for循环是实现步进电机给充足的脉冲,让其正常的运转起来
      MotorCCW();      //逆时针转动
  }
  else
  {
   Ccount=0;//此处的计数变量重新赋值为0,这样在下一次工作的时候,就可以重新计数
      ucEdDir=0;//方向位变为0,这样子上面的IF语句就不能再执行了,那么电机就会工作一段时间之后,停止
  }

}
}
else//当S2协调器按键按下形成奇数的时候,此处的电机应该停止
{
  MotorStop();//执行停止函数

// Ccount=0;
// ucEdDir=0;
}
// Setup to send message again
osal_start_timerEx( GenericApp_TaskID,
GENERICAPP_SEND_MSG_EVT,
GENERICAPP_SEND_MSG_TIMEOUT );//此处是系统调用时间函数,
、//意思是每GENERICAPP_SEND_MSG_TIMEOUT调用一次此处的函数执行,此处是200ms

// return unprocessed events
return (events ^ GENERICAPP_SEND_MSG_EVT);

}

#if defined( IAR_ARMCM3_LM )
// Receive a message from the RTOS queue
if ( events & GENERICAPP_RTOS_MSG_EVT )
{
// Process message from RTOS queue
GenericApp_ProcessRtosMessage();

// return unprocessed events
return (events ^ GENERICAPP_RTOS_MSG_EVT);

}
#endif

// Discard unknown events
return 0;
}

/*********************************************************************

  • Event Generation Functions */

static void GenericApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg )
{
switch ( inMsg->clusterID )
{
case End_Device_Bind_rsp:
if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess )
{
// Light LED
HalLedSet( HAL_LED_4, HAL_LED_MODE_ON );
}
#if defined( BLINK_LEDS )
else
{
// Flash LED to show failure
HalLedSet ( HAL_LED_4, HAL_LED_MODE_FLASH );
}
#endif
break;

case Match_Desc_rsp:
  {
    ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg );
    if ( pRsp )
    {
      if ( pRsp->status == ZSuccess && pRsp->cnt )
      {
        GenericApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
        GenericApp_DstAddr.addr.shortAddr = pRsp->nwkAddr;
        // Take the first endpoint, Can be changed to search through endpoints
        GenericApp_DstAddr.endPoint = pRsp->epList[0];

        // Light LED
        HalLedSet( HAL_LED_4, HAL_LED_MODE_ON );
      }
      osal_mem_free( pRsp );
    }
  }
  break;

}
}

/*********************************************************************
按键事件触发函数,此处主要是S1按键,
*

  • @return none
    */
    static void GenericApp_HandleKeys( uint8 shift, uint8 keys )
    {

    if ( keys & HAL_KEY_SW_6 )//S1按键按下,对应的键值是SW_6。协议栈规定的设计
    {
    motorstatus++;//电机状态变量加。就实现S1按键控制光敏继续工作与不工作的状态
    HalLedBlink( HAL_LED_2, 2,50, 500 ); //LED1闪烁提示,表示按键按下
    }

}

/*********************************************************************

  • LOCAL FUNCTIONS */

static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
uint8 buf[3];
uint16 i;
switch ( pkt->clusterId )
{
case GENERICAPP_zigbee1://接收协调器发的数据
osal_memcpy(buf, pkt->cmd.Data, pkt->cmd.DataLength);//将接收到的数据赋值给一个buf的数组变量进行存储
if(buf[0] == 0x30) //0x30 正反转标记,S1按键按下此处结合协调器了解到他的数据第一位。来判断后面接收的数据具体是什么功能
{
ucEdDir = buf[1]; //获取转动方向,有了转动方向。上面的电机工作函数就可以通过此变量对电机进行正转或者是反转

}
else if(buf[0] == 0x31)//0x31 此处是S2按键按下标志,
{
  Cmotorstatus=buf[1]%2;//buf[1]%2的意思是对buf[1]变量进行对2取余数。.那么获取的变量付给标志位,这样在上面的函数
  //根据此值来判断电机是继续转动还是停止工作。

}
break;
}
}

/*********************************************************************
无线数据发送函数,此处是将终端的数据发送协调器
*/
static void GenericApp_SendTheMessage( void )
{
uint8 data;
if(SMOKE)//判断到当前的P06端口为高电平,表明没有烟雾,
data=0;//给变量data赋值为0,这样
else//有烟雾
data=1;//变量赋值为1,当协调器接收到此数据为1的时候,就闪烁LED灯
if ( AF_DataRequest( &GenericApp_DstAddr, &GenericApp_epDesc,
GENERICAPP_zigbee1,
1 ,
(byte *)&data,
&GenericApp_TransID,
AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{//发送一个字节给到协调器,协调器通过判断此数据是1或者是0,来决定是否闪烁LED进行报警。、
}
else
{
// Error occurred in request to send.
}
}

#if defined( IAR_ARMCM3_LM )

static void GenericApp_ProcessRtosMessage( void )
{
osalQueue_t inMsg;

if ( osal_queue_receive( OsalQueue, &inMsg, 0 ) == pdPASS )
{
uint8 cmndId = inMsg.cmnd;
uint32 counter = osal_build_uint32( inMsg.cbuf, 4 );

switch ( cmndId )
{
  case CMD_INCR:
    counter += 1;  /* Increment the incoming counter */
                   /* Intentionally fall through next case */

  case CMD_ECHO:
  {
    userQueue_t outMsg;

    outMsg.resp = RSP_CODE | cmndId;  /* Response ID */
    osal_buffer_uint32( outMsg.rbuf, counter );    /* Increment counter */
    osal_queue_send( UserQueue1, &outMsg, 0 );  /* Send back to UserTask */
    break;
  }

  default:
    break;  /* Ignore unknown command */    
}

}
}
#endif

//---------------------------------------------
//步进电机驱动部分
static void MotorData(uchar data)
{
A1 = 1&(data>>4);
B1 = 1&(data>>5);
C1 = 1&(data>>6);
D1 = 1&(data>>7);
}

//顺时针转动
static void MotorCW(void)
{
uchar i;
for(i=0;i<4;i++)
{
MotorData(phasecw[i]);
Delay_MS(ucSpeed);//转速调节
}
}
//逆时针转动
static void MotorCCW(void)
{
uchar i;
for(i=0;i<4;i++)
{
MotorData(phaseccw[i]);
Delay_MS(ucSpeed);//转速调节
}
}

//停止转动
static void MotorStop(void)
{
MotorData(0x00);
}

/****************************************************************************

  • 名 称: InitIO()
  • 功 能: 初始化IO口程序
  • 入口参数: 无
  • 出口参数: 无
    ****************************************************************************/
    static void InitIO(void)
    {
    P1SEL &= 0x0F;
    P1DIR |= 0xF0;

    MotorCW();//停止转动
    }

static void Delay_MS(uint Time)// 1ms延时
{
char i;

while(Time--)
{
for(i=0;i<100;i++)
MicroWait(10);
}
}
/*********************************************************************
*/

有偿 我发QQ红包 3026765284 急求求求求求

发反反复复反复反复反复反复反复反复反复反复反复

qq:2540318046

加我qq,提供有偿技术支持

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于用ZStack开发ZigBee项目中协调器重启的问题?
-
用QT对zigbee编程实现温度采集及数据发送程序
-
zigbee终端和路由该怎么通信,路由和协调器该怎么通信
-
ZigBee组网 点播 如何 实现一个协调器 向 多个终端 发送数据??
-
关于ZigBee协议栈中的新数据类型
-
zigbee有关点对多的通信
-
ZigBee主端如何控制路由的io端口
-
zigbee全网PANID变化问题,求高人指点,急。。。。
-
求问一些关于zigbee协议栈的问题
-
有ZIGBEE程序大神马?帮忙解释下下面的代码,谢谢!
-
Zigbee串口通信 HalUARTWrite 和 SeriPushSend 关联
-
ZigBee睡眠程序怎么编?
-
linux串口通信!求大神!急
-
求大神,linux串口通信方面!!!7445CPU串口和CC2530通信验证
-
甲醛传感器ZE08与ZIGbee串口调试是否有冲突?
-
android开发:zigbee网关
-
甲醛传感器ZE08与ZIGbee串口调试是否有冲突。
-
协调器用AF_DataRequest点播终端;但是发送的数据有异常
-
Zigbee 如何通过W5500联入以太网
-
程序员实用工具网站
目录 1、搜索引擎 2、PPT 3、图片操作 4、文件共享 5、应届生招聘 6、程序员面试题库 7、办公、开发软件 8、高清图片、视频素材网站 9、项目开源 10、在线工具宝典大全 程序员开发需要具备良好的信息检索能力,为了备忘(收藏夹真是满了),将开发过程中常用的网站进行整理。 1、搜索引擎 1.1、秘迹搜索 一款无敌有良心、无敌安全的搜索引擎,不会收集私人信息,保...
我花了一夜用数据结构给女朋友写个H5走迷宫游戏
起因 又到深夜了,我按照以往在csdn和公众号写着数据结构!这占用了我大量的时间!我的超越妹妹严重缺乏陪伴而 怨气满满! 而女朋友时常埋怨,认为数据结构这么抽象难懂的东西没啥作用,常会问道:天天写这玩意,有啥作用。而我答道:能干事情多了,比如写个迷宫小游戏啥的! 当我码完字准备睡觉时:写不好别睡觉! 分析 如果用数据结构与算法造出东西来呢? ...
别再翻了,面试二叉树看这 11 个就够了~
写在前边 数据结构与算法: 不知道你有没有这种困惑,虽然刷了很多算法题,当我去面试的时候,面试官让你手写一个算法,可能你对此算法很熟悉,知道实现思路,但是总是不知道该在什么地方写,而且很多边界条件想不全面,一紧张,代码写的乱七八糟。如果遇到没有做过的算法题,思路也不知道从何寻找。面试吃了亏之后,我就慢慢的做出总结,开始分类的把数据结构所有的题型和解题思路每周刷题做出的系统性总结写在了 Github...
让程序员崩溃的瞬间(非程序员勿入)
今天给大家带来点快乐,程序员才能看懂。 来源:https://zhuanlan.zhihu.com/p/47066521 1. 公司实习生找 Bug 2.在调试时,将断点设置在错误的位置 3.当我有一个很棒的调试想法时 4.偶然间看到自己多年前写的代码 5.当我第一次启动我的单元测试时 ...
七个开源的 Spring Boot 前后端分离项目,一定要收藏!
前后端分离已经在慢慢走进各公司的技术栈,根据松哥了解到的消息,不少公司都已经切换到这个技术栈上面了。即使贵司目前没有切换到这个技术栈上面,松哥也非常建议大家学习一下前后端分离开发,以免在公司干了两三年,SSH 框架用的滚瓜烂熟,出来却发现自己依然没有任何优势! 其实前后端分离本身并不难,后段提供接口,前端做数据展示,关键是这种思想。很多人做惯了前后端不分的开发,在做前后端分离的时候,很容易带进来一...
用Python分析2000款避孕套,得出这些有趣的结论
到现在为止,我们的淘宝教程已经写到了第四篇,前三篇分别是: 第一篇:Python模拟登录淘宝,详细讲解如何使用requests库登录淘宝pc端。 第二篇:淘宝自动登录2.0,新增Cookies序列化,教大家如何将cookies保存起来。 第三篇:Python爬取淘宝商品避孕套,教大家如何爬取淘宝pc端商品信息。 今天,我们来看看淘宝系列的第四篇 我们在上一篇的时候已经将淘宝数据爬取下来了,...
接私活必备的 10 个开源项目!
点击蓝色“GitHubDaily”关注我加个“星标”,每天下午 18:35,带你逛 GitHub!作者 | SevDot来源 | http://1t.click/VE8W...
阿里资深工程师教你如何优化 Java 代码!
作者 | 王超 责编 | 伍杏玲 明代王阳明先生在《传习录》谈为学之道时说: 私欲日生,如地上尘,一日不扫,便又有一层。着实用功,便见道无终穷,愈探愈深,必使精白无一毫不彻方可。 代码中的"坏味道",如"私欲"如"灰尘",每天都在增加,一日不去清除,便会越累越多。如果用功去清除这些"坏味道",不仅能提高自己的编码水平,也能使代码变得"精白无一毫不彻"。这里,整理了日常工作中的一...
GitHub开源的10个超棒后台管理面板
目录 1、AdminLTE 2、vue-Element-Admin 3、tabler 4、Gentelella 5、ng2-admin 6、ant-design-pro 7、blur-admin 8、iview-admin 9、material-dashboard 10、layui 项目开发中后台管理平台必不可少,但是从零搭建一套多样化后台管理并不容易,目前有许多开源、免费、...
100 个网络基础知识普及,看完成半个网络高手
欢迎添加华为云小助手微信(微信号:HWCloud002或HWCloud003),输入关键字“加群”,加入华为云线上技术讨论群;输入关键字“最新活动”,获取华为云最新特惠促销。华为云诸多技术大咖、特惠活动等你来撩! 1)什么是链接? 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2)OSI 参考模型的层次是什么? 有 7 个 OSI 层:物理...
Google离开我们快十年了
2010年1月13日,Google离开中国。掐指算来,Google已经离开我们快十年了。2010年是个特殊的年份,这一年还发生了3Q大战。为什么诸多大事都发生在2010年...
面试官的HTTP五连问法?我竟然回答不上来...
作者丨松若章来源丨http://1t.click/ataf曾经有这么一道经典面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么?相信大多数准备过的同学都能回...
中国最顶级的一批程序员,从首富到首负!
过去的20年是程序员快意恩仇的江湖时代通过代码,实现梦想和财富有人痴迷于技术,做出一夜成名的产品有人将技术变现,创办企业成功上市这些早一代的程序员们创造的奇迹引发了一浪高...
为什么面向对象糟透了?
又是周末,编程语言“三巨头”Java, Lisp 和C语言在Hello World咖啡馆聚会。服务员送来咖啡的同时还带来了一张今天的报纸, 三人寒暄了几句, C语言翻开了...
分享靠写代码赚钱的一些门路
作者 mezod,译者 josephchang10如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。今天给大家分享一个精彩...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
在线就能用的Linux我给你找好了
来源:公众号【编程珠玑】 作者:守望先生 网站:https://www.yanbinghu.com 前言 是不是不想装虚拟机,还想体验一下Linux?是不是自己的电脑不在,又想搞事情?今天给大家推荐几个在线就可以玩的Linux环境以及学习Shell的地方。 在线Linux环境 如果你不想安装虚拟机,这里提供几个在线就能把玩Linux的网站,他们不需要注册用户,可以直接使用。 Unix...
世界上最好的学习法:费曼学习法
你是否曾幻想读一遍书就记住所有的内容?是否想学习完一项技能就马上达到巅峰水平?除非你是天才,不然这是不可能的。对于大多数的普通人来说,可以通过笨办法(死记硬背)来达到学习的目的,但效率低下。当然,也可以通过优秀的学习法来进行学习,比如今天讲的“费曼学习法”,可以将你的学习效率极大的提高。 费曼学习法是由加拿大物理学家费曼所发明的一种高效的学习方法,费曼本身是一个天才,13岁自学微积分,24岁加入曼...
学Linux到底学什么
来源:公众号【编程珠玑】 作者:守望先生 网站:https://www.yanbinghu.com/2019/09/25/14472.html 前言 ​我们常常听到很多人说要学学Linux或者被人告知说应该学学Linux,那么学Linux到底要学什么? 为什么要学Linux 在回答学什么之前,我们先看看为什么要学。首先我们需要认识到的是,很多服务器使用的是Linux系统,而作为服务器应...
深入理解C语言指针
一、指针的概念 要知道指针的概念,要先了解变量在内存中如何存储的。在存储时,内存被分为一块一块的。每一块都有一个特有的编号。而这个编号可以暂时理解为指针,就像酒店的门牌号一样。 1.1、变量和地址 先写一段简单的代码: void main(){ int x = 10, int y = 20; } 这段代码非常简单,就是两个变量的声明,分别赋值了 10、20。我们把内存当做一个酒店,而每个房间就...
C语言实现推箱子游戏
很早就想过做点小游戏了,但是一直没有机会动手。今天闲来无事,动起手来。过程还是蛮顺利的,代码也不是非常难。今天给大家分享一下~ 一、介绍 开发语言:C语言 开发工具:Dev-C++ 5.11 日期:2019年9月28日 作者:ZackSock 也不说太多多余的话了,先看一下效果图: 游戏中的人物、箱子、墙壁、球都是字符构成的。通过wasd键移动,规则的话就是推箱子的规则,也就不多说了。 二、代...
相关热词 用户权限才c# c#应用程序实例 c#请求接口数据 c#高效读写plc c#代码规范快捷方式 c#编辑模板 c# 内存存储 c# poi 生成图表 c#页面 弹出页面选择框 c# 不实现 继承接口