基于江科大自化协B站教学视频《51单片机入门教程-2020版 程序全程纯手打 从零开始入门》


一、单片机介绍


单片机,英文Micro Controller Unit,简称MCU

内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能

单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机,LED等)的控制

单片机跟计算机相比,单片机算是一个袖珍版计算机,一个芯片就能构成完整的计算机系统。但在性能上,与计算机相差甚远,但单片机成本低、体积小、结构简单,在生活和工业控制领域大有所用

同时,学习使用单片机是了解计算机原理与结构的最佳选择

51单片机是指80年代Intel开发的8051单片机内核的统称,就是因为这个“8051”有个51,所以凡是与“8051”内核一样的单片机都统称为51系列单片机


二、LED代码


2-1点亮一个LED


这里使用的普中单片机的LED是共阳极,所以将P2寄存器设置值为如下0xFE //1111 1110

 #include <REGX52.H>​voidmain(){P2=0xFE;  //1111 1110}

2-2LED循环闪烁


通过调用延时函数实现闪烁

 #include <REGX52.H>#include <INTRINS.H>  //_nop_()函数所在库​voidDelay500ms()       //@11.0592MHz{unsignedchari, j, k;​_nop_();  //空操作,延时一个指令的时间i=4;j=129;k=119;do{do{while (--k);} while (--j);} while (--i);}​voidmain(){while(1){P2=0x00;Delay500ms();  //这里是通过STC-ISP软件生成的延时函数调用P2=0xFF;Delay500ms();}}   

2-3LED流水灯


通过进行P2寄存器的不断延时赋值实现流水灯-基础版

 #include <REGX52.H>#include <INTRINS.H>  //_nop_()函数所在库​voidDelay500ms()       //@11.0592MHz{unsignedchari, j, k;​_nop_();  //空操作,延时一个指令的时间i=4;j=129;k=119;do{do{while (--k);} while (--j);} while (--i);}​voidmain(){while(1){P2=0xFE;      //1111 1110Delay500ms();  //这里是通过STC-ISP软件生成的延时函数调用P2=0xFD;      //1111 1101Delay500ms();P2=0xFB;      //1111 1011Delay500ms();  P2=0xF7;      //1111 0111Delay500ms();P2=0xEF;      //1110 1111Delay500ms();  P2=0xDF;      //1101 1111Delay500ms();P2=0xBF;      //1011 1111Delay500ms();  P2=0x7F;      //0111 1111Delay500ms();}}   

2-4LED流水灯Plus


优化含参延时函数,但是会有一定的误差

 #include <REGX52.H>#include <INTRINS.H>  //_nop_()函数所在库​voidDelay1ms(xms)      //@11.0592MHz{unsignedchari, j;while(xms){_nop_();i=2;j=199;do{while (--j);} while (--i);xms--;}}​​voidmain(){while(1){P2=0xFE;      //1111 1110Delay1ms(500);  //优化含参延时函数P2=0xFD;      //1111 1101Delay1ms(500);P2=0xFB;      //1111 1011Delay1ms(500);P2=0xF7;      //1111 0111Delay1ms(500);P2=0xEF;      //1110 1111Delay1ms(500); P2=0xDF;      //1101 1111Delay1ms(500);P2=0xBF;      //1011 1111Delay1ms(500);P2=0x7F;      //0111 1111Delay1ms(500);}}   

三、独立按键与LED


  • 轻触按键:相当于是一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开

  • LED发光二极管:Light Emitting Diode

  • LED正极引脚较长,负极引脚较短

  • LED正极闪电极较小,负极闪电极较小(在玻璃灯罩里面的)

3-1独立按键控制LED亮灭


通过循环和判断实现按键控制LED亮灭功能

 #include <REGX52.H>voidmain()​{while(1){if(P3_1==0)P2_0=0;elseP2_0=1;}}

3-2独立按键控制LED状态


  • 按键的抖动

对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动

为了避免误操作,需要进行消抖处理:硬件消抖、软件消抖
硬件消抖:RS触发器、电容充放电滤波等方式
软件消抖:Delay函数延时消抖,定时消抖以及外部中断消抖


#include <REGX52.H>
#include <intrins.h>void Delay(unsigned int xms)        //@11.0592MHz
{unsigned char i, j;while(xms){    _nop_();i = 2;j = 199;do{while (--j);} while (--i);xms--;}
}void main()
{while(1){if(P3_1==0){Delay(20);while(P3_1==0);  //判断是否还在按下按键,等松开时跳出循环,并延时消抖,执行相关操作Delay(20);P2_0=~P2_0;}}
}

3-3独立按键控制LED显示二进制


通过二进制值的输出来让LED显示

#include <REGX52.H>
#include <intrins.h>void Delay(unsigned int xms)        //@11.0592MHz
{unsigned char i, j;while(xms--){    _nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}
void main()
{unsigned char LEDnum;        //定义无符号字符变量用来存储二进制while(1){    if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);LEDnum++;     //逐渐递增P2=~LEDnum;  //并将二进制结果传给P2寄存器,因为LED共阳极,低电平亮,所以取反// P2_0=~P2_0;   //这样不行是因为会导致P2_0值改变}}
}

3-4独立按键控制LED移位


通过C语言移位指令以及对LEDNum变量值的控制来完成LED移位显示操作

#include <REGX52.H>
#include <intrins.h>void Delay(unsigned int xms)        //@11.0592MHz
{unsigned char i, j;while(xms--){    _nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}unsigned char LEDnum;void main()
{while(1){if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);LEDnum++;if(LEDnum>=8)   //当到8的时候应该先清零再进行取反,不然灯会不亮LEDnum=0;P2=~(0x01<<LEDnum);}if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);if(LEDnum==0)  //因为定义的是无符号字符变量,所以为了避免向下溢出,进行0值判断置7操作LEDnum=7;elseLEDnum--;P2=~(0x01<<LEDnum);}}}

四、数码管


4-1静态数码管显示


注意若用开发板的时候不要接LCD1602显示屏,因为引脚共用原因会导致数字显示异常

 #include <REGX52.H>#include <intrins.h>​voidDelay(unsignedintxms)        //@11.0592MHz{unsignedchari, j;​while(xms){   _nop_();i=2;j=199;do{while (--j);} while (--i);xms--;}}​unsignedcharNixieTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};   //定义数码管数组,用来存储显示对应数字时应该给寄存器赋的值voidNixie(unsignedcharLocation,Number){switch(Location)        //Location用来接收数字在哪一个数码管显示,通过三八译码器来实现数码管的选择{case1:P2_4=1;P2_3=1;P2_2=1;break;      case2:P2_4=1;P2_3=1;P2_2=0;break;case3:P2_4=1;P2_3=0;P2_2=1;break;case4:P2_4=1;P2_3=0;P2_2=0;break;case5:P2_4=0;P2_3=1;P2_2=1;break;case6:P2_4=0;P2_3=1;P2_2=0;break;case7:P2_4=0;P2_3=0;P2_2=1;break;case8:P2_4=0;P2_3=0;P2_2=0;break;}P0=NixieTable[Number];}​voidmain() {while(1){Nixie(1,1);     //测试数字循环显示Delay(500);Nixie(2,2);Delay(500);Nixie(3,3);Delay(500);Nixie(4,4);Delay(500);Nixie(5,5);Delay(500);Nixie(6,6);Delay(500);Nixie(7,7);Delay(500);Nixie(8,8);Delay(500);Nixie(1,9);Delay(500); Nixie(2,0);Delay(500);Nixie(3,10);        //以下为ABCDEFDelay(500);Nixie(4,11);Delay(500);Nixie(5,12);Delay(500);Nixie(6,13);Delay(500);Nixie(7,14);Delay(500);Nixie(8,15);Delay(500);}}

4-2动态数码管显示


想要进行多个数码管同时显示,需要进行消影操作
出现串位显示的原因是因为数码管的位选和段选出现了交叉,导致串位:位选-段选-位选-段选-位选-段选
消影:位选-段选-清零-位选-段选-清零

 #include <REGX52.H>#include <intrins.h>​voidDelay(unsignedintxms)        //@11.0592MHz{unsignedchari, j;​while(xms){   _nop_();i=2;j=199;do{while (--j);} while (--i);xms--;}}​​​unsignedcharNixieTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};voidNixie(unsignedcharLocation,Number){switch(Location){case1:P2_4=1;P2_3=1;P2_2=1;break;case2:P2_4=1;P2_3=1;P2_2=0;break;case3:P2_4=1;P2_3=0;P2_2=1;break;case4:P2_4=1;P2_3=0;P2_2=0;break;case5:P2_4=0;P2_3=1;P2_2=1;break;case6:P2_4=0;P2_3=1;P2_2=0;break;case7:P2_4=0;P2_3=0;P2_2=1;break;case8:P2_4=0;P2_3=0;P2_2=0;break;}P0=NixieTable[Number];Delay(1);  //保持显示,避免变暗​P0=0X00;  //清零进行消影}​voidmain() {while(1){Nixie(1,1);// Delay(500);    //消除延时之后,再加上消影功能就可以实现同时显示Nixie(2,2);// Delay(500);Nixie(3,3);}}

数码管驱动方式:
1.单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间
2.专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么即可
以上代码均为针对单片机直接扫描实现的,while(1)不断循环实现

五、LCD1602(模块化编程开始)


5-1模块化编程


模块化编程:
•传统方式编程:所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路
•模块化编程:把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include "XXX.h"文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等


以Delay函数为例

  • main.c

 #include "Delay.h"voidmain(){Delay(10);}
  • Delay.h

 #ifndef __DELAY_H__#define __DELAY_H__​voidDelay(unsignedintxms);​#endif
  • Delay.c

 voidDelay(unsignedintxms){unsignedchari, j;while(xms--){i=2;j=239;do{while (--j);} while (--i);}}
  • 图示


模块化实现数码管显示

  • main.c

 #include <REGX52.H>#include "Delay.h"#include "Nixie.h"​voidmain() {while(1){Nixie(1,1);// Delay(500);Nixie(2,2);// Delay(500);Nixie(3,3);Nixie(4,4);Nixie(5,5);}}
  • Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__void Delay(unsigned int xms);
#endif
  • Nixie.h

#ifndef __NIXIE_H__
#define __NIXIE_H__void Nixie(unsigned char Location,Number);
#endif
  • Delay.c

#include <intrins.h>void Delay(unsigned int xms)        //@11.0592MHz
{unsigned char i, j;while(xms){    _nop_();i = 2;j = 199;do{while (--j);} while (--i);xms--;}
}
  • Nixie.c

#include "Delay.h"
#include <REGX52.H>unsigned char NixieTable[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};void Nixie(unsigned char Location,Number)
{switch(Location){case 1:P2_4=1;P2_3=1;P2_2=1;break;case 2:P2_4=1;P2_3=1;P2_2=0;break;case 3:P2_4=1;P2_3=0;P2_2=1;break;case 4:P2_4=1;P2_3=0;P2_2=0;break;case 5:P2_4=0;P2_3=1;P2_2=1;break;case 6:P2_4=0;P2_3=1;P2_2=0;break;case 7:P2_4=0;P2_3=0;P2_2=1;break;case 8:P2_4=0;P2_3=0;P2_2=0;break;}P0=NixieTable[Number];Delay(1);P0=0X00;
}

5-2LCD1602调试工具*


LCD1602调试函数模块
不同的LCD1602调试函数代码决定了不同的调试函数以及使用方法
使用时应注意对应的文件函数的异同

函数

作用

LCD_Init();

初始化

LCD_ShowChar(1,1,'A');

显示一个字符

LCD_ShowString(1,3,"Hello");

显示字符串

LCD_ShowNum(1,9,123,3);

显示十进制数字

LCD_ShowSignedNum(1,13,-66,2);

显示有符号十进制数字

LCD_ShowHexNum(2,1,0xA8,2);

显示十六进制数字

LCD_ShowBinNum(2,4,0xAA,8);

显示二进制数字


代码暂略,等后续对头文件以及源代码进行全方面分析之后再复盘补充

六、矩阵键盘


6-1矩阵键盘*


涉及到了施密特触发电路和上拉电阻和下拉电阻,等模电再学一学复盘一下

这里同样使用了前面的LCD1602的调试文件:LCD1602.H、LCD1602.C
编译时会出现WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS的报错,是因为引用的LCD1602的文件中的函数虽然定义了,但是并没有在程序中显式调用到定义过的函数,可以无视,但是会浪费RAM

  • main.c

 #include "DELAY.H"#include "lcd1602.h"#include "Delay.h"#include "MatrixKey.h"​unsignedcharKeyNum;       //定义无符号整型用来接收键码​voidmain(){lcd1602_init();     //初始化LCD1602lcd1602_show_string(0,0,"MatrixKey:");//在第一列第一行显示MatrixKey:while(1){KeyNum=MatrixKey();   //调用函数接收键码if(KeyNum)              //接受到键码则判断键码值并显示{switch(KeyNum){case1: lcd1602_show_string(0,1,"1");break;case2: lcd1602_show_string(0,1,"2");break;case3: lcd1602_show_string(0,1,"3");break;case4: lcd1602_show_string(0,1,"4");break;case5: lcd1602_show_string(0,1,"5");break;case6: lcd1602_show_string(0,1,"6");break;case7: lcd1602_show_string(0,1,"7");break;case8: lcd1602_show_string(0,1,"8");break;case9: lcd1602_show_string(0,1,"9");break;case10: lcd1602_show_string(0,1,"10");break;case11: lcd1602_show_string(0,1,"11");break;case12: lcd1602_show_string(0,1,"12");break;case13: lcd1602_show_string(0,1,"13");break;case14: lcd1602_show_string(0,1,"14");break;case15: lcd1602_show_string(0,1,"15");break;case16: lcd1602_show_string(0,1,"16");break;}}}}
  • MatrixKey.h

#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__unsigned char MatrixKey();#endif
  • MatrixKey.c

 #include <REGX52.H>#include "Delay.h"​unsignedcharMatrixKey(){unsignedcharKeyNumber=0;P1=0xff; // 全部拉高P1_3=0;  //单独留一个低电位进行扫描按键if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}P1=0xff; // 全部拉高P1_2=0;  //单独留一个低电位进行扫描按键if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}P1=0xff; // 全部拉高P1_1=0;  //单独留一个低电位进行扫描按键if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}P1=0xff; // 全部拉高P1_0=0;  //单独留一个低电位进行扫描按键if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}returnKeyNumber;}

6-2矩阵键盘密码锁


所使用的前述模块化列表
LCD1602
Delay
MatrixKey

  • main.c

 #include "lcd1602.h"#include "Delay.h"#include "MatrixKey.h"​unsignedcharKeyNum;   //定义KeyNum用于接收键码值unsignedintPassword,Count;  //定义无符号整型用于存储 密码值 和 密码位数​voidmain(){LCD_Init();LCD_ShowString(0,1,"Password:");while(1){KeyNum=MatrixKey();if(KeyNum){if(KeyNum<=10) //如果S1~S10按键按下,输入密码{if(Count<4) //如果位数不超过设定范围{Password*=10; //向左移动一位Password+=KeyNum%10; //累加密码Count++; //计次加一,确保四位}   LCD_ShowNum(1,1,Password,4); //更新显示}if(KeyNum==11) //确认键{if(Password==2345)  //设定密码为2345{LCD_ShowString(1,14,"OK!");Password=0; //密码清零Count=0;  //计次清零LCD_ShowNum(1,1,Password,4); //更新显示}else{LCD_ShowString(1,14,"ERR");Password=0; //密码清零Count=0;  //计次清零LCD_ShowNum(1,1,Password,4); //更新显示}}if(KeyNum==12) //删除键{Password=Password/10; //删除数字LCD_ShowNum(1,1,Password,4); //更新显示Count--; //计次减少}}}}

七、定时器


7-1定时器


定时器介绍:

51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成

定时器作用:

(1)用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作

(2)替代长时间的Delay,提高CPU的运行效率和处理速度

(3)多任务处理

(…)

STC89C52定时器资源

•定时器个数:3个(T0、T1、T2),T0和T1与传统的51单片机兼容,T2是此型号单片机增加的资源

•注意:定时器的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的定时器个数和操作方式,但一般来说,T0和T1的操作方式是所有51单片机所共有的

定时器框图

定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号,每隔“一秒”,计数单元的数值就增加一,当计数单元数值增加到“设定的闹钟提醒时间”时,计数单元就会向中断系统发出中断申请,产生“响铃提醒”,使程序跳转到中断服务函数中执行

定时器工作模式

STC89C52的T0和T1均有四种工作模式:

模式0

13位定时器/计数器

模式1

16位定时器/计数器(常用)

模式2

8位自动重装模式

模式3

两个8位计数器


工作模式1(16位定时器/计数器)框图:

  • SYSclk:系统时钟,用来产生固定频率的脉冲(晶振电路)来使后面的计数器的技术值累加,此时作定时器使用,

  • MCU in 12T/6T mode:分频模式,例如当晶振频率为12MHz,采用MCU in 12T mode时,产生的脉冲频率就是1MHz

  • T0 Pin:外部接口,当由外部接口来提供脉冲时,作计数器使用

  • C/T非:配置寄存器时若其对应的控制字为1,则为Count计数器模式,为0,则为Time定时器模式

  • TH0和TL0:Time High 0和Time Low 0,代表了定时器的高位和低位,后面的0表示计时器0,计数器共十六位,最大计数值为65535

  • TF0:Time Flag 0,表示计时器0的标志位,当达到最大技术值后,下一次计数就会溢出,产生脉冲传送到标志位从而影响后面的Interrupt,从而申请中断

51单片机入门教程学习笔记相关推荐

  1. 51单片机入门教程(5)——定时器中断

    51单片机入门教程(5)--定时器中断 一.中断的概念 二.定时器中断 2.1 软件延时的不足 2.2 中断寄存器 2.2.1 中断允许控制寄存器 IE 2.2.2 定时器工作方式寄存器 TMOD 2 ...

  2. 51单片机入门教程(1)——点亮一个LED灯

    51单片机入门教程(1)--点亮一个LED灯 一.什么是单片机 单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU.随机存储器 ...

  3. 51单片机入门教程(6)——外部中断

    51单片机入门教程(6)--外部中断 一.外部中断 1.1 中断 1.2 外部中断 二.中断优先级 一.外部中断 1.1 中断 关于中断的概念在上一篇博客中已经提到了.(传送门:51单片机入门教程(5 ...

  4. 51单片机入门教程(3)——数码管显示

    51单片机入门教程(3)--数码管显示 一.LED数码管简介 二.数码管静态显示 三.数码管动态显示 特别鸣谢:HFUTer-朱聪强 一.LED数码管简介 LED数码管(LED Segment Dis ...

  5. b站江科大自化协51单片机入门教程笔记(2)

    文章目录 6-1 矩阵键盘 6-2 矩阵键盘密码锁 7-1 定时器 7-2 按键控制LED流水灯 & 定时器时钟 独立按键模块 定时器模块 8-1 串口通信 8-2 串口向电脑发送数据 &am ...

  6. b站江科大自化协51单片机入门教程笔记(1)

    文章目录 1 综述 2-1 点亮一个LED 2-2 LED闪烁 2-3 LED流水灯 2-4 LED流水灯PLus 3-1 独立按键控制LED亮灭 3-2 独立按键控制LED状态 3-3 独立按键控制 ...

  7. 51单片机入门教程(1)——如何建立工程

    目录 1.Keil篇 2.Proteus篇 3.小结 由于大家可以在本网站上找到很多安装keil和protues的教程,在此我就不再赘述.当大家都顺利安装好这两个软件之后,下面我们来学习如何建立新工程 ...

  8. 51单片机入门教程(3)——数码管显示学号

    目录 1.数码管简介 2.静态显示 3.动态显示 4.小结 相信经过了流水灯的实现,大家已经弄清楚了Keil和Proteus是如何联动使用的,并且对51单片机也有了一定的认识,在这一章里,我带大家利用 ...

  9. 微信小程序入门教程学习笔记

    写在前面: 作为一个刚刚入坑微信小程序的小白,以下是我在学习中的笔记,因为我真的太健忘了... 文章中可能会有错误,但是我会不断的修正的. 谢谢浏览,如有错误烦请指正 (≧∀≦)ゞ 微信官方的小程序开 ...

最新文章

  1. 【UVALive 4642】Malfatti Circles(圆,二分)
  2. malloc、calloc、realloc的区别
  3. 香河php程序员_失控的香河最流行的四大职位
  4. Java面向对象之USB接口实例
  5. 框架:Mybatis开发规范及输入输出映射配置时注意事件
  6. 浅析C++利器之——引用
  7. javascript-排序算法
  8. GC算法-标记压缩算法
  9. leetcode —— 24. 两两交换链表中的节点
  10. 惠普谢少毅:网络攻击威胁在线交易
  11. DEM数据下载、镶嵌等问题
  12. Matlab plot3显示成平面图像
  13. 学3D建模需要什么基础?
  14. 数据结构-六度空间(模拟六度分隔理论)
  15. android lt;webview,Android WebView使用基础 – 圣骑士wind – 博客园
  16. WKID对照表:Projected Coordinate Systems
  17. 开源数字绘图工具Krita 2.8发布
  18. 您无法登录,因为您使用的登录方法......
  19. 计算机未连接到网络,电脑未连接到一个互联网的问题,解决网络问题方法
  20. d-ary heap实现一个快速的优先级队列(C#)

热门文章

  1. python语言中缩进为几个空格_python每级缩进都只能使用四个空格。一个判断题,对不对?...
  2. 金山词霸在360极速浏览器下不能取词
  3. 广告公司内部流出版:互联网广告作弊的十八般武艺
  4. ES中实现分页查询数据并返回想要的字段
  5. 怎样在Word任意图形插入图片
  6. Java毕设项目软考在线题库系统(java+VUE+Mybatis+Maven+Mysql)
  7. Mac MAMP修改mysql配置文件my.cnf,修改PHP配置文件php.ini
  8. 时间显示-蓝桥杯真题-python解法
  9. 无限级分类的数据库设计
  10. 九、CentOS7安装HDF5