找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1184|回复: 0
打印 上一主题 下一主题
收起左侧

有没有大神能看懂这单片机3档点击速度调节程序的,给个注释

[复制链接]
跳转到指定楼层
楼主
要求:
1、有3档速度调节
2、要显示所设置的速度值
3、可改变方向

电路原理图如下:


程序如下:
  1. #include"reg51.h"
  2. #include"intrins.h"
  3. #include"absacc.h"

  4. #define busy 0x80
  5. #define uchar unsigned char
  6. #define unit unsigned int

  7. sbit RS=P2^3;
  8. sbit RW=P2^4;
  9. sbit E=P2^5;
  10. sbit KEY1=P2^0;
  11. sbit KEY2=P2^1;
  12. sbit KEY3=P2^2;
  13. uchar code tab[8]={0x02,0x06,0x04,0x0C,0x08,0x09,0x01,0x03};
  14. uchar temp;
  15. void delay(uchar k)
  16. {
  17. unit i,j;
  18. for(i=0;i<k;i++)
  19. {
  20. for(j=0;j<60;j++)
  21. {;}
  22. }
  23. }
  24. void test_1602busy()
  25. {
  26. P0=0xFF;
  27. E=1;
  28. RS=0;
  29. RW=1;
  30. _nop_();
  31. _nop_();
  32. while(P0&busy)
  33. {
  34. E=0;
  35. _nop_();
  36. E=1;
  37. _nop_();
  38. }
  39. E=0;
  40. }

  41. void write_1602Command(uchar co)
  42. {
  43. test_1602busy();
  44. RS=0;
  45. RW=0;
  46. E=0;
  47. _nop_();
  48. P0=co;
  49. _nop_();
  50. E=1;
  51. _nop_();
  52. E=0;
  53. }

  54. void write_1602Data(uchar Data)
  55. {
  56. test_1602busy();
  57. P0=Data;
  58. RS=1;
  59. RW=0;
  60. E=1;
  61. _nop_();
  62. E=0;
  63. }

  64. void init_1602(void)
  65. {
  66. write_1602Command(0x38);
  67. delay(5);
  68. write_1602Command(0x01);
  69. delay(5);
  70. write_1602Command(0x06);
  71. delay(5);
  72. write_1602Command(0x0F);
  73. delay(5);
  74. write_1602Command(0x0C);
  75. }
  76. void DisplayOneChar(uchar X, uchar Y, uchar DData)
  77. {
  78. Y&=1;
  79. X&=15;
  80. if(Y)X|=0x40;
  81. X|=0x80;
  82. write_1602Command(X);
  83. write_1602Data(DData);
  84. }
  85. void display_1602(uchar *DData,X,Y)
  86. {
  87. uchar ListLength=0;
  88. Y&=0x01;
  89. X&=0x0F;
  90. while(X<16)
  91. {
  92.   DisplayOneChar(X,Y,DData[ListLength]) ;
  93. ListLength++;
  94. X++;
  95. }

  96. }

  97. void main()
  98. {
  99. uchar i=0;
  100. uchar delay_v=100;
  101. uchar flag=0;
  102. P1=0xFF;
  103. P2=0xFF;
  104. init_1602();
  105. display_1602("STA:  SPD:  ",0,0);
  106. display_1602("RUN:      ",0,1);
  107. while(1)
  108. {
  109.         if(KEY2==1)DisplayOneChar(4,0,'Z');
  110.         else DisplayOneChar(4,0,'F');
  111. if(KEY3==0)
  112. {
  113. i++;
  114. i=i%3;
  115. while(KEY3==0)
  116. {;}
  117. }
  118. switch(i)
  119. {
  120. case 0:delay_v=100;DisplayOneChar(13,0,'1');break;
  121. case 1:delay_v=75;DisplayOneChar(13,0,'2');break;
  122. case 2:delay_v=100;DisplayOneChar(13,0,'3');break;
  123. }
  124. if(KEY1==0)
  125. {
  126. display_1602("      RUN:ON    ",0,1);
  127. if(flag==0)
  128. {
  129. if(KEY2==1)
  130. { temp=0;
  131. P1=tab[temp];
  132. flag=1;
  133. delay(delay_v);
  134. }
  135. if(KEY2==0)
  136. { temp=6;
  137. P1=tab[temp];
  138. flag=1;
  139. delay(delay_v);
  140. }
  141. }
  142. if(KEY2==1)
  143. { temp++;
  144. if(temp==8)
  145. {temp=0;}
  146. P1=tab[temp];
  147. delay(delay_v);
  148. }
  149. if(KEY2==0)
  150. { temp--;
  151. if(temp==0xFF)
  152. {temp=7;}
  153. P1=tab[temp];
  154. delay(delay_v);
  155. }
  156. }
  157. else display_1602("    RUN:off      ",0,1);
  158. }
  159. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表