当前位置:   article > 正文

单片机小项目——直流电机+按键

单片机小项目——直流电机+按键

利用普中单片机的代码实现在按下第k个独立按键时,直流电机运作k秒

  1. #include "reg52.h"
  2. typedef unsigned int u16; //对系统默认数据类型进行重定义
  3. typedef unsigned char u8;
  4. sbit DC_Motor=P1^0;
  5. //定义独立按键控制脚
  6. sbit KEY1=P3^1;
  7. sbit KEY2=P3^0;
  8. sbit KEY3=P3^2;
  9. sbit KEY4=P3^3;
  10. //使用宏定义独立按键按下的键值
  11. #define KEY1_PRESS 1
  12. #define KEY2_PRESS 2
  13. #define KEY3_PRESS 3
  14. #define KEY4_PRESS 4
  15. #define KEY_UNPRESS 0
  16. void delay_10us(u16 ten_us)
  17. {
  18. while(ten_us--);
  19. }
  20. /*delay for 10ms*/
  21. void delay_ms(u16 ms)
  22. {
  23. u16 i,j;
  24. for(i=ms;i>0;i--)
  25. for(j=110;j>0;j--);
  26. }
  27. /*******************************************************************************
  28. * 函 数 名 : key_scan
  29. * 函数功能 : 检测独立按键是否按下,按下则返回对应键值
  30. * 输 入 : mode=0:单次扫描按键
  31. mode=1:连续扫描按键
  32. * 输 出 : KEY1_PRESS:K1按下
  33. KEY2_PRESS:K2按下
  34. KEY3_PRESS:K3按下
  35. KEY4_PRESS:K4按下
  36. KEY_UNPRESS:未有按键按下
  37. *******************************************************************************/
  38. u8 key_scan(u8 mode)
  39. {
  40. static u8 key=1;
  41. if(mode)key=1;//连续扫描按键
  42. if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))//任意按键按下
  43. {
  44. delay_10us(1000);//消抖
  45. key=0;
  46. if(KEY1==0)
  47. return KEY1_PRESS;
  48. else if(KEY2==0)
  49. return KEY2_PRESS;
  50. else if(KEY3==0)
  51. return KEY3_PRESS;
  52. else if(KEY4==0)
  53. return KEY4_PRESS;
  54. }
  55. else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1) //无按键按下
  56. {
  57. key=1;
  58. }
  59. return KEY_UNPRESS;
  60. }
  61. void main()
  62. {
  63. u8 key=0;
  64. DC_Motor=0;
  65. while(1)
  66. {
  67. key=key_scan(0);
  68. if(key!=0){
  69. DC_Motor=1;//改变5V对应管脚的值
  70. delay_ms(key*1000);//延时key秒
  71. DC_Motor=0;
  72. }
  73. }
  74. }

使用4*4键盘控制,第一个到第15按键分别对应数码管显示1到F,计划在按下第16的按键时电动机运转数码管显示的秒数,代码如下

  1. #include "reg52.h"
  2. typedef unsigned int u16;
  3. typedef unsigned char u8;
  4. #define KEY_MATRIX_PORT P1 //使用宏定义矩阵按键控制口
  5. //定义直流电机控制管脚
  6. sbit DC_Motor=P2^0;
  7. #define SMG_A_DP_PORT P0 //使用宏定义数码管段码口
  8. u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  9. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  10. void delay_10us(u16 ten_us)
  11. {
  12. while(ten_us--);
  13. }
  14. void delay_ms(u16 ms)
  15. {
  16. u16 i,j;
  17. for(i=ms;i>0;i--)
  18. for(j=110;j>0;j--);
  19. }
  20. /*******************************************************************************
  21. * 函数功能 : 使用行列式扫描方法,检测矩阵按键是否按下,按下则返回对应键值
  22. * 输 出 : key_value:1-16,对应S1-S16键,
  23. 0:按键未按下
  24. *******************************************************************************/
  25. u8 key_matrix_ranks_scan(void)
  26. {
  27. u8 key_value=0;
  28. KEY_MATRIX_PORT=0xf7;//给第一列赋值0,其余全为1
  29. if(KEY_MATRIX_PORT!=0xf7)//判断第一列按键是否按下
  30. {
  31. delay_10us(1000);//消抖
  32. switch(KEY_MATRIX_PORT)//保存第一列按键按下后的键值
  33. {
  34. case 0x77: key_value=1;break;
  35. case 0xb7: key_value=5;break;
  36. case 0xd7: key_value=9;break;
  37. case 0xe7: key_value=13;break;
  38. }
  39. }
  40. while(KEY_MATRIX_PORT!=0xf7);//等待按键松开
  41. KEY_MATRIX_PORT=0xfb;//给第二列赋值0,其余全为1
  42. if(KEY_MATRIX_PORT!=0xfb)//判断第二列按键是否按下
  43. {
  44. delay_10us(1000);//消抖
  45. switch(KEY_MATRIX_PORT)//保存第二列按键按下后的键值
  46. {
  47. case 0x7b: key_value=2;break;
  48. case 0xbb: key_value=6;break;
  49. case 0xdb: key_value=10;break;
  50. case 0xeb: key_value=14;break;
  51. }
  52. }
  53. while(KEY_MATRIX_PORT!=0xfb);//等待按键松开
  54. KEY_MATRIX_PORT=0xfd;//给第三列赋值0,其余全为1
  55. if(KEY_MATRIX_PORT!=0xfd)//判断第三列按键是否按下
  56. {
  57. delay_10us(1000);//消抖
  58. switch(KEY_MATRIX_PORT)//保存第三列按键按下后的键值
  59. {
  60. case 0x7d: key_value=3;break;
  61. case 0xbd: key_value=7;break;
  62. case 0xdd: key_value=11;break;
  63. case 0xed: key_value=15;break;
  64. }
  65. }
  66. while(KEY_MATRIX_PORT!=0xfd);//等待按键松开
  67. KEY_MATRIX_PORT=0xfe;//给第四列赋值0,其余全为1
  68. if(KEY_MATRIX_PORT!=0xfe)//判断第四列按键是否按下
  69. {
  70. delay_10us(1000);//消抖
  71. switch(KEY_MATRIX_PORT)//保存第四列按键按下后的键值
  72. {
  73. case 0x7e: key_value=4;break;
  74. case 0xbe: key_value=8;break;
  75. case 0xde: key_value=12;break;
  76. case 0xee: key_value=16;break;
  77. }
  78. }
  79. while(KEY_MATRIX_PORT!=0xfe);//等待按键松开
  80. return key_value;
  81. }
  82. void main()
  83. {
  84. u8 key=0;
  85. u8 key1=0;
  86. DC_Motor=0;
  87. while(1)
  88. {
  89. key=key_matrix_ranks_scan();
  90. if(key!=0){
  91. if(key==16){
  92. DC_Motor=1;//开启电机
  93. delay_ms(key1*1000); //延迟k1秒
  94. DC_Motor=0;//关闭电机
  95. }
  96. else{
  97. SMG_A_DP_PORT=gsmg_code[key];//得到的按键值减1换算成数组下标对应1-F段码
  98. key1=key;//给key1赋值
  99. }
  100. }
  101. }
  102. }

不过在未按下按键时,电动机仍然有一定的运转,而且在按下前15个按键的瞬间电动机仍要加速转动,猜想是矩阵键盘的扫描与电机共用一个IO口,互相影响了电平。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/480615
推荐阅读
相关标签
  

闽ICP备14008679号