飞道的博客

蓝桥杯单片机----继电器和蜂鸣器的基本控制

481人阅读  评论(0)

       学了LED指示灯的基本控制,或许我们可以给自己增加点难度,加上继电器和蜂鸣器给上个设计稍微增加点难度,设计如下:

设计内容:

        1.让八只LED灯整体闪烁三次,间隔为1秒钟;

        2.LED灯从左到右逐渐点亮,间隔为0.5秒,等全部点亮后继电器打开,一秒后关闭;

        3.LED灯从左到右逐渐熄灭,间隔为0.5秒,等全部熄灭后蜂鸣器打开,一秒后关闭。

       细心做题的朋友们或许已经发现,我们在做第一个小设计的时候并没有打开继电器,蜂鸣器这些外设啊,但为什么都开始工作了呢,这就是板子设计的问题了,我们想要让他们上电后暂不工作需要先初始化他们,接下来咱们就写一下如何初始化这块板子,顺便完成我们这次的设计,以后的话咱们也是每次设计都会用到这个初始化程序来初始话开发板。咱们先用最简单直白的方式写,然后再逐渐精炼代码,这样有助于我们了解原理并且找到适合自己的编程方法,也有助于我们形成自己的编程风格。


  
  1. #include<stc15f2k60s2.h>
  2. sbit HC138_A=P2^5;
  3. sbit HC138_B=P2^6;
  4. sbit HC138_C=P2^7;
  5. void LED_Run();
  6. void delayms(int ms);
  7. void Allinit();
  8. void main()
  9. {
  10. Allinit();
  11. while(1)
  12. {
  13. LED_Run();
  14. }
  15. }
  16. void LED_Run()
  17. {
  18. int i;
  19. HC138_C= 1;
  20. HC138_B= 0;
  21. HC138_A= 0;
  22. for(i= 0;i<3;i++)
  23. {
  24. P0= 0X00;
  25. delayms(1000);
  26. P0= 0XFF;
  27. delayms(1000);
  28. }
  29. for(i= 0;i<8;i++)
  30. {
  31. P0= (0XFF<<i);
  32. delayms(500);
  33. }
  34. HC138_C= 1;
  35. HC138_B= 0;
  36. HC138_A= 1;
  37. P0= 0X10;
  38. delayms(50);
  39. P0= 0X00;
  40. HC138_C= 1;
  41. HC138_B= 0;
  42. HC138_A= 0;
  43. for(i= 0;i<8;i++)
  44. {
  45. P0= ~(0XFF<<i);
  46. delayms(500);
  47. }
  48. HC138_C= 1;
  49. HC138_B= 0;
  50. HC138_A= 1;
  51. P0= 0X40;
  52. delayms(50);
  53. P0= 0X00;
  54. }
  55. void delayms(int ms)
  56. {
  57. int i,j;
  58. for(i= ms;i>0;i--)
  59. for(j= 845;j>0;j--);
  60. }
  61. void Allinit()
  62. {
  63. HC138_C= 1;
  64. HC138_B= 0;
  65. HC138_A= 0;
  66. P0= 0XFF; //关LED
  67. HC138_C= 1;
  68. HC138_B= 0;
  69. HC138_A= 1;
  70. P0= 0X00; //关继电器、蜂鸣器
  71. }

       这个代码其实是可以优化的,代码里用了太多的138译码器的高低电平赋值,我们稍微给它优化一下。我们可以把所有由138译码器控制的继电器,蜂鸣器,数码管,LED这些外设端口用一个switch语句来选择控制。代码如下:


  
  1. #include<stc15f2k60s2.h>
  2. sbit HC138_A=P2^5;
  3. sbit HC138_B=P2^6;
  4. sbit HC138_C=P2^7;
  5. void LED_Run();
  6. void delayms(int ms);
  7. void Allinit();
  8. void InitHC138(int n);
  9. void main()
  10. {
  11. Allinit();
  12. while(1)
  13. {
  14. LED_Run();
  15. }
  16. }
  17. void InitHC138(int n)
  18. {
  19. switch(n)
  20. {
  21. case 4:
  22. HC138_C= 1;
  23. HC138_B= 0;
  24. HC138_A= 0;
  25. break;
  26. case 5:
  27. HC138_C= 1;
  28. HC138_B= 0;
  29. HC138_A= 1;
  30. break;
  31. case 6:
  32. HC138_C= 1;
  33. HC138_B= 1;
  34. HC138_A= 0;
  35. break;
  36. case 7:
  37. HC138_C= 1;
  38. HC138_B= 1;
  39. HC138_A= 1;
  40. break;
  41. }
  42. }
  43. void LED_Run()
  44. {
  45. int i;
  46. InitHC138(4);
  47. for(i= 0;i<3;i++)
  48. {
  49. P0= 0X00;
  50. delayms(1000);
  51. P0= 0XFF;
  52. delayms(1000);
  53. }
  54. for(i= 0;i<8;i++)
  55. {
  56. P0= (0XFF<<i);
  57. delayms(500);
  58. }
  59. InitHC138(5);
  60. P0= 0X10;
  61. delayms(50);
  62. P0= 0X00;
  63. InitHC138(4);
  64. for(i= 0;i<8;i++)
  65. {
  66. P0= ~(0XFF<<i);
  67. delayms(500);
  68. }
  69. InitHC138(5);
  70. P0= 0X40;
  71. delayms(50);
  72. P0= 0X00;
  73. }
  74. void delayms(int ms)
  75. {
  76. int i,j;
  77. for(i= ms;i>0;i--)
  78. for(j= 845;j>0;j--);
  79. }
  80. void Allinit()
  81. {
  82. InitHC138(4);
  83. P0= 0XFF; //关LED
  84. InitHC138(5);
  85. P0= 0X00; //关继电器、蜂鸣器
  86. }

       可能有些同学觉得这代码还是显得比较繁杂,还是不够简化,那我们把P0口的输出跟138译码器做到同一个控制语句里吧,上代码:


  
  1. #include<stc15f2k60s2.h>
  2. sbit HC138_A = P2^ 5;
  3. sbit HC138_B = P2^ 6;
  4. sbit HC138_C = P2^ 7;
  5. void LED_Run();
  6. void delayms(int ms);
  7. void InitHC138(int n);
  8. void Allinit();
  9. void Output(unsigned char Tongdao,unsigned char dat);
  10. void main()
  11. {
  12. Allinit();
  13. while( 1)
  14. {
  15. LED_Run();
  16. }
  17. }
  18. void InitHC138(int n)
  19. {
  20. switch(n)
  21. {
  22. case 4:
  23. P2 = (P2 & 0X1F)| 0X80;
  24. break;
  25. case 5:
  26. P2 = (P2 & 0X1F)| 0XA0;
  27. break;
  28. case 6:
  29. P2 = (P2 & 0X1F)| 0XC0;
  30. break;
  31. case 7:
  32. P2 = (P2 & 0X1F)| 0XE0;
  33. break;
  34. }
  35. }
  36. void Output(unsigned char Tongdao,unsigned char dat)
  37. {
  38. InitHC138(Tongdao);
  39. P0 = dat;
  40. }
  41. void LED_Run()
  42. {
  43. int i;
  44. for(i= 0;i< 3;i++)
  45. {
  46. Output( 4, 0x00);delayms( 1000);
  47. Output( 4, 0xff);delayms( 1000);
  48. }
  49. for(i= 0;i< 8;i++)
  50. {
  51. Output( 4,( 0XFF<<i));delayms( 500);
  52. }
  53. Output( 5, 0x10);delayms( 50);
  54. Output( 5, 0x00);
  55. for(i= 0;i< 8;i++)
  56. {
  57. Output( 4,~( 0XFF<<i));delayms( 500);
  58. }
  59. Output( 5, 0x40);delayms( 50);
  60. Output( 5, 0x00);
  61. }
  62. void delayms(int ms)
  63. {
  64. int i,j;
  65. for(i=ms;i> 0;i--)
  66. for(j= 845;j> 0;j--);
  67. }
  68. void Allinit()
  69. {
  70. Output( 4, 0xff); //关LED
  71. Output( 5, 0x00); //关继电器、蜂鸣器
  72. }

       这样看着是不是就舒服多了,代码是多种多样的,每个人思路不一样,写出来的代码就会略有差别,我这里还有另外一种写的方式,可供大家参考:


  
  1. #include<stc15f2k60s2.h>
  2. void allinit();
  3. void delayms(int ms);
  4. void LED_Run();
  5. void main()
  6. {
  7. allinit();
  8. while( 1)
  9. {
  10. LED_Run();
  11. }
  12. }
  13. void LED_Run()
  14. {
  15. int i;
  16. for(i= 0;i< 3;i++)
  17. {
  18. P2= 0X80;P0= 0X00;
  19. delayms( 1000);
  20. P2= 0X80;P0= 0XFF;
  21. delayms( 1000);
  22. }
  23. for(i= 0;i< 8;i++)
  24. {
  25. P2= 0X80;P0= 0XFF<<i;
  26. delayms( 500);
  27. }
  28. P2= 0XA0;P0= 0X10;delayms( 50);
  29. P2= 0XA0;P0= 0X00;
  30. for(i= 0;i< 8;i++)
  31. {
  32. P2= 0X80;P0=~( 0XFF<<i);
  33. delayms( 500);
  34. }
  35. P2= 0XA0;P0= 0X40;delayms( 50);
  36. P2= 0XA0;P0= 0X00;
  37. }
  38. void delayms(int ms)
  39. {
  40. int i,j;
  41. for(i=ms;i> 0;i--)
  42. for(j= 845;j> 0;j--);
  43. }
  44. void allinit()
  45. {
  46. P2= 0XA0;P0= 0X00; //关继电器、蜂鸣器
  47. P2= 0X80;P0= 0XFF; //关LED
  48. P2= 0XC0;P0= 0XFF; //关数码管位选
  49. P2= 0XFF;P0= 0XFF; //关数码管段选
  50. }

       以上几种代码本质上都是差不多的,所实现的功能也是一摸一样,大家可以根据自己的爱好选择一种适合自己的。

 


转载:https://blog.csdn.net/qq_45385706/article/details/115453521
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场