• 设计一:51单片机流水灯控制


    目录

    一、设计内容

    二、硬件电路分析

    三、仿真原理图

    四、程序设计

    五、仿真结果

    六、思考题

    作者有话说


    一、设计内容

           本次设计使用4个按键,当KEY1按下时,P0口所接的发光二极管(D1~D8)以100ms的时间间隔自下至上循环点亮3圈,当KEY2按下时,以200ms的时间间隔自上至下循环点亮3圈;当KEY3按下时,LED自两边至中间循环点亮,循环次数为3圈,时间间隔为1000ms;当KEY4按下时,LED自中间至两边循环点亮,循环次数为3圈,时间间隔为1000ms。平时LED的状态为全部熄灭。

    二、硬件电路分析

    1、芯片74HC245功能、引脚含义

    74HC245功能是做缓冲器,其OE管脚控制输出使能,低电平有效,DIR 管脚控制数据传输方向,若DIR为高电平数据传输方向是为A->B ,否则为B ->A,A0->A7和B0->B7管脚均用于数据的输入/输出,VCC和GND分别为芯片的电源端和接地端。

    2、芯片74HC138功能、引脚含义

    74HC138功能为3位二进制,译码成8种输出状态,并且一共有8个输出I/OA0->A2为数据输入管脚,Y0->Y7为数据输出管脚,E1、E2、E控制芯片使能,只有当E1=0,E2=0,E3=1时,芯片才能被使能否则芯片不会有任何有效输出VCC和GND分别为芯片的电源端和接地端。

    3、P0口作为通用I/O口时需注意

    由于P0口的内部上拉电阻较大属于“弱上拉”,因此P0口输出高电平电流很小,而输出低电平时,下拉MOS管导通,灌电流较大,负载能力强。因此在设计中,一般采用低电平驱动方式。

    4、点亮发光二极管硬件满足条件

    点亮发光二极管需要让三极管导通,即Q3为低电平,即二极管的阴极为低电平。

    三、仿真原理图

    四、程序设计

    1. /*******************************************************************************
    2. * 函 数 名 : main
    3. * 函数功能 : 按键流水灯
    4. * 创作者 : 薄情书生
    5. * 创作时间 : 2022.9.15
    6. *******************************************************************************/
    7. #include "reg52.h"
    8. #include "intrins.h"
    9. /*********类型定义*********/
    10. typedef unsigned char u8;
    11. typedef unsigned int u16;
    12. /*********按键定义*********/
    13. sbit KEY0 = P3^2;
    14. sbit KEY1 = P3^3;
    15. sbit KEY2 = P3^4;
    16. sbit KEY3 = P3^5;
    17. /*********毫秒延时*********/
    18. void delay_ms(u16 ms)
    19. {
    20. u16 x,y;
    21. for(x=ms;x>0;x--)
    22. for(y=114;y>0;y--);
    23. }
    24. /*************38译码器**************/
    25. void SelectHC138(unsigned char channel)
    26. {
    27. switch(channel)
    28. {
    29. case 0:
    30. P1 = (P1 & 0x1f)|0x00;break; //发光二极管(LEDS0)
    31. }
    32. }
    33. /*************LED由下至上**************/
    34. void Bottom_Up()
    35. {
    36. u8 i,j;
    37. for(j=0;j<3;j++)
    38. {
    39. for(i=0,P0 = 0xff;i<8;i++)
    40. {
    41. P0 = P0<<1;
    42. delay_ms(200);
    43. }
    44. }
    45. P0 = 0xff;
    46. }
    47. /*************LED由上至下**************/
    48. void Up_Bottom()
    49. {
    50. u8 i,j;
    51. for(j=0;j<3;j++)
    52. {
    53. for(i=0,P0 = 0xff;i<8;i++)
    54. {
    55. P0 = P0>>1;
    56. delay_ms(100);
    57. }
    58. }
    59. P0 = 0xff;
    60. }
    61. /*************两边至中间**************/
    62. void LED_sides()
    63. {
    64. u8 i,j,ri,lf;
    65. for(j=0;j<3;j++)
    66. {
    67. for(i=0,ri=0x7f,lf=0xfe;i<4;i++)
    68. {
    69. P0 = ri&lf;
    70. ri = _cror_(ri,1);
    71. lf = _crol_(lf,1);
    72. delay_ms(1000);
    73. }
    74. }
    75. P0 = 0xff;
    76. }
    77. /*************中间至两边**************/
    78. void LED_middle()
    79. {
    80. u8 i,j,ri,lf;
    81. for(j=0;j<3;j++)
    82. {
    83. for(i=0,ri=0xef,lf=0xf7;i<4;i++)
    84. {
    85. P0 = ri&lf;
    86. ri = _crol_(ri,1);
    87. lf = _cror_(lf,1);
    88. delay_ms(1000);
    89. }
    90. }
    91. P0=0xff;
    92. }
    93. /*******************主程序************************/
    94. void main()
    95. {
    96. SelectHC138(0);
    97. while(1)
    98. {
    99. if(KEY0==0)
    100. {
    101. delay_ms(10);
    102. if(KEY0==0)
    103. {
    104. Up_Bottom();
    105. }
    106. }
    107. if(KEY1==0)
    108. {
    109. delay_ms(10);
    110. if(KEY1==0)
    111. {
    112. Bottom_Up();
    113. }
    114. }
    115. if(KEY2==0)
    116. {
    117. delay_ms(10);
    118. if(KEY2==0)
    119. {
    120. LED_sides();
    121. }
    122. }
    123. if(KEY3==0)
    124. {
    125. delay_ms(10);
    126. if(KEY3==0)
    127. {
    128. LED_middle();
    129. }
    130. }
    131. }
    132. }

    五、仿真结果

    KEY1按下时,P0口所接的发光二极管(D1~D8)以100ms的时间间隔自下至上循环点亮3圈。

     KEY2按下时,以200ms的时间间隔自上至下循环点亮3圈。

     KEY3按下时,LED自两边至中间循环点亮,循环次数为3圈,时间间隔为1000ms。

     当KEY4按下时,LED自中间至两边循环点亮,循环次数为3圈,时间间隔为1000ms。

    平时LED的状态为全部熄灭。

    、思考题

    修改程序,实现4个按键控制,自上至下、自下至上、发光二极管闪烁3次,时间间隔为500ms、发光二极管全部点亮3秒后熄灭、结束后恢复到所有LED熄灭的正常状态。请自行编写程序并调试。思考题参考程序将在设计二:51单片机外部中断实验给出。

    作者有话说

    本专栏为51单片机实战教程,旨在以练促学,帮助小伙伴快速入门51单片机,学习51单片机相应理论知识请自行学习。本次设计涉及的相关理论知识:51单片机IO口控制、独立按键的使用,请自行参考资料学习。

    本次设计源程序及仿真源文件百度网盘链接:https://pan.baidu.com/s/17PtMjM5y-YSfdHlqnqAUnA      提取码:4ma5 
     

  • 相关阅读:
    燃气安全如何保障?万宾燃气管网监测系统时刻感知管网运行态势
    如何保证接口的幂等性?
    Codeforces Round 910 (Div. 2) --- B-E 补题记录
    ubuntu18.04 报错:fatal error: execution
    睿趣科技:新手抖音开店卖什么产品好
    Mybatis框架总结(动力节点)
    人工智能中的文本分类:技术突破与实战指导
    Hive 数据仓库介绍
    5.git远程仓库的创建(http,ssh)
    <C++> STL_bitset使用和模拟实现
  • 原文地址:https://blog.csdn.net/weixin_53402301/article/details/130907233