目录
一、开发前准备
二、点亮LED
三、LED闪烁
四、LED流水灯
五、LED流水灯plus
一、开发前准备
开发工具软件
烧录软件
其次还需要一块51单片机学习开发板及原理图
keil创造project文件及开启生成.hex文件
二、点亮LED
看二位进制对照原理图;
#include <REGX52.H>
void main()
{
P1=0xFE;
}
三、LED闪烁
了解数据类型
在STC-isp中,在软件延时计算器中;
生成C代码后;复制粘贴到keil中;
添加头文件;延迟函数头文件;
include<INTRINS.H>
循环向左递位
运行main.c;生成.hex文件,用烧录文件进行烧录;
#include <REGX52.H>
sbit p1_1=P1^0;
unsigned int a;
void main()
{
while(1)
{
a=50000;
p1_1=0;
while(a--);
a=50000;
p1_1=1;
while(a--);
}
}
四、LED流水灯
调用延迟函数返回参数;
-
初始化
temp
变量为0xfe
,这表示P1端口的高7位是高电平,最低位是低电平。如果P1端口连接了8个LED灯,这意味着除了最右边的LED灯外,其余的LED灯都是关闭状态。 -
在主循环中,使用
_crol_
内建函数将temp
的值循环左移一位。这个操作会将temp
最低位的值移动到最高位,其余位向左移动。因此,每次调用_crol_
后,temp
的值都会改变,使得下一个LED灯被点亮。 -
调用
delay
函数来实现延时。这个延时确保LED灯的点亮和熄灭足够慢,从而形成流水灯的动态效果。 -
更新P1端口的值,将
temp
的当前值输出到P1端口,这样LED灯的状态就会根据temp
的值改变。 -
重复步骤2到4,形成一个连续的流水灯效果。
//Á÷Ë®µÆ
#include <REGX52.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar temp; //8λÎÞ·ûºÅ×Ö·ûÐÍ
void delay(uint z)//ÑÓʱº¯Êý£»µ÷ÓòÎÊý£»ºÁÃ룻
{
uint x,y;
for(x=100;x>0;x--)
for(y=z;y>0;y--);
}
void main()
{
temp =0xfe;
P1=temp;
while(1)
{
temp=_crol_(temp,1);
delay(600);
P1=temp;
}
}
五、LED流水灯plus
用生成1ms的函数来实现流水灯,这样就不需要一个一个换数了,和上面类似
#include <REGX52.H>
#include <intrins.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)
{
P1=0xfe;//1111 1110
Delay1ms(100);
P1=0xfd;
Delay1ms(100);
P1=0xfb;
Delay1ms(100);
P1=0xf7;
Delay1ms(100);
P1=0xff;
Delay1ms(100);
P1=0xef;
Delay1ms(100);
P1=0xdf;
Delay1ms(100);
P1=0xbf;
Delay1ms(100);
P1=0x7f;
Delay1ms(100);//0111 1111
}
}
这代码用于8051微控制器的C语言程序,实现了一个简单的LED流水灯效果。
1. `#include <REGX52.H>` - 包含针对AT89C52(一种8051系列微控制器)的寄存器定义和特殊功能寄存器(SFR)的头文件。
2. `#include <intrins.h>` - 包含一些内建函数的头文件,比如`_nop_()`(空操作,用于延时)。
3. `void Delay1ms(unsigned int xms)` - 定义了一个名为`Delay1ms`的函数,它接受一个无符号整型参数`xms`,表示需要延时的毫秒数。
4. `unsigned char i, j;` - 在`Delay1ms`函数内部声明了两个无符号字符变量`i`和`j`,用于实现延时。
5. `while(xms)` - 一个循环,当`xms`不为0时继续执行。
6. `i = 2;` - 将`i`初始化为2。
7. `j = 239;` - 将`j`初始化为239。
8. `do { ... } while (--i);` - 一个`do...while`循环,内部是一个`while`循环,执行`j`次,每次`j`递减直到0,然后`i`递减。这个循环用于实现微秒级的延时。
9. `while (--j);` - 内部的`while`循环,直到`j`递减到0。
10. `xms--;` - 每次外层循环结束时,`xms`递减1。
11. `void main()` - 主函数的开始。
12. `while(1)` - 一个无限循环,使得程序持续运行。
13. `P1=0xfe;` - 将P1端口的值设置为`0xfe`(二进制`11111110`),如果P1端口连接了LED灯,这将点亮除了最右边的LED之外的所有LED。
14. `Delay1ms(100);` - 调用`Delay1ms`函数,延时100毫秒。
15. 接下来的几行代码重复上述步骤,但是每次将P1端口的值设置为下一个二进制数,实现LED灯逐个点亮的效果。
16. `P1=0xff;` - 将P1端口的值设置为`0xff`(二进制`11111111`),所有LED灯都熄灭。
17. 最后几行代码是将LED灯从最左边开始逐个点亮,直到所有LED灯都亮起。
整个程序通过改变P1端口的输出值,控制连接到P1端口的LED灯依次点亮和熄灭,从而形成一种流水灯的效果。`Delay1ms`函数用于控制每次LED灯状态改变之间的延时,使得流水灯效果更加明显。这个延时函数是基于8051微控制器在12MHz时钟频率下的实现,实际延时效果可能需要根据具体的时钟频率进行调整。