学习笔记_at89c52
单片机上的LED实现流水灯
原理图和理解
单片机的原理图
LED模块的原理图
LED模块的用电源VCC驱动的化灯会更亮,但是要过电阻限流防止烧坏LED模块。
如果让单片机的引脚做驱动LED的话,因为单片机引脚电流小,LED没这么亮。如果为了单片机直接驱动可以通过经过一个芯片,再芯片连接LED
代码和理解
流水灯的最简单的代码
#include <REGX52.H>
#include "delay.h"
void main()
{
while(1)
{
P2=~0x01; //这个是0x01取反以后的二进制数1111 1110
//下面以此类推,不再赘述哈哈哈
Delay_ms(200); //这个控制流水灯的速度,越大越慢
P2=~0x02; //1111 1110
Delay_ms(200);
P2=~0x04; //1111 1110
Delay_ms(200);
P2=~0x08; //1111 1110
Delay_ms(200);
P2=~0x10; //1111 1110
Delay_ms(200);
P2=~0x20; //1111 1110
Delay_ms(200);
P2=~0x40; //1111 1110
Delay_ms(200);
P2=~0x80; //1111 1110
Delay_ms(200);
}
}
“~” 这个符号是取反的意思
比如:0011 1010 这个二进制数,
将 ~0011 1010 以后就得到了 1100 0101
也可以用for循环或者while循坏进行循坏移位来实现
流水灯的其他代码(没有试过的版本嘿嘿)
unsigned char num=0
while(1)
{
for(num=0;num<8;num++)
{
P2=~(0x01<<num);
Delay_ms(200);
}
num=0; //将代码清零,这样子才能从第一个灯再一次循环
}
这个理解就是
第一次循环将 0000 0001 向左边移动 num 位 即 0 位
得到: 0000 0001 取反以后得到 1111 1110 即第一个亮
第二次循环将 0000 0001 向左边移动 num 位 即 1 位
得到: 0000 0010 取反以后得到 1111 1101 即第二个亮
第三次循环将 0000 0001 向左边移动 num 位 即 2 位
得到: 0000 0100 取反以后得到 1111 1011 即第三个亮
同样哈,因为LED是低电平点亮,所以要取反哈
将代码模块化的一些操作
模块的H文件怎么搞
图片步骤
具体的步骤如下
新建一个文件
给你的文件取个名字
然后在H文件内 写下这个
然后在C文件下写下你的模块的代码
h文件下的代码
#ifndef _DELAY_H_
#define _DELAY_H_ //这个就按照delay.h写就可以啦
void Delay_ms(unsigned int ms);//这个是C文件中模块化的
//记得一定要加 分号
#endif
C文件下的代码
void Delay_ms(unsigned int ms) //@12.000MHz
//👆就是这个直接放到H的文件夹中,记得加分号。
{
unsigned char i, j;
for(;ms;ms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}