標(biāo)題: 單片機(jī)+1602人機(jī)交互設(shè)置界面控制直流電機(jī)轉(zhuǎn)速,顯示不正確,請教黑友 [打印本頁]

作者: 萌新急救    時間: 2018-6-3 07:56
標(biāo)題: 單片機(jī)+1602人機(jī)交互設(shè)置界面控制直流電機(jī)轉(zhuǎn)速,顯示不正確,請教黑友
① 通過獨(dú)立式鍵盤和1602液晶顯示器設(shè)計(jì)獨(dú)立的人機(jī)交互設(shè)置界面,可設(shè)定直流電機(jī)的轉(zhuǎn)速,直流電機(jī)按照設(shè)定的轉(zhuǎn)速轉(zhuǎn)動,建議4個按鍵的功能分別為“設(shè)置”用于進(jìn)入設(shè)置界面、“→”用于調(diào)整光標(biāo)位置、“↑”用于調(diào)整光標(biāo)所在位置數(shù)值、“確定”用于保存設(shè)置值并返回主界面;
    ② 設(shè)定數(shù)據(jù)時,光標(biāo)位置處的數(shù)字應(yīng)閃爍顯示;
③ 可以定義一個“發(fā)送”鍵,按下后,直流電機(jī)按照設(shè)定參數(shù)轉(zhuǎn)動;
④ 直流電機(jī)轉(zhuǎn)動過程中,監(jiān)控端可以獲取直流電機(jī)運(yùn)行狀態(tài),并通過LCD顯示;
⑤ 直流電機(jī)轉(zhuǎn)動過程中,可以修改目標(biāo)轉(zhuǎn)速,修改后根據(jù)新的設(shè)定轉(zhuǎn)速控制電機(jī)轉(zhuǎn)動。


單片機(jī)源程序:
  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)              //進(jìn)入設(shè)置
  79.   {delay1(10);if(k1==0){ k=1;}
  80.   if(k==1)
  81.   {
  82.   if(k2==0)      //右移光標(biāo)
  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)        //增加該位數(shù)值
  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--;             //速度大于設(shè)定值
  159.   else  m++;                  //速度小于設(shè)定值

  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. }
復(fù)制代碼




作者: 萌新急救    時間: 2018-6-3 08:00
忘記說了,我的液晶顯示只有一個閃爍的0,大佬們可不可以幫我看看,第一次做也不太會
作者: 糖楓    時間: 2018-12-25 11:34
樓主你的問題解決了嗎,我們現(xiàn)在也在做好這個類似的,也遇到了問題




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1