找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2123|回复: 2
收起左侧

单片机+1602人机交互设置界面控制直流电机转速,显示不正确,请教黑友

[复制链接]
ID:342331 发表于 2018-6-3 07:56 | 显示全部楼层 |阅读模式
① 通过独立式键盘和1602液晶显示器设计独立的人机交互设置界面,可设定直流电机的转速,直流电机按照设定的转速转动,建议4个按键的功能分别为“设置”用于进入设置界面、“→”用于调整光标位置、“↑”用于调整光标所在位置数值、“确定”用于保存设置值并返回主界面;
    ② 设定数据时,光标位置处的数字应闪烁显示;
③ 可以定义一个“发送”键,按下后,直流电机按照设定参数转动;
④ 直流电机转动过程中,监控端可以获取直流电机运行状态,并通过LCD显示;
⑤ 直流电机转动过程中,可以修改目标转速,修改后根据新的设定转速控制电机转动。
捕获.PNG

单片机源程序:
  1. #include<reg52.h>
  2. #include <intrins.h>  

  3. sbit RS=P0^4;
  4. sbit RW=P0^5;
  5. sbit EN=P0^6;

  6. sbit k1=P2^4;
  7. sbit k2=P2^5;
  8. sbit k3=P2^6;
  9. sbit k4=P2^7;

  10. sbit PWM=P0^0;

  11. unsigned int zhua=150;
  12. unsigned char table[3],table1[3];
  13. unsigned char count;
  14. unsigned int m=50;
  15. unsigned char flag;
  16. unsigned int zhuan,i;
  17. unsigned int j;
  18. void delay1(unsigned int z)      //Ñóê±oˉêy
  19.   {
  20.    int x,y;
  21.    for(x=z;x>0;x--)
  22.    for(y=110;y>0;y--);
  23.     }
  24. void writecom(unsigned char com)
  25. {

  26.   RS=0;
  27.   RW=0;
  28.   P1=com;
  29.   EN=1;
  30.   EN=0;
  31. }

  32. void writedata(unsigned char dat)
  33. {

  34.   RS=1;RW=0;
  35.   P1=dat;
  36.   EN=1;
  37.   EN=0;
  38. }

  39. void init()
  40. { EN=0;
  41.   writecom(0x38);
  42.   delay1(5);
  43.   writecom(0x0c);
  44.   delay1(5);
  45.   writecom(0x01);
  46.         delay1(5);

  47. }


  48. void display_v()  //êμ¼ê×aËù
  49. {
  50.   table[0]=zhuan/100+0x30;
  51.   table[1]=zhuan%100/10+0x30;
  52.   table[2]=zhuan%10+0x30;


  53.   writecom(0xc0);
  54.   writedata(table[0]);
  55.   writecom(0xc0+1);
  56.   writedata(table[1]);
  57.   writecom(0xc0+2);
  58.   writedata(table[2]);
  59. }

  60. void dis()  //é趨×aËù£¬table1[]Dèé趨3õÖμ
  61. {
  62.   table1[0]=zhua/100+0x30;
  63.   table1[1]=zhua%100/10+0x30;
  64.   table1[2]=zhua%10+0x30;

  65.   writecom(0x80);
  66.   writedata(table1[0]);
  67.   writecom(0x80+1);
  68.   writedata(table1[1]);
  69.   writecom(0x80+2);
  70.   writedata(table1[2]);
  71. }  

  72. void adjust_v()
  73. {
  74.   zhua=(table1[0]-0x30)*100+(table1[1]-0x30)*10+(table1[2]-0x30);
  75. }

  76. void keyscan(unsigned char k )  
  77. {  
  78.   if(k1==0)              //进入设置
  79.   {delay1(10);if(k1==0){ k=1;}
  80.   if(k==1)
  81.   {
  82.   if(k2==0)      //右移光标
  83.   {delay1(10);
  84.    if(k2==0)
  85.    {
  86.     i++;
  87.         writecom(0x80+i-1);
  88.         writecom(0x0f);
  89.         if(i>3){i=1;}
  90.   if (k3==0)        //增加该位数值
  91.   {delay1(10);
  92.    if (k3==0)
  93.    {   
  94.    switch(i)
  95.    {  
  96.      case 1:
  97.                zhua=zhua+100;
  98.                    break;
  99.          case 2:
  100.                zhua=zhua+10;
  101.                    break;
  102.          case 3:
  103.                zhua++;
  104.                    break;
  105.          if(zhua>200)zhua=0;
  106.          
  107.    }
  108.    if (k4==0)
  109.    {k=0;adjust_v();dis();}
  110.    }}
  111.   }
  112.   }}
  113.   }}


  114. void init2()   //定时器初始化
  115. {
  116.   TMOD=0x11;
  117.   EA=1;
  118.   TH0=(65536-500)/256;   
  119.   TL0=(65536-500)%256;
  120.   ET0=1;
  121.   TR0=0;
  122.   TH1=(65536-50000)/256;
  123.   TL1=(65536-50000)%256;
  124.   ET1=1;
  125.   TR1=1;  
  126. }

  127. void int1_init()
  128. {
  129.   EX1=1;
  130.   IT1=1;
  131. }


  132. void time1()   interrupt 1 using 1
  133. {
  134.   TH1=(65536-50000)/256;
  135.   TL1=(65536-50000)%256;
  136.   zhuan=count*20;
  137.   count=0;
  138.   display_v();

  139. }

  140. void service_int1()  interrupt 0
  141. {count++;}

  142. void biaozhi()
  143. {                                         
  144.   if(zhuan>=zhua)flag=1;               
  145.   if(zhuan<zhua)flag=0;
  146. }

  147. void pwm1()                        //m=50
  148. {
  149.   TH0=(65536-500)/256;
  150.   TL0=(65536-500)%256;  
  151.   j++;
  152.   {if(j<m)PWM=1;
  153.   else if(j>=m&&j<256) PWM=0;}
  154. }


  155. void tiaosu()                     
  156. {
  157.         biaozhi();
  158.   if(flag==1)m--;             //速度大于设定值
  159.   else  m++;                  //速度小于设定值

  160. }

  161. void main()
  162. {
  163.   init();
  164.         init2();int1_init();
  165.         pwm1();
  166.         while(1)
  167.         { dis();
  168.                 diaplay_v();
  169.                 tiaosu();
  170.                 keyscan();
  171.   }
  172. }
复制代码



回复

使用道具 举报

ID:342331 发表于 2018-6-3 08:00 | 显示全部楼层
忘记说了,我的液晶显示只有一个闪烁的0,大佬们可不可以帮我看看,第一次做也不太会
回复

使用道具 举报

ID:454252 发表于 2018-12-25 11:34 | 显示全部楼层
楼主你的问题解决了吗,我们现在也在做好这个类似的,也遇到了问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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