快捷导航

[开源教程] 萝丽单片机课程--知识点汇总

  [复制链接]
发表于 2016-9-13 15:01:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册成为模友吧会员

x
本帖最后由 枫飞秋语 于 2016-9-19 17:48 编辑

知识点(1) #include<reg51.h>
#include<> 是包涵、调用的意思。
reg51.h 是51单片机的寄存器声明文件。
合起来的意思就是调用51单片机的头文件。我们初学单片机,对这个不用深究,只要知道在程序第一行这样写就行了。

知识点(2) main函数
包括main()和main下的大括号。就是主函数的意思。
当单片机一通电,程序就会从主函数里面的第一行开始,一行一行的执行,走完了以后重新开始

知识点(3)while(1)循环
上面说了,如果程序走完了,单片机就会复位重新走。我们如果不希望程序被走完呢?
那就用while(1),把程序卡住。
while(1)就代表一个无限循环,它的括号里面的程序会被反复执行,程序永远不会走完。

知识点(4) 延时函数原理
可以看到自动生成的延时函数里有很多密密麻麻的东西,不要感到恐惧,其实它就是靠反复执行那些无用的东西浪费时间,才有了延时效果。

知识点(5) 声明函数
在函数调用之前,要先声明,所以要放在主函数之前。(感觉应该是这个 void,萝丽老师没注明.)

知识点(6) 调用函数
只有在程序中调用了函数,它才会实际生效。

知识点(7) 程序注释
这段函数什么意思?如果怕自己忘了或别人看不懂,可以在函数中添加注释,注释可以用汉字。
格式:
//注释内容
具体原理是:“//”符号后面的东西Keil软件就当做不存在,只有人类才能看见哦

知识点(8) VCC、GND
GND是地,代表电源的负极,VCC就是电源正极了。根据不同的芯片型号,可以接3~5V。

知识点(9) P3.0、P3.1、……
P代表端口的意思,单片机有多个端口,如P0、P1、P2、P3等。
每个端口有8只引脚,对于端口3,有P3.0、P3.1、P3.2、P3.3、P3.4、P3.5、P3.6、P3.7。
这个单片机只有可怜的几个引脚,所以就只能用其中一部分啦。
这些引脚还有一些别的名称,那是额外的功能,暂时无需知道。

知识点(10) 高电平 低电平
在单片机术语中,只有真和假、1和0的概念,对应于引脚的输出,也只有高电平和低电平两种。
如果我们在程序中是1,单片机实际的输出就是高电平,接近单片机的电源电压5V;
如果我们在程序中是0,单片机实际的输出就是低电平,大概0V;

知识点(11) 引脚驱动能力
单片机输出低电平时,能提供的电流大概20ma。
单片机在输出高电平时,电流就很小了,不到1ma。(也有别的模式,这个以后会讲)
(单片机在通电后,引脚的默认输出都是高电平)
也就是说,单片机直接驱动的话,20ma点亮个发光二极管还行,想驱动上百ma电流的大功率灯珠,就要加放大器了。

知识点(12) 单片机控制三极管
如果你高中的物理知识还没有全部还给体育老师,那么你应该知道,三极管可以放大电流。
看下面这个电路图,如果单片机输出低电平0V,没有电流流过,自然也不能放大,LED不发光,我们可以定义一下:低电平关闭三极管。
如果单片机输出高电平5V,经过电阻以后,会有一个很小的电流流过,三极管放大电流,LED发光,同样可以定义:高电平打开三极管。
简单的估算:假设经过电阻的电流是1ma,三极管放大150倍,大概就是150ma电流。也就是说通过调节电阻的大小,可以控制灯珠的最大亮度。




知识点(13) 引脚定义    sbit LED1=P3^2;
引脚定义格式:sbit 名称=引脚标号;
想要控制一个引脚,必然要先定义一个引脚,这句话的意思就是将单片机P3.2引脚取了一个别名LED1,以后你只要在程序中写上LED1,代表的就是这个引脚。

知识点(14) 引脚控制    LED1=0;
如此只要在程序中写上LED1等于0、等于1,就能随心控制引脚输出的电压啦,快来试试吧。

知识点(15) while(?)循环
while(?){} 当?的值是“真”的,括号里的程序会一直执行;当?的值是“假”的,括号里的程序程序不再执行。
什么是真?大于0的数都是真的,1是真,1000也是真。什么是假?0就是假。
如果我们想要循环1000次,可以while(1000),循环一次,变成while(999)……到最后,变成while(0),自然循环就停止了。

知识点(16) unsigned int n; 变量定义
想要一个数从1000减到0,就先要定义这个数。
unsigned int   定义变量的关键字,意思是定义一个数,范围是0到65535。
unsigned int n;定义了n这个数。n只是一个名字,你也可以写成abc等都可以。

知识点(17) 1000次循环的程序实例
n=1000;
while(n)
{
    //被循环的程序
    n=n-1;//每循环一次n减小1
}

知识点(18) 定义延时n毫秒函数实例
void delay_n_ms(unsigned int n)//括号里面有值代表有参数的函数,在调用这个函数时,可以顺便写n的大小。
{
    while(n)           //注意什么地方有分号,什么地方没分号
    {
        Delay1ms();
        n=n-1;//每循环一次n减小1
    }   
}

知识点(19) 调用带参数的函数
delay_n_ms(1000);    //在调用时,1000这个值就传递给了n

知识点(20) 按键的工作原理:
单片机引脚设置为高电平,通过按键接到地。
按键没有按下:单片机引脚还是高电平;
按键被按下:单片机引脚接地,变成低电平。程序读一下引脚电平就可以知道有没有按下。

知识点(21) 为什么通常按键接地
单片机的引脚在默认模式下,引脚内部是串联一个电阻接到正极的,当你的按键导通时,电流很小,不会有什么影响。
但是单片机的低电平是没有接电阻的,如果你用按键连到正极,可能会损坏引脚。
程序如何读引脚的状态?同样,要想先读引脚,也要先定义才能用,在我们焊接的电路中,一个按键接在P3.0引脚上:
sbit Key1=P3^0;
定义之后,不仅可以控制,还可以读。

知识点(22) if判断语句
if(?){ 1 } 如果?是真的,执行括号1里面的程序
else{ 2 } 否则就执行2里面的程序
单片机有哪些语句?循环和判断,无非就这两种,所有复杂的程序都是这两个组合起来的。

现在你已经都学了,是不是感觉单片机其实也没那么复杂?

知识点(23) =和==
等于 和 是否等于。
单片机语言中,有两种等于号,这点务必分清。
n=1000; n等于1000,是向n写入1000
n==1000; n是否等于1000?是对n进行判断。

知识点(24) 判断引脚状态的程序实例
if(Key1==0)  //如果按键按下,引脚读到低电平
{
    LED_R=1;
    LED_G=0;
    LED_B=0;  //亮红灯
}
else
{
    LED_R=0;
    LED_G=1;
    LED_B=0;  //否则亮绿灯
}


知识点(25) 单片机的运行与“时间片”
首先要知道,单片机能干什么?我们的电脑CPU实际上也可以看成是一个速度超快的单片机,它能一边挂QQ、一边看网页、一边打游戏,它是不是可以同时处理很多任务?NO,事实上,单片机同一时间,只能做一件事,CPU只是聪明的划分出了很多很小的“时间片”,一个很短的时间内,只执行QQ,另一个很短的时间内,只执行游戏,一秒钟内“时间片”切换几十次,看起来就像是同时在做多种事了。这种方式是单片机最正确的处理方式,以后在考虑程序时,先从时间片角度出发!
我们现在的任务很简单,检测按键,然后改变颜色,现在还用不到时间片这么高大上的东西,但对检测周期还要有一个概念:人类按一次按键大概需要0.3秒,我们大概每0.15秒检测一下按键就能满足需要。

知识点(26) 如何区分多种状态
我们的七色光芒有七种颜色,如果算上熄灭,至少有8种状态,怎么用程序对应8种状态呢?
你需要先定义一个数据:比如mode;如果mode等于0,代表熄灭,mode等于1,代表红色……mode不同的值就能代表不同状态。

知识点(27) unsigned char mode;
unsigned char 是定义数据的关键字,代表定义一个大小是0~255的数。255种模式,够用了吧。

知识点(28) 全局变量
我们定义的mode在整个程序中都会用到,所以需要定义在程序开头,它就叫做全局变量。

知识点(29) PWM的简单解释
单片机只能输出高电平、低电平,5V供电时高电平就是5V,有没有办法输出2.5V呢?虽然不能直接输出2.5V,但可以用等效的概念:
假设在1秒钟内,前半秒是高电平(5V),后半秒是低电平(0V),那一秒内的平均电压是多少?平均电压就可以当成2.5V。
LED如果半秒亮半秒灭肯定会感到明显的闪烁,那如果加快时间呢?
假设在10ms内,前5ms亮,后5ms灭。一秒钟有100个10ms,相当于显示器的100帧,人眼只能看到30帧的画面,这样就在你没有发现闪烁的情况下,LED亮度变成了原来的一半!
PWM的真相就是这样,非常快的高低电平切换,欺骗了你的眼睛。

知识点(30) 用PWM调节亮度
PWM有两个关键词:周期和占空比。
周期:前面举的例子,10ms一个循环,10ms就是PWM周期。对应的频率是100Hz。
占空比:一个周期内,高电平时间的比例。10ms内高电平5ms,占空比就是50%。对应的LED亮度就是50%。
显然,调节占空比就可以改变亮度:10ms内高电平2ms,低电平8ms,占空比20%,亮度变成20%。



 楼主| 发表于 2016-9-13 15:01:39 | 显示全部楼层
本帖最后由 枫飞秋语 于 2016-12-28 23:03 编辑

知识点(31) 基于跳变的按键检测

跳变式的按键检测不用死等,不浪费程序运行时间,每隔一段时间看一下即可,间隔10ms~100ms都行。而且抗干扰,按键抖动也不影响。

知识点(32) flag标志位
程序读引脚只能读到现在的电平,如何同时读到过去和现在,比较低—高的跳变?
回到过去肯定是不可能的,所以你需要把过去的电平保存下来。
你可以定义一个数:比如 old,如果出现低电平,让old=0。这里old就是一个指示过去电平的标志位。
简单的语句之所以能够组成复杂的程序,完全是各种标志位在起作用,控制着程序走向,学会用标志位才是你走向高手的第一步。

知识点(33)求最小时间片
多个程序对时间的需求是不一样的,要想组合两个程序,就要找到他们的最小时间片。
现在我们有两个程序,按键程序每10ms执行一次,PWM程序每1ms执行一次,所以最小时间片就是1ms!

知识点(34)确认系统循环周期
while(1)每循环一次,所有程序执行一遍,相当于系统的一个循环,循环周期就是最小时间片1ms。

知识点(35) 多程序共用最小时间片
很简单的数学问题,按键程序10ms一次,PWM 1ms一次,只要每执行10次PWM后执行一次按键检测即可。

知识点(36) 程序模块化
为了让程序思路更清晰、以后复制写好的程序更方便,你的程序需要模块化。
什么是模块化? 就是实现某个功能的程序尽可能的和其它程序独立,不要杂糅在一起。很多人一想到用按键控制色彩、亮度,自然而然的想到在按键程序里改变引脚、改变PWM等,这样做虽然也能实现,但3个程序被你杂糅成一个复杂的程序,不仅难以理解,改动也困难。

知识点(37) 消息传递机制
如果程序之间独立、模块化了,那怎么发生联系呢?你需要用“消息”喊话,把命令从一个程序传到另一个程序。
“消息”就是你定义的一个变量。比如你定义一个Key1_action,如果检测到按键,就把Key1_action=1,之后所有的程序都可以读一下Key1_action,读到1就知道按键情况了,而不必每个程序都来检测一下按键。

知识点(38) 声明特殊寄存器 sfr P3M0=0xb2;
sfr 是声明寄存器的关键词;
P3M0 是设置P3口输出模式的寄存器;
0xb2 是P3M0这个寄存器的地址。
就跟sbit声明单片机引脚一样,声明之后程序里就可以使用。

知识点(39) <reg51.h>里装了什么
有足够好奇心的话你可以右键reg51、open打开看一看。其实里面都是寄存器声明哦,以后学习会逐个用到。
至于P3M0寄存器,是新型STC单片机新加入的,所以你要自己声明。


知识点(40) P3M0寄存器是什么
什么是寄存器?你可以想象为一个寄存器里有8个小房间,每个房间控制一个引脚,可以装1或者0,1代表打开推挽模式,0代表关。



知识点(41) 设置寄存器
怎么设置?直接写P3M0=0010 0000吗?
当然不是,我们人类用的是10进制,计算机用的是二进制,需要先换算才能正确写。
我知道很多人一想到进制之间的换算就会头晕,所以我推荐你使用电脑自带的强大工具“计算器”
打开Windows计算器工具,选择程序员选项:

点击BIN二进制选项,输入10000,
你会看到DEC十进制选项里已经自动转换成10进制32,所以正确的设置应该是P3M0=32;
同时HEX十六进制选项里也显示了20,写成P3M0=0x20;也是可以的,加上0x代表16进制。

知识点(42) 用while测量低电平时间
while(IR_IN==0)  //如果引脚一直为低电平,一直循环
{
    Delay1ms();
    time=time+1;  //每循环一次,就记录了1ms时间
}
循环程序不仅可以用来延时,还可以用来计时。当引脚变成高电平1时,IR_IN==0就不是“真”的了,
循环自动结束,这时看time的值就知道时间过去多少毫秒了。

知识点(43) && “并且”运算符
if(time>15 && time<25)
两个&&代表“并且”的意思,time大于15,并且小于25,两个都正确才行。
用这样的方式,可以同时判断两个条件

知识点(44) 空操作 _nop_();
delay延时函数中常见Nop(),Nop就是空的意思,也是一行程序,只是单片机什么也没干而已。
当单片机时钟是12MHz时,一个Nop的时间是1/12 us。所以使用Nop可以精确延时。
想要使用Nop,必须在程序开头写上 #include<intrins.h>,否则会报错。

知识点(45) 继电器使用
继电器的线圈吸合需要几十ma电流,单片机的引脚电流是不够的,需要加三极管放大驱动。
使用继电器不仅可以控制低压设备,还可以直接控制220V家电。但高压操作很危险,没有相关经验禁止魔改。
  
知识点(46)数码管结构

数码管的结构很简单,8个LED构成一个数字。如果想要显示“3”,只需要让A、B、C、D、G为高电平(引脚11、7、4、2、5),其余引脚为低电平即可。

知识点(47) sfr ADC_RES=0xBD;  声明 转换结果寄存器
转换出来的分数保存在这个寄存器里,范围0~255。
假如写程序 a=ADC_RES; a就获得转换结果了。

知识点(48) sfr P1ASF=0x9D 声明 P1口模拟功能寄存器

设置P1.7引脚对应的程序是: P1ASF=0x80;

知识点(49) sfr ADC_CONTR=0xBC  声明 模数转换寄存器
.
这个寄存器里面参数较多,不过我们只需要用该用到的就行了,别的暂时不用理会。
寄存器的后三位是引脚选择,000~111,0到7代表P1.0~P1.7引脚。
开始P1.7引脚AD转换,你可以直接设置为 1000 1111,也可以分开再相加 1000 1000+111
对应程序,可以写作 ADC_CONTR=0x8F; 也可以写作 ADC_CONTR=0x88+7;

知识点(50) AD转换例程
P1ASF=0x80;  //设置P1.7引脚
ADC_CONTR=0x88+7;  //开始P1.7引脚转换
Delay50us();   //等待AD转换完成
a=ADC_RES;  //读取转换结果
单片机时钟为12M时,一次AD转换最慢也是45us,所以等待50us即可保证转换完成。

知识点(51) 单片机的除法和余数
/:整除符号。单片机里面,29除以10结果不是2.9,真正的结果没有小数也没有四舍五入,是2;
%:求余数符号。29除10的余数自然是9。
求123的十位的例程:a=123%100/10; //先求100的余数是23,再除以10得2。

知识点(52) sfr P5=0xC8; 声明P5引脚
单片机常用的是P0、P1、P2、P3引脚,系统默认已经声明,新增的P5引脚需要先声明才能用

知识点(53) #define 声明替换
写程序中我们经常遇到要写“unsigned char”这么一长串英文,有没有什么办法能够更简便点?在C程序中,还提供了一种替换机制:
#define A B  //如果声明了这句话,那么以后在程序中写A,编译时会自动被系统替换成B。
利用这个机制,可以简写,比如:
#define u8 unsigned char  //“unsigned char”是0~255的8位二进制数,我们以后可以简写为“u8”
#define u16 unsigned int  //“unsigned int”是0~65535的16位二进制数,我们以后可以简写为“u16”

知识点(54) n++;自己加一
同样是为了简写程序,以后遇到“n=n+1;”这样自己增加1的,可以用两个加号代替:“n++;”
同样的,“n=n-1;”也可以简写为“n--;”

知识点(55) MOS管控制直流电机

控制N沟道MOS管与控制8050三极管类似,都是高电平打开。区别是MOS管是电压控制,不需要接电阻了。













 楼主| 发表于 2016-9-13 15:01:41 | 显示全部楼层
占楼以备更新!
 楼主| 发表于 2016-9-13 15:01:44 | 显示全部楼层
占楼以备更新!
 楼主| 发表于 2016-9-13 15:01:49 | 显示全部楼层
占楼以备更新!
发表于 2016-9-13 18:26:22 | 显示全部楼层 来自苹果客户端来自苹果客户端
太棒了,赞
发表于 2016-9-13 20:28:30 | 显示全部楼层
太棒了,赞                        
发表于 2016-9-13 21:13:54 | 显示全部楼层 来自苹果客户端来自苹果客户端
路过帮顶
发表于 2016-9-13 22:22:58 | 显示全部楼层
学习学习,大家顶起来。。。。。。。
发表于 2016-9-14 00:33:11 | 显示全部楼层 来自安卓客户端来自安卓客户端
厉害啊,得好好学习

发表于 2016-9-15 01:17:39 | 显示全部楼层 来自苹果客户端来自苹果客户端
不懂的人,还是不懂。
发表于 2016-9-15 15:07:29 | 显示全部楼层 来自苹果客户端来自苹果客户端
楼主说的太精彩了!
 楼主| 发表于 2016-9-15 15:57:36 | 显示全部楼层
wlnr9999 发表于 2016-9-15 15:07
楼主说的太精彩了!

好吧,,其实这不是我说的。。。是萝丽老师教程里面的。。只是老师每个课程都写几多,看起来比较麻烦。。我就开个贴,把所有的都整合在一起,这样方便看!
发表于 2016-9-15 16:01:52 | 显示全部楼层
路过帮顶,谢谢楼主,支持分享
发表于 2016-9-19 23:38:56 | 显示全部楼层
大家顶起来,很实用。
发表于 2016-9-20 13:40:23 | 显示全部楼层 来自苹果客户端来自苹果客户端
总结的好
发表于 2016-9-21 09:00:01 | 显示全部楼层
这个总结好!
发表于 2016-9-22 09:01:12 | 显示全部楼层 来自苹果客户端来自苹果客户端
路过顶
发表于 2016-10-17 00:23:57 来自手机 | 显示全部楼层
很好,很简洁

本版积分规则

模友之吧 中国唯一免费送模型网站

反馈建议:2376808768@qq.com

合作伙伴

扫码关注微信公众平台
本站由 承德红璐科技 提供技术支持  Powered by Discuz!©2011-2015 模友之吧 | 冀ICP备13020518号©
快速回复 返回顶部 返回列表