目录
前面,我们已经通过P3进行了8位流水灯的控制,现在我们通过对 P3 口地址的操作流水点亮 8 位 LED。
使用操作寄存器的方式:
(1)首先需要定义 P3 口的地址,即将 P3 口的地址存入一个寄存器中,比如说:
MOV A, #90H ; 将 P3 口的地址 90H 存入 A 寄存器中 MOV R0, A ; 将 A 寄存器中的值存入 R0 寄存器中
(2)然后需要将 P3 口配置为输出模式,这可以通过将 P3CON 寄存器的相应位设置为 1 来实现,比如说:
MOV A, #80H ; 将 P3CON 寄存器的地址 80H 存入 A 寄存器中 MOV R1, A ; 将 A 寄存器中的值存入 R1 寄存器中 MOV A, #FFH ; 将 P3 端口配置为输出模式,即将 P3CON 的第 7 位设置为 1 ANL R1, A ; 将 R1 寄存器中的值与 FFH 按位与运算,将第 7 位设置为 1 MOVX @DPTR, R1 ; 将 R1 寄存器中的值存入 P3CON 寄存器中
(3)接下来就可以对 P3 口进行操作了,比如说点亮 LED。可以通过将 8 个 LED 的状态存入一个寄存器中,再将该寄存器的值存入 P3 端口,实现点亮 8 个 LED。代码示例:
MOV A, #0FFH ; 将需要点亮的 8 个 LED 的状态存入 A 寄存器中 MOV R2, A ; 将 A 寄存器中的值存入 R2 寄存器中 MOVX @R0, R2 ; 将 R2 寄存器中的值存入 P3 端口,即点亮 8 个 LED
(4)最后可以添加延时等操作,使 LED 闪烁或者呈现其他效果,比如说:
DELAY: MOV R3, #FFH LOOP1: DJNZ R3, LOOP1 DJNZ R2, DELAY RET
使用C语言的代码示例:
- #include<reg51.h> //包含单片机寄存器的头文件
- sfr x=0xb0; //P3 口在存储器中的地址是 b0H, 通过 sfr 可定义 8051 内核单
- 片机
- //的所有内部 8 位特殊功能寄存器,对地址 x 的操作也就是对 P1 口的
- 操作
- /****************************************
- 函数功能:延时一段时间
- *****************************************/
- void delay(void)
- {
- unsigned char i,j;
- for(i=0;i<250;i++)
- for(j=0;j<250;j++)
- ; //利用循环等待若干机器周期,从而延时一段时间
- }
- /*****************************************
- 函数功能:主函数
- ******************************************/
- void main(void)
- {
- while(1)
- {
- x=0xfe; //第一个灯亮
- delay(); //调用延时函数
- x=0xfd; //第二个灯亮
- delay(); //调用延时函数
- x=0xfb; //第三个灯亮
- delay(); //调用延时函数
- x=0xf7; //第四个灯亮
- delay(); //调用延时函数
- x=0xef; //第五个灯亮
- delay(); //调用延时函数
- x=0xdf; //第六个灯亮
- delay(); //调用延时函数
- x=0xbf; //第七个灯亮
- delay(); //调用延时函数
- x=0x7f; //第八个灯亮
- delay(); //调用延时函数
- }
- }
51单片机可以使用不同的数据类型来控制灯闪烁时间,其中包括:
整型变量:可以使用int型或者unsigned int型来控制灯的闪烁时间,比如:
int time = 1000; // 定义一个int型变量time,表示灯闪烁的时间为1000ms
长整型变量:可以使用long型或者unsigned long型来控制灯的闪烁时间,比如:
unsigned long time = 5000; // 定义一个unsigned long型变量time,表示灯闪烁的时间为5000ms
浮点型变量:可以使用float型或者double型来控制灯的闪烁时间,比如:
float time = 0.5; // 定义一个float型变量time,表示灯闪烁的时间为0.5s
需要注意的是,在使用浮点型变量控制灯的闪烁时间时,需要将其转换为整型,比如:
int time = (int)(0.5 * 1000); // 将0.5s转换为500ms,然后定义一个int型变量time,表示灯闪烁的时间为500ms
不同的数据类型可以用于不同的应用场景,需要根据具体情况进行选择。
代码示例:
- #include<reg51.h> //包含单片机寄存器的头文件
- /******************************************************
- 函数功能:用整形数据延时一段时间
- ******************************************************/
- void int_delay(void) //延时一段较长的时间
- {
- unsigned int m; //定义无符号整形变量,双字节数据,值域为 0~65535
- for(m=0;m<36000;m++)
- ; //空操作
- }
- /******************************************************
- 函数功能:用字符型数据延时一段时间
- ******************************************************/
- void char_delay(void) //延时一段较短的时间
- {
- unsigned char i,j; //定义无符号字符型变量,单字节数据,值域 0~255
- for(i=0;i<200;i++)
- for(j=0;j<180;j++)
- ; //空操作
- }
- /******************************************************
- 函数功能:主函数
- ******************************************************/
- void main(void)
- {
- unsigned char i;
- while(1)
- {
- for(i=0;i<3;i++)
- {
- P1=0xfe; //P1.0 口的灯点亮
- int_delay(); //延时一段较长的时间
- P1=0xff; //熄灭
- int_delay(); //延时一段较长的时间
- }
- for(i=0;i<3;i++)
- {
- P1=0xef; //P1.4 口的灯点亮
- char_delay(); //延时一段较长的时间
- P1=0xff; //熄灭
- char_delay(); //延时一段较长的时间
- }
-
- }
- }
51单片机流水灯是一个简单的练手项目,可以帮助初学者熟悉51单片机的基本操作和编程知识。以下是一些总结:
流水灯是一种基本的LED控制应用。将多个LED连接在一起,依次点亮和熄灭,形成一个动态的灯光效果。
51单片机流水灯的原理是将多个LED连接在单片机的输出端口上,通过编写程序控制输出端口的高低电平,从而实现LED的控制。
在编写51单片机流水灯程序时,需要掌握51单片机的单片机指令和汇编语言,以及用到的GPIO控制相关的寄存器。
51单片机流水灯有多种实现方式,包括轮流点亮每个LED和依次点亮每个LED两种方式。
编写51单片机流水灯程序时,需要注意硬件电路的连接和电气特性,如LED的电流限制和电阻的选取等。
通过实现51单片机流水灯项目,可以加深对单片机GPIO控制和编程知识的理解和掌握。同时,也可以为后续更复杂的项目打下基础。
更多推荐: