51单片机应用从零开始(四)

51单片机应用从零开始(一)-CSDN博客

51单片机应用从零开始(二)-CSDN博客

51单片机应用从零开始(三)-CSDN博客

详解 KEIL C51 软件的使用·建立工程-CSDN博客

详解 KEIL C51 软件的使用·设置工程·编绎与连接程序-CSDN博客

目录

5.  通过对 P3 口地址的操作流水点亮 8 位 LED

6.  用不同数据类型控制灯闪烁时间


5.  通过对 P3 口地址的操作流水点亮 8 位 LED

        前面,我们已经通过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 //包含单片机寄存器的头文件
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(); //调用延时函数 
 }
}

6.  用不同数据类型控制灯闪烁时间

51单片机可以使用不同的数据类型来控制灯闪烁时间,其中包括:

  1. 整型变量:可以使用int型或者unsigned int型来控制灯的闪烁时间,比如:

    int time = 1000; // 定义一个int型变量time,表示灯闪烁的时间为1000ms
    
  2. 长整型变量:可以使用long型或者unsigned long型来控制灯的闪烁时间,比如:

    unsigned long time = 5000; // 定义一个unsigned long型变量time,表示灯闪烁的时间为5000ms
    
  3. 浮点型变量:可以使用float型或者double型来控制灯的闪烁时间,比如:

    float time = 0.5; // 定义一个float型变量time,表示灯闪烁的时间为0.5s
    

    需要注意的是,在使用浮点型变量控制灯的闪烁时间时,需要将其转换为整型,比如:

    int time = (int)(0.5 * 1000); // 将0.5s转换为500ms,然后定义一个int型变量time,表示灯闪烁的时间为500ms
    

不同的数据类型可以用于不同的应用场景,需要根据具体情况进行选择。

代码示例:

#include //包含单片机寄存器的头文件
/****************************************************** 
函数功能:用整形数据延时一段时间
******************************************************/ 
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单片机的基本操作和编程知识。以下是一些总结:

  1. 流水灯是一种基本的LED控制应用。将多个LED连接在一起,依次点亮和熄灭,形成一个动态的灯光效果。

  2. 51单片机流水灯的原理是将多个LED连接在单片机的输出端口上,通过编写程序控制输出端口的高低电平,从而实现LED的控制。

  3. 在编写51单片机流水灯程序时,需要掌握51单片机的单片机指令和汇编语言,以及用到的GPIO控制相关的寄存器。

  4. 51单片机流水灯有多种实现方式,包括轮流点亮每个LED和依次点亮每个LED两种方式。

  5. 编写51单片机流水灯程序时,需要注意硬件电路的连接和电气特性,如LED的电流限制和电阻的选取等。

  6. 通过实现51单片机流水灯项目,可以加深对单片机GPIO控制和编程知识的理解和掌握。同时,也可以为后续更复杂的项目打下基础。

更多推荐:

时光の尘_千题千解·Java面试宝典,Linux学习,C++学习-CSDN博客

51单片机应用从零开始(四)_第1张图片

你可能感兴趣的:(嵌入式学习,51单片机,嵌入式硬件,单片机)