前要:本笔记为初学者上b站江科大自化协的51单片机入门教程P1-P12所得笔记,包含单片机简介和LED、独立按键、数码管相关内容。

目录

1.1.什么是单片机以及为什么要学单片机?51是什么?

2-1点亮一个LED

2.2LED闪烁

2.3流水灯

3.1独立按键控制LED亮灭

3.2独立按键控制LED状态

3.3独立按键控制LED显示二进制

3.4独立按键控制LED的移位

4-1静态数码管显示

4-2动态数码管显示(多位显示的原理就是动态模糊)


1.1.什么是单片机以及为什么要学单片机?51是什么?

1. 单片机介绍与WHY要学单片机

单片机,Micro Controller Unit ,简称MCU

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

单片机的任务是信息收集(依靠传感器),处理(依靠CPU),和硬件设备(eg.电机,LED等)的控制。

那WHY要学单片机?

单片机算是个袖珍版计算机,成本低、体积小,结构简单,在各种生活、工业领域大有所用,(eg.各种带智能的东西,都加入了单片机;红绿灯)同时,学习单片机是了解计算机原理和结构的最佳选择。

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

2.51单片机的基础信息

如图在淘宝选择,然后得到了牌子名为STC89C52RC 401-PD1P40

所属系列:51单片机系列

公司;STC公司

位数:8位

RAM:512字节//随机,易掉,内存,又称运行内存

ROM:8K (flash)//只读,相当于仓库,存储

工作频率:12MHZ

3.STC89C52系列的命名规则

4.STC89C52的内部结构和原理图

5.使用单片机前需要的软硬件设备

一台不错的电脑、以及

2-1点亮一个LED

一.四步走(初始化代码——敲代码——保存代码——运行代码)

1.初始化代码

a.进K5,建文件,设型号

建一个新工程是先新建一个文件夹(方便保存工程文件并查找),再起名其文件为任意名(固定Project是个好主意)

型号输AT89C52RC(因为K5没与STC合作,但AT厂所做和STC类似,所以用AT就行)

b..导入C语言

右键Source Group1,选C,名main(不必纠结,起一个固定的就行)

//c.使用C之前的一些了解和调整(往后四步走就不包此了)

//左上角三个按钮分别是编译 建立 所有文件重新编译和建立

2.敲代码

a.输入目录

右键选择

b,开敲

c,用F7 (建立)检查是否No error以及No wrong

3.保存代码

处点OUTPUT,点create HEXfik(每建立一个工程都有这样)

然后F7重装即保存

4.运行代码

打开Lsp,设好芯片型号STC89C52RC(以后不用再设),打开程序文件(在文件夹的Object文件夹中),下载/安装,双击单片机按扭键重启

二.关于LED

1.LED介绍——发光二极管

内部小三角形表示正级VCC

大梯形表示负极GND

2.开发版中的LED

VCC表正级(高电频) ,高电频用1表示

GND表负极 (低点频),低电频用0表示

开发版的原 理图

CPU通过配置这些控制的寄存器,来控制硬件电路,硬件电路来完成我们想要完成的功能。

三.点亮一盏灯

结合LED的原理图

如点亮第一盏

就是让P2中P2-7为0 是也就是1111 1110 (注意代码是从p27到P20

就给P2(P大写!)寄存器输入此2进制码,但由于k5无法直接识别二进制码,要转化为16进制码

口诀  四位一格 8421  10以上A到F  

然后就按代码四步走运行即可

#include <REGX52.H>void main()
{P2=0xFE;  //1111 1110while(1){}
}

2.2LED闪烁

常规代码四部走 其中代码内部:

1.用

void main()
{P2=0XFE;P2=0XFF;//1111 1111}

但我们发现 P2只会闪一下 因为这里P2值无法再变为亮 所以用循环while(1){}来是指循环

实现闪烁

void main()
{while(1){P2=0XFE;P2=0XFF;//1111 1111}
}

2.

但我们发现 这样反倒约等于没闪 因为代码运行太快 人眼看不见闪烁

所以要设延时

3.how调——总思路:在亮和灭后面各加延时500ms(0.5s)

在stc软件找到延时计算机——设定时长度为500ms 系统频率为12MHZ,指令集为stcy——点击复制代码——copy到main前作为函数——完善代码(去掉_nop_)——将Delay 500ms ();放到开与关后即可

#include <REGX52.H>
#include <INTRINS.H>void Delay500ms()     //@12.000MHz
{unsigned char i, j, k;_nop_();i = 4;j = 205;k = 187;do{do{while (--k);} while (--j);} while (--i);
}void main()
{while(1){P2=0XFE;Delay500ms();P2=0XFF;//1111 1111Delay500ms(); }
}

2.3流水灯

1.将闪烁的代码打一遍之后,copy down P2,然后更改0的位置,再转16进制即可

#include <REGX52.H>
#include <INTRINS.H>  void Delay500ms()       //@12.000MHz
{unsigned char i, j, k;_nop_();i = 4;j = 205;k = 187;do{do{while (--k);} while (--j);} while (--i);
}void main()
{while(1){P2=0xFE;//1111 1110Delay500ms();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.改进(不想总是为了改变延长时间而去一直要复制代码

设万能代码——弄Delay1ms的函数——加入变量xms作为参数加入Delay1ms()中,再j加上while(xms){延时一秒的代码;xms--;}   ——这样就完成了Delay1ms的代码

然后在main中使用Delay(100);就行。

#include <REGX52.H>void Delay1ms(unsigned int xms)     //@12.000MHz
{unsigned char i, j;while (xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}
}void main()
{while(1){P2=0xFE;//1111 1110Delay1ms(1000);P2=0xFD;//1111 1101Delay1ms(1000);P2=0xFB;//1111 1011Delay1ms(100);P2=0xF7;//1111 0111Delay1ms(100);P2=0xEF;//1110 1111Delay1ms(100);P2=0xDF;//1101 1111Delay1ms(100);P2=0xBF;//1011 1111Delay1ms(100);P2=0x7F;//0111 1111Delay1ms(100);}
}

3.1独立按键控制LED亮灭

1.独立按键的介绍

2.版中的独立按键

按键在上电时默认高电频,按下变低电频,再松手变回高电频。

3.如何控制呢?

#include <REGX52.H>void main()
{while (1){if (P3_2==0 ){P2_0=0;}else {P2_0=1;}}}

远程操纵灯和按键的方法就是代码的链接

4.一些备用知识——C51:51中的C语言

具体的C知识见C的笔记,这里将概述放出:

1.C51数据类型;

2.C51数据运算

算术:+-*/%=

判断:>,>=,<,<=,==,!=

逻辑:

&&  逻辑与

||    逻辑或

!     逻辑非

位运算:(C中少见)

<<  按位左移

>>  按位右移

&  按位与

|  按位或

^  按位异或

~  按位取反

3.c51基本语句

任何复杂程序均可由3种关系组成

选择;if switch case(强制选择,多重判断)

循环:while;for(可以控制循环次数)

顺序:直接写

3.2独立按键控制LED状态

1.按键的抖动和消抖

对于机械按键而言,当机械触点断开、闭合时,

2.为什么要消抖

我们平时按按钮,其实一般都是电脑按下不操作,松手才操作。所以得消抖

#include <REGX52.H>void Delay(unsigned int xms)        //@12.000MHz
{unsigned char i, j;while(xms){i = 2;j = 239;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显示二进制

1.加入.按键控制的函数

2.本想X+1 然后取反输出实现二进制

但是这样

1111 1111+1=0000 0000  ~0000 0000=1111 1111 出现了自循环

所以要引一个参数来操作

#include <REGX52.H>void Delay(unsigned int xms)        //@12.000MHz
{unsigned char i, j;while (xms--){i = 2;j = 239;do{while (--j);} while (--i);
}}void main()
{unsigned char LEDNum=0;
while(1){if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);LEDNum++;P2=~LEDNum;}}
}

3.4独立按键控制LED的移位

1.常规初始化 导入和修改Delay函数,加上独立按键板块

2.核心代码

a.设寄存器

b.探讨how移位(单按键运用取反和<<

#include <REGX52.H>void Delay(unsigned int xms)        //@12.000MHz
{unsigned char i, j;while (xms--){i = 2;j = 239;do{while (--j);} while (--i);
}}unsigned char LEDNum=0;
void main()
{P2=~0x01;while(1){if(P3_1==0){Delay(20);while (P3_1==0);Delay(20);LEDNum++;if (LEDNum>=8){LEDNum=0;}       P2=~(0x01<<LEDNum);}     }}

c.双按键  运用--和<<

#include <REGX52.H>void Delay(unsigned int xms)        //@12.000MHz
{unsigned char i, j;while (xms--){i = 2;j = 239;do{while (--j);} while (--i);
}}unsigned char LEDNum=0;
void main()
{P2=~0x01;while(1){if(P3_1==0){Delay(20);while (P3_1==0);Delay(20);LEDNum++;if (LEDNum>=8){LEDNum=0;}       P2=~(0x01<<LEDNum);}     if(P3_0==0){Delay(20);while (P3_0==0);Delay(20);if (LEDNum==0){LEDNum=7;}else{LEDNum--;}         P2=~(0x01<<LEDNum);}}}

4-1静态数码管显示

1.数码管介绍

2.数码管引脚定义

1个里8个灯(共阴或者共阳 意思是八个灯接在同一个阴极或者阳极

a.如何一个管亮出一个数字 对应的地方亮就行 如

亮6,就是AEFDCG亮, B为灭

b.四位一体的数码管

c.动态数码管——视觉暂留效应(先不解释,往后看)

3.数码管原理图(含138和74H245)

a.我们是共阴极——LED1-8都连在同一个阴极,调整的就是调阳极

b.138译码器

就是选择LED灯的东西,CBA的十进制代码和Y的2进制代码对应,通过输入CBA代码,选择哪盏或者哪些LED亮

c.74HC245双向数据缓冲器

用处:简单理解成原封不动送P0到LCD

d.里面的电容器 ——稳定电源供电

e,限流电阻

总结:选LED口(挑一个灯亮)——给段码(亮灯里面的哪些部分)——亮

4.铺垫——C51知识(同理,主要还是看C的笔记,这里只写作用)

a.数组:数组的目的是通过数组名加索引号简单快捷的操作大量数据。

b.子函数:子函数的目的是实现代码的复用和优化程序结构。

5.如何在数码管上一个灯显示数字6呢?

1.让灯通电   2.让灯显示六

3.使用子函数优化,使得所输位置和所需数字即可显示

#include <REGX52.H>unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};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];}void main()
{NiXie(1,3);while (1){}}

4-2动态数码管显示(多位显示的原理就是动态模糊)

目的:123位分别显示1 2 3

1.常规初始化和单数字的代码

2.补上代码:复制P0——单数字代码进while(不断扫描,因为P0在不断变,不扫描无法显示)——加延时——感受延时变短的动态模糊(200ms——20ms——0)——然而去掉之后会有影子

影子何来?

在位选 段选 位选 段选 的衔接下 代码出现了重叠影

3.所以要用延时和清0来消影

#include <REGX52.H>unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};void Delay(unsigned int xms)        //@12.000MHz
{unsigned char i, j;while (xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}
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;}void main()
{while (1){NiXie(1,1);
//      Delay(20);NiXie(2,2);
//      Delay(20);NiXie(3,3);
//      Delay(20);}}

4.数码管驱动方式

Autoleaders控制组——51单片机学习笔记相关推荐

  1. AutoLeaders控制组—51单片机学习笔记

    文章目录 AutoLeaders控制组-51单片机学习笔记 1.1单片机及开发板介绍 单片机介绍 单片机应用领域 STC89C52单片机 内部结构 开发板介绍 2.1点亮一个Led 新建工程 编程 认 ...

  2. AutoLeaders控制组——51单片机学习笔记(AD/DA、红外遥控)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...

  3. AutoLeaders控制组—51单片机学习笔记(LED控制、独立按键、数码管)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 根据测试,目 ...

  4. AutoLeaders控制组——51单片机学习笔记(定时器、串口通信)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...

  5. AutoLeaders控制组——51单片机学习笔记(蜂鸣器、AT24C02芯片)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...

  6. AutoLeaders控制组——51单片机学习笔记(模块化编程、LCD_1602、矩阵键盘)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...

  7. AutoLeaders控制组——51单片机学习笔记(DS18B20温度传感器、LCD1602、直流电机+PWM)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...

  8. AutoLeader控制组——51单片机学习笔记(一)

    目录 1.点亮LED灯 1.1LED灯闪烁 1.2控制LED灯按时闪烁: 1.3 LED灯流水灯 1.4二进制点灯 2.独立按键控制LED灯 2.1按键控制LED亮灭 2.2.按键控制灯左右移动 3. ...

  9. 51单片机学习笔记-1简介及点灯

    51单片机学习笔记 文章目录 51单片机学习笔记 1. 51单片机简介 1.1 安装软件 1.2 单片机简介 2. LED灯 2.1点亮一个LED 2.1.1原理分析 2.1.2 创建工程 2.2LE ...

最新文章

  1. 我的Python分析成长之路8
  2. ControlButton按钮事件
  3. JavaScript强化教程-JS面向对象编程
  4. windows安装anaconda_[计算机科学工具系列] Anaconda和conda
  5. OpenCASCADE:Modeling Algorithms模块几何工具之来自约束的曲线和曲面
  6. 迟到的 cocoapod 版本适配 之网利宝
  7. java使用内部类的好处及其初始化
  8. Interllij IDEA启动Jrebe因为中文路径失败
  9. 数据库与表的操作之创建、修改和删除数据
  10. jQuery学习: 实现select multiple左右添加和删除功能
  11. 史上最全的微信小程序代码大全分享
  12. SAP 软件价格体系及SAP项目实施费用构成介绍
  13. 杰里之 2M 的 SDK 开蓝牙一拖二出现奇怪的问题【篇】
  14. uint和int的区别
  15. 【清北学堂济南刷题班】集合
  16. 2.前端笔记-JS-JS3种书写位置、注释、输入输出
  17. 零基础开发WIFI设备(esp8266)
  18. vue封装一个3D轮播图组件
  19. JS + Echarts实现中国地图 China.js
  20. 安全集成服务资质是什么都有哪些等级?申请安全集成服务资质认证有什么好处?

热门文章

  1. opencv - 简介
  2. python 中文乱码处理分析过程
  3. ICP许可证 [互联网信息服务业务]
  4. Matlab的基本语法和常用函数总结
  5. 一文搞懂常用的网络概念:域名、动态IP、DNS、DDNS
  6. Proteus8仿真:51单片机IrLink红外发送加接受模块的使用
  7. Google Earth Engine(GEE)——在线计算列表二维ee.List对象为线性回归方程计算slope和残差
  8. python的DDT模块
  9. 单片机c语言编程规则,单片机C语言编程规则
  10. 软件工程师,用100天时间让CSDN粉丝数从0狂飙到10000