• 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语言的代码示例:

    1. #include<reg51.h> //包含单片机寄存器的头文件
    2. sfr x=0xb0; //P3 口在存储器中的地址是 b0H, 通过 sfr 可定义 8051 内核单
    3. 片机
    4. //的所有内部 8 位特殊功能寄存器,对地址 x 的操作也就是对 P1 口的
    5. 操作
    6. /****************************************
    7. 函数功能:延时一段时间
    8. *****************************************/
    9. void delay(void)
    10. {
    11. unsigned char i,j;
    12. for(i=0;i<250;i++)
    13. for(j=0;j<250;j++)
    14. ; //利用循环等待若干机器周期,从而延时一段时间
    15. }
    16. /*****************************************
    17. 函数功能:主函数
    18. ******************************************/
    19. void main(void)
    20. {
    21. while(1)
    22. {
    23. x=0xfe; //第一个灯亮
    24. delay(); //调用延时函数
    25. x=0xfd; //第二个灯亮
    26. delay(); //调用延时函数
    27. x=0xfb; //第三个灯亮
    28. delay(); //调用延时函数
    29. x=0xf7; //第四个灯亮
    30. delay(); //调用延时函数
    31. x=0xef; //第五个灯亮
    32. delay(); //调用延时函数
    33. x=0xdf; //第六个灯亮
    34. delay(); //调用延时函数
    35. x=0xbf; //第七个灯亮
    36. delay(); //调用延时函数
    37. x=0x7f; //第八个灯亮
    38. delay(); //调用延时函数
    39. }
    40. }

    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
      

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

    代码示例:

    1. #include<reg51.h> //包含单片机寄存器的头文件
    2. /******************************************************
    3. 函数功能:用整形数据延时一段时间
    4. ******************************************************/
    5. void int_delay(void) //延时一段较长的时间
    6. {
    7. unsigned int m; //定义无符号整形变量,双字节数据,值域为 0~65535
    8. for(m=0;m<36000;m++)
    9. ; //空操作
    10. }
    11. /******************************************************
    12. 函数功能:用字符型数据延时一段时间
    13. ******************************************************/
    14. void char_delay(void) //延时一段较短的时间
    15. {
    16. unsigned char i,j; //定义无符号字符型变量,单字节数据,值域 0~255
    17. for(i=0;i<200;i++)
    18. for(j=0;j<180;j++)
    19. ; //空操作
    20. }
    21. /******************************************************
    22. 函数功能:主函数
    23. ******************************************************/
    24. void main(void)
    25. {
    26. unsigned char i;
    27. while(1)
    28. {
    29. for(i=0;i<3;i++)
    30. {
    31. P1=0xfe; //P1.0 口的灯点亮
    32. int_delay(); //延时一段较长的时间
    33. P1=0xff; //熄灭
    34. int_delay(); //延时一段较长的时间
    35. }
    36. for(i=0;i<3;i++)
    37. {
    38. P1=0xef; //P1.4 口的灯点亮
    39. char_delay(); //延时一段较长的时间
    40. P1=0xff; //熄灭
    41. char_delay(); //延时一段较长的时间
    42. }
    43. }
    44. }

            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博客

  • 相关阅读:
    内存管理--内存布局
    简易计算器的实现:使用C语言进行基础算术运算
    二叉树 | 构造二叉树 | 中序&后序、前序&中序遍历序列、最大二叉树 | leecode刷题笔记
    c++学习笔记3_函数模板的使用并实现自己定义的队列
    kafka-- kafka集群环境搭建
    麦子-linux字符设备驱动初探
    基于springboot实现疫苗接种管理系统项目【项目源码】
    【校招VIP】 java开源框架之mq
    痞子衡嵌入式:大话双核i.MXRT1170之在线联合调试双核工程的三种方法(IAR篇)
    中康控股开启招股:拟募资净额3.95亿港元,预计7月12日上市
  • 原文地址:https://blog.csdn.net/MANONGDKY/article/details/134433460