根段,root,表示没有主函数,main
发光二极管,直插和贴片
大红旗:负极,小红旗:正极。
贴片led:根据箭头区别正负极
电阻:102=1k 10✖️10^2
471=47✖️10^1=470Ω
171=17✖️10^1=170Ω
串联电阻进行限流,别超过LED额定电流。vcc接正极,单片机引脚接负极,才能接通,所以就变成控制单片机引脚输出高低电平,低电平就接通,LED发光,高电平则不通。
单片机电平:TTL电平,规定5v为高电平,低电平为0v
驱动器:增大电流,增大驱动能力,小电流变成大电流。
单片机怎么控制:1.在单片机内部有很多的寄存器,外面的引脚(8位的)有几个是8个引脚为一组的,内部就有几个寄存器。
2.在这个单片机中有P0, P1,P2,P3,四个8个引脚一组的,所以内部有P0, P1,P2,P3四个寄存器。
3.寄存器可以存储此时由CPU传入的指令(高低电平,0和1),然后寄存器,通过一个驱动器(增强电流,增强驱动能力)在引脚初输出高低电平进行LED开关的控制(低电平开,高电平关)。
二.点亮一个灯
每个寄存器都有8个存储的位置,对应各自的8个引脚,都要安装驱动进行增强驱动能力,所以我们想第一个灯亮(第一个灯是最低位),应该给传入 1111 1110的指令。
由于寄存器是8位的,也就是2^8,四位二进制可以由一位十六进制表示,所以使用十六进制表示二进制指令,也就是1111 1110=0xFE,使用比较方便,转换成hex文件,才能识别。
由于(LED灯对应寄存器P2)P2的还没有定义,所以我们要先写有单片机引脚,或者寄存器的头文件,才能识别P2。
#include <REGX52.H>头文件大小写都可
由于单片机是执行完main文件,再重头进行执行,这样重新执行(工作频率高,速度很快,所以看不出来),这样容易产生错误,不如将指令写入while循环中,条件为1,这样会一直执行循环,而不是再重头只想main函数。
三.LED闪烁
我们想LED灯闪烁,只需要开LED灯,后面关掉LED灯即可。也就是P2先为1111 1110,后为1111 1111
P2=0xFE;
P2=0xFF;
但是由于工作频率高,指令代码执行快,所以肉眼是看不出来有LED闪烁的情况,但是可以看出LED亮度比较暗。
我们可以通过延时器,进行闪烁的延时,(延时器:也就是执行其他代码需要用时间,从而延时)
STC下载串口有延时器的代码生成。(将子函数放在main函数之外,直接在main函数里面进行调用即可)。延时函数:执行延时函数的时间是需要延迟的时间。
延时函数里面有一个nop函数,需要加入这个函数的头文件,#include <INTRINS.H>才能执行这个函数。(对延时时间要求严格调用,不严格可以删掉这个空语句)
四.流水灯
在循环内,亮第一个,延时一会,再亮第二个,再延时再亮第三个,从而形成流水灯。
第一个:1111 1110 0xFE
第二个:1111 1101 0xFD
第三个:1111 1011 0xFB
第四个:1111 0111 0xF7
第五个:1110 1111 0xEF
第六个:1101 1111 0xDF
第七个:1011 1111 0xBF
第八个:0111 1111 0x7F
由于每次需要的延时函数,都要去stc里面生成,比较麻烦,所以我们想写一个子函数,传入参数,即可生成参数对应的延时器。
我们在延时函数中传入的参数,必须是无符号整数类型,因为时间全是正的。我们需要先生成1ms的延时函数,因为执行一次这个函数就是1ms,这样我们在外面再套一个while循环,传入xms(要延迟的时间),执行一次,xms减一,当xms=0时,就跳出循环,此时,这个延时器也就运行了,我们需要延迟的时间,从而达到延迟随机指定时间的效果。
xms也称为形参,只是一个形式,和模型一样,具体调用会传入具体参数
注意,每次先执行main函数,然后调用到传入的延时参数是一个具体数值,然后去生成对应的延时器,从而执行延迟的任务。不止可以随机指定一个,还可以在每次调用的时候都选择不同的参数。延时时间长。在延迟的时间里面会继续执行上一个代码,也就是保存上一个灯亮,所以会发现有的灯变慢,有的变快。
P2=0xFE; // 亮第一个 1111 1110
Delay1ms(1000);
// P2=0xFF; // 全部都灭 1111 1111
P2=0xFD; // 亮第二个 1111 1101
Delay1ms(1000);
P2=0xFB; // 亮第三个 1111 1011
Delay1ms(100);
P2=0xF7; // 亮第四个 1111 0111
Delay1ms(100);
P2=0xEF; // 亮第五个 1110 1111
Delay1ms(100);
P2=0xDF; // 亮第六个 1101 1111
Delay1ms(100);
P2=0xBF; // 亮第七个 1011 1111
Delay1ms(100);
P2=0x7F; // 亮第八个 0111 1111
Delay1ms(500);
// 对于延时函数进行改造,不需要重新生成指定时间的延时函数,只传入参数即可生成该延时函数