• #循循渐进学51单片机#步进电机与蜂鸣器#not.8


    1、能够理解清楚单片机IO口的结构。

    2)t1相当于PnP三级管,t2相当于npn三极管

    3) 强推挽io具有较强的驱动能力,电流输出能力很强。


    2、能够看懂上下拉电阻的电路应用,并且熟练使用上下拉电阻。


    3、理解28BYJ-48减速步进电机的工作原理。


    4、能够熟练编写步进电机正反转任意角度的程序。

    1. #include <REGX52.H>
    2. sbit MC0 = P1^0;
    3. sbit MC1 = P1^1;
    4. sbit MC2 = P1^2;
    5. sbit MC3 = P1^3;
    6. sbit MC4 = P1^4;
    7. sbit KeyIn1 = P2^4;
    8. sbit KeyIn2 = P2^5;
    9. sbit KeyIn3 = P2^6;
    10. sbit KeyIn4 = P2^7;
    11. sbit KeyOut1 = P2^3;
    12. sbit KeyOut2 = P2^2;
    13. sbit KeyOut3 = P2^1;
    14. sbit KeyOut4 = P2^0;
    15. static unsigned long a;
    16. unsigned char KeySta[4][4] = {
    17. {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}
    18. };
    19. unsigned char code KeyCodeMap[4][4] = {
    20. { 0x31, 0x32, 0x33, 0x26 },
    21. { 0x34, 0x35, 0x36, 0x25 },
    22. { 0x37, 0x38, 0x39, 0x28 },
    23. { 0x30, 0x1B, 0x0D, 0x27 }
    24. };
    25. void KeyDriver();
    26. void main()
    27. {
    28. EA = 1;
    29. TMOD = 0x01;
    30. TH0 = 0xFC;
    31. TL0 = 0x67;
    32. ET0 = 1;
    33. TR0 = 1;
    34. while(1)KeyDriver();
    35. }
    36. void StartMotor(signed long angle)
    37. {
    38. EA = 0;
    39. a = angle*4076/360;
    40. EA = 1;
    41. }
    42. void StopMotor()
    43. {
    44. EA = 0;
    45. a = 0;
    46. EA = 1;
    47. }
    48. void KeyAction(unsigned char keycode)
    49. {
    50. bit arr;
    51. if(keycode >= 0x30 && keycode <= 0x39)
    52. {
    53. if(arr == 0)
    54. StartMotor(360*(int)(keycode-0x30));
    55. else
    56. StartMotor(-360*(int)(keycode-0x30));
    57. }
    58. else if(keycode == 0x26)
    59. {
    60. arr = 0;
    61. }
    62. else if(keycode == 0x28)
    63. {
    64. arr = 1;
    65. }
    66. else if (keycode == 0x25)
    67. {
    68. StartMotor(90);
    69. }
    70. else if (keycode == 0x27)
    71. {
    72. StartMotor(-90);
    73. }
    74. else if (keycode == 0x1B)
    75. {
    76. StopMotor();
    77. }
    78. }
    79. void KeyDriver()
    80. {
    81. unsigned char i, j;
    82. static unsigned char backup[4][4] = {
    83. {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1}
    84. };
    85. for (i=0; i<4; i++)
    86. {
    87. for (j=0; j<4; j++)
    88. {
    89. if (backup[i][j] != KeySta[i][j])
    90. {
    91. if (backup[i][j] != 0)
    92. {
    93. KeyAction(KeyCodeMap[i][j]);
    94. }
    95. backup[i][j] = KeySta[i][j];
    96. }
    97. }
    98. }
    99. }
    100. void KeyScan()
    101. {
    102. static unsigned char add = 0;
    103. unsigned char j ;
    104. static unsigned char keybuf[4][4] = {
    105. {0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF},
    106. {0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF}
    107. };
    108. keybuf[add][0] = (keybuf[add][0] << 1) | KeyIn1;
    109. keybuf[add][1] = (keybuf[add][1] << 1) | KeyIn2;
    110. keybuf[add][2] = (keybuf[add][2] << 1) | KeyIn3;
    111. keybuf[add][3] = (keybuf[add][3] << 1) | KeyIn4;
    112. for(j = 0;j <4;j++)
    113. {
    114. if( (keybuf[add][j] & 0x0F) == 0x00 )
    115. {
    116. KeySta[add][j] = 0;
    117. }
    118. else if((keybuf[add][j] & 0x0F) == 0x0f)
    119. {
    120. KeySta[add][j] = 1;
    121. }
    122. }
    123. add++;
    124. add = add & 0x03;
    125. switch(add)
    126. {
    127. case 0:KeyOut4 = 1;KeyOut1 = 0;break;
    128. case 1:KeyOut1 = 1;KeyOut2 = 0;break;
    129. case 2:KeyOut2 = 1;KeyOut3 = 0;break;
    130. case 3:KeyOut3 = 1;KeyOut4 = 0;break;
    131. default:break;
    132. }
    133. }
    134. void TurnMotor()
    135. {
    136. static unsigned char index = 0;
    137. static unsigned char tmp = 0;
    138. unsigned char code BeatCode[8] = {
    139. 0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6
    140. };
    141. if(a != 0)
    142. {
    143. if(a > 0)
    144. {
    145. index++;
    146. index = index & 0x07;
    147. a--;
    148. }
    149. else
    150. {
    151. index--;
    152. index = index & 0x07;
    153. a++;
    154. }
    155. tmp = P1;
    156. tmp = tmp & 0xF0;
    157. tmp = tmp | BeatCode[index];
    158. P1 = tmp;
    159. }
    160. else
    161. {
    162. P1 = P1 | 0x0F;
    163. }
    164. }
    165. void InterruptTimer0() interrupt 1
    166. {
    167. bit biv = 0;
    168. TH0 = 0xFC;
    169. TL0 = 0x67;
    170. KeyScan();
    171. biv = ~biv;
    172. if (biv == 1)
    173. {
    174. TurnMotor();
    175. }
    176. }


    5、学会蜂鸣器发声的方法。

    1. #include <REGX52.H>
    2. sbit BUZZ = P1^6;
    3. void openbuzz(unsigned char arr);
    4. void stopbuzz();
    5. unsigned int TORH;
    6. unsigned int TORL;
    7. void main()
    8. {
    9. unsigned int i;
    10. EA = 1;
    11. TMOD = 0x01;
    12. while(1)
    13. {
    14. openbuzz(4000);
    15. for(i = 0;i <= 40000;i++);
    16. stopbuzz();
    17. for(i = 0;i <= 20000;i++);
    18. openbuzz(1000);
    19. for(i = 0;i <= 40000;i++);
    20. stopbuzz();
    21. for(i = 0;i <= 20000;i++);
    22. }
    23. }
    24. void openbuzz(unsigned char arr)
    25. {
    26. unsigned int reload;
    27. reload = (65536)- (11059200/12)/(arr*2);
    28. TORH = (unsigned int)(reload >> 8);
    29. TORL = (unsigned int)reload;
    30. TH0 = 0xFF;
    31. TL0 = 0xFE;
    32. ET0 = 1;
    33. TR0 = 1;
    34. }
    35. void stopbuzz()
    36. {
    37. ET0 = 0;
    38. TR0 = 0;
    39. }
    40. void InterruptTimer0() interrupt 1
    41. {
    42. TH0 = TORH;
    43. TL0 = TORL;
    44. BUZZ = ~BUZZ;
    45. }

  • 相关阅读:
    python回归算法flask的北京共享单车租借数量预测分析
    2022年最新山东道路运输安全员模拟试题及答案
    Python:语法进阶
    Spark在爱奇艺的应用实践
    OpenCV开发笔记(七十七):相机标定(二):通过棋盘标定计算相机内参矩阵矫正畸变摄像头图像
    Linux进程间通信(二)
    css让元素透明的方式
    JavaScript 68 JavaScript Browser BOM 68.7 JavaScript Timing 事件
    《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(9)-Fiddler如何设置捕获Https会话
    2023计算机毕业设计SSM最新选题之java二手交易平台2ud44
  • 原文地址:https://blog.csdn.net/2301_77479336/article/details/132864465