找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5977|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)直流電機(jī)測(cè)速測(cè)距系統(tǒng)程序設(shè)計(jì) LCD12864顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
1.設(shè)計(jì)目的
     設(shè)計(jì)并制作一個(gè)測(cè)量模擬小車(chē)(如模擬自行車(chē)、摩托車(chē)等)的行駛速度及距離的裝置,且能分別顯示其行駛速度和行駛距離值。
2.方案簡(jiǎn)介
  硬件:
     主控:stc89c52rc最小系統(tǒng)板
     測(cè)速模塊:槽式光電測(cè)速傳感器,20柵格編碼盤(pán)
     顯示:LCD12864
     輸入:4*4鍵盤(pán)
     電機(jī):5v直流電機(jī)
     電機(jī)驅(qū)動(dòng):L298N
     報(bào)警模塊:放大電路、蜂鳴器、發(fā)光二極管
     電源:?jiǎn)纹瑱C(jī)、LCD、傳感器供電由最小系統(tǒng)版供電;
         電機(jī)驅(qū)動(dòng)由3節(jié)3.7v鋰電池供電(電機(jī)驅(qū)動(dòng)要和單片機(jī)共地)


     因?yàn)槎际怯玫哪K,除了信號(hào)放大電路,其他都是杜邦線連接單片機(jī)與各個(gè)模塊。
  軟件:
     大致思路是定時(shí)器T0輸出PWM波改變電機(jī)轉(zhuǎn)速,模擬小車(chē)轉(zhuǎn)動(dòng)。外部中斷INT0記脈沖(下降沿)。測(cè)速方法為M法。有能力的可以嘗試改為M/T法,
  單片機(jī)的定時(shí)器TI已經(jīng)特意留出來(lái)了,具體程序見(jiàn)附件。


單片機(jī)源程序如下:
  1. #include <reg52.h>               
  2. #include <12864.c>
  3. #define T  500         //PWM波 周期50us

  4. typedef unsigned int   u32;
  5. typedef unsigned short u16;
  6. typedef unsigned char  u8 ;

  7. uchar  key=0;   //鍵值
  8. u8     speed_high=5;   //最高速度設(shè)置
  9. u8     actual_speed=0;           //實(shí)際速度
  10. u8     temp=0;  //按鍵掃描中間值
  11. uchar  key_flag=0;//按鍵標(biāo)志
  12. unsigned int    num_flag=0;          // 按鍵次數(shù)標(biāo)志

  13. unsigned char flag_h=0;
  14. unsigned char us500 = 0;//500us定時(shí)次數(shù)計(jì)數(shù)器
  15. unsigned char ms100_flag=0; //100ms定時(shí)到標(biāo)志
  16. unsigned char s1_flag=0;        //500ms標(biāo)志
  17. unsigned char Time1L=0,Time1H=0,Time0L=0,Time0H=0;//PWM波定時(shí)器占空比高,低電平時(shí)間變量
  18. unsigned char        maichong_count=0;        //電機(jī)轉(zhuǎn)數(shù)脈沖計(jì)數(shù)器

  19. char         NextState=1; //定時(shí)器高,低電平轉(zhuǎn)換標(biāo)志
  20. double         CurrentWaves = 0;
  21. double         distance=0;
  22. u16                distant=0;
  23. u16           PWM_a=300;//占空比初值

  24. sbit IN1=P2^6;
  25. sbit IN2=P2^7;
  26. sbit PWM=P2^5;   //PWM波輸出端口
  27. sbit bee=P3^7;   



  28. uchar code Code[]="123A456B789C*0#D";         //鍵值碼
  29. uchar code Buff[]="0123456789";           //顯示字形碼
  30. uchar Buff1[4]={'0','0',' ','0'};        //第一行顯示緩沖區(qū)
  31. uchar Buff2[4]={'0','0',' ','0'};  //  第二行顯示緩沖區(qū)
  32. uchar Buff3[4]={'0','0',' ','0'};  // 第三行顯示緩沖區(qū)
  33. uchar Buff4[4]={'0','0',' ','0'};  // 第四行顯示緩沖區(qū)        


  34. void  keydown(void);
  35. void  keyscan(void);
  36. void  keyjudge(void);
  37. void disp(void);
  38. void a_count(void);
  39. void rnu(void);
  40. void stop(void);




  41. /**********************************************************/
  42. //延時(shí)一毫秒子程序
  43. void mDelay(uint Delay)           
  44. {        uint i;
  45.         for(;Delay > 0;Delay--)
  46.                 for(i = 0;i < 110;i++);
  47. }

  48. /**********************************************************/
  49. //定時(shí)計(jì)數(shù)器0初始化               
  50. void Init_T0()
  51. {
  52.         TMOD=0x01; //定時(shí)器0模式設(shè)置
  53.         Time1H=(65536-PWM_a)/256;  //定時(shí)器0初值1
  54.     Time1L=(65536-PWM_a)%256;  // 定時(shí)器0初值1
  55.         Time0H=(65536+PWM_a-T)/256;        // 定時(shí)器0初值2
  56.         Time0L=(65536+PWM_a-T)%256;// 定時(shí)器0初值2
  57.         TH0=Time1H;
  58.         TL0=Time1L;
  59.         ET0=1;
  60.         TR0=1;
  61.         EX0=1; //外中斷0允許
  62.         IT0=1; //外部中斷邊沿觸發(fā)方式
  63.         NextState=1;
  64.         PWM=1;
  65. }
  66. /**********************************************************/
  67. //電機(jī)啟動(dòng)
  68.      void  run(void)
  69. {

  70.          IN1=1;
  71.          IN2=0;
  72.          EA=0;
  73.          Init_T0();
  74.          EA=1;
  75.          IN1=1;
  76.          IN2=0;
  77. }
  78. /**********************************************************/
  79. //電機(jī)停止
  80. void stop()
  81. {
  82.         IN1=0;
  83.         IN2=0;
  84.         PWM=0;
  85.         ET0=0;
  86.         TR0=0;
  87.         EA=0;        
  88. }
  89. /*************************************************************/
  90. //判斷鍵是否按下
  91. void  keydown(void)
  92. {  
  93.           P1=0xF0;
  94.           if(P1!=0xF0)
  95.         {  
  96.           mDelay(20);
  97.           keyscan();
  98.     }
  99. }


  100. /**********************************************************/

  101.         // 鍵掃描子程序
  102. void  keyscan(void)
  103. {
  104.       P1=0xF0;                //行線為輸入,列線為輸出,并置列線輸出全為0
  105.           temp=P1;                //讀P1口      
  106.       temp=temp&0xF0;
  107.       temp=~((temp>>4)|0xF0);
  108.       if(temp==1)
  109.         key=0;
  110.       else if(temp==2)
  111.         key=1;
  112.       else if(temp==4)
  113.         key=2;
  114.       else if(temp==8)
  115.         key=3;
  116.      P1=0x0F;                 //列線為輸入,行線為輸出,并置行線輸出全為0  
  117.          temp=P1;                 //讀P1口
  118.      temp=temp&0x0F;
  119.      temp=~(temp|0xF0);        
  120.      if(temp==1)
  121.         key=key+0;
  122.      else if(temp==2)
  123.         key=key+4;
  124.      else if(temp==4)
  125.         key=key+8;
  126.      else if(temp==8)
  127.         key=key+12;
  128.                 P1=0xF0;
  129.             while(P1!=0XF0);
  130.           {  
  131.                  mDelay(5);
  132.       }
  133.      keyjudge();             //判斷按鍵功能           
  134. }


  135. /*************************************************************/
  136. //按鍵功能判斷
  137. void  keyjudge(void)
  138. {
  139.            uchar a=Code[key];
  140.            a=a-0x30;
  141.            if(key==3)
  142.                  {          Buff1[2]='>';                 //按鍵指示A 顯示
  143.                           Buff2[2]=' ';                 //按鍵指示B 取消顯示
  144.                           Buff3[2]=' ';                 //按鍵指示C 取消顯示
  145.                           key_flag='A';
  146.                       num_flag=0;
  147.                  }
  148.            else if(key==7)
  149.                  {
  150.                    Buff3[2]=' ';                 //按鍵指示C 取消顯示
  151.                    Buff1[2]=' ';                 //按鍵指示A取消顯示
  152.                    Buff2[2]='>';                 //按鍵指示B 顯示
  153.            key_flag='B';
  154.                    num_flag=0;
  155.                  }
  156.            else if(key==11)
  157.                  {
  158.                                             
  159.                           Buff1[2]=' ';                    //按鍵指示A 取消顯示
  160.                       Buff2[2]=' ';                         //按鍵指示B 取消顯示
  161.                             Buff3[2]='>';                         //按鍵指示C 顯示
  162.                            run();
  163.                  }
  164.                 else if(key==15)           
  165.                  {           Buff1[2]=' ';            
  166.                               Buff2[2]=' ';               
  167.                            Buff3[2]=' ';               
  168.                           stop();
  169.                           actual_speed=0;
  170.                           CurrentWaves=0;
  171.                           disp();                 
  172.                  }
  173.                  else if(key==14)           //#############
  174.                  {
  175.                           //PWM_a-=10;
  176.                          run();
  177.                          stop();
  178.                          distant=0;
  179.                          disp();
  180.                  }
  181.                  else if(key==12)           //***********
  182.                  {
  183.                          //PWM_a+=10;
  184.                          run();
  185.                          stop();
  186.                          distance=0;
  187.                          distant=0;
  188.                          actual_speed=0;
  189.                          CurrentWaves=0;
  190.                          disp();
  191.                  }
  192.                  else
  193.                  {
  194.                          if (key_flag=='A')      //輸入設(shè)定轉(zhuǎn)速
  195.                          {
  196.                                  if(num_flag==1)
  197.                                          {
  198.                                                    Buff1[1]=a+0x30;
  199.                                                    PWM_a=PWM_a+a;
  200.                                                    num_flag=0;
  201.                                          }
  202.                                    else if (num_flag==0)
  203.                                          {
  204.                                                   Buff1[0]=a+0x30;
  205.                                                   PWM_a=a*10;
  206.                                                   num_flag++;
  207.                                          }
  208.                                          disp();
  209.                                 }
  210.                          else if(key_flag=='B')               
  211.                           {
  212.                                   if(num_flag==1)
  213.                                          {
  214.                                                    Buff2[1]=a+0x30;
  215.                                                    speed_high=speed_high+a;
  216.                                                    num_flag=0;
  217.                                          }
  218.                                    else if (num_flag==0)
  219.                                          {
  220.                                                   Buff2[0]=a+0x30;
  221.                                                   speed_high=a*10;
  222.                                                   num_flag++;
  223.                                          }
  224.                    disp();
  225.                           }
  226.                   
  227.                     else
  228.                                 {
  229.                                           num_flag=0;
  230.                                           key_flag=0;
  231.                                 }
  232.                 }
  233. }

  234. /*****************速度距離計(jì)算*************/
  235. void a_count(void)
  236. {
  237.         actual_speed=CurrentWaves*3.6;  //實(shí)際轉(zhuǎn)速計(jì)算
  238.         
  239.         distant=distance/10;
  240. }
  241. /*******************顯示***************************/
  242. void disp(void)
  243. {
  244.            write_12864com(0x80+3);  //12864LCD第一行顯示 設(shè)置參數(shù)指示顯示位置
  245.            write_12864data(Buff1[2]);
  246.            write_12864com(0x80+4);                //12864LCD第一行顯示
  247.            write_12864data(Buff1[0]);                 
  248.            write_12864com(0x80+5);               
  249.            write_12864data(Buff1[1]);
  250.            Display_string(6,0,"per");


  251.        write_12864com(0x90+3);        //12864LCD第二行顯示 設(shè)置參數(shù)指示顯示位置
  252.            write_12864data(Buff2[2]);
  253.        write_12864com(0x90+4);            //12864LCD第二行顯示
  254.            write_12864data(Buff2[0]);                 
  255.            write_12864com(0x90+5);               
  256.            write_12864data(Buff2[1]);
  257.            Display_string(6,1,"km/h");

  258.            write_12864com(0x88+3);    //12864LCD第三行顯示 設(shè)置參數(shù)指示顯示位置
  259.            write_12864data(Buff3[2]);
  260.            Buff3[0]=Buff[ actual_speed/10];         //占空比十位
  261.        write_12864com(0x88+4);            //12864LCD第三行顯示        
  262.        write_12864data(Buff3[0]);        
  263.            Buff3[1]=Buff[ actual_speed%10];  //  占空比個(gè)位
  264.            write_12864com(0x88+5);               
  265.            write_12864data(Buff3[1]);
  266.                 Display_string(6,2,"km/h");
  267.         

  268.            write_12864com(0x98+3);    //12864LCD第四行顯示 設(shè)置參數(shù)指示顯示位置
  269.            write_12864data(Buff4[0]);
  270.            Buff4[0]=Buff[distant/100];         //占空比十位
  271.        write_12864com(0x98+4);            //12864LCD第三行顯示        
  272.        write_12864data(Buff4[1]);        
  273.            Buff4[1]=Buff[(distant/10)%10];  //  占空比個(gè)位
  274.            write_12864com(0x98+5);               
  275.            write_12864data(Buff4[2]);
  276.            Buff4[2]=Buff[distant%10];
  277.            Display_string(6,3,"m");

  278. }


  279. /*****************報(bào)警*************/

  280. void warn(void)
  281. {
  282.         if(actual_speed>speed_high||actual_speed==speed_high)
  283.         {
  284.                 bee=0;
  285.         }
  286.         else
  287.         {
  288.                 bee=1;
  289.         }
  290. }

  291. /**********************************************************/
  292. //T0中斷服務(wù)程序
  293. void time0(void) interrupt 1
  294. {               
  295.         EX0=0;         //關(guān)閉INT0中斷
  296.     PWM=~PWM;         //取反
  297.         if( NextState )
  298.         {
  299.                 TL0=Time0L;
  300.                 TH0=Time0H;
  301.                 NextState=0;
  302.         }
  303.         else
  304.         {
  305.                 TL0=Time1L;
  306.                 TH0=Time1H;                        
  307.                 NextState=1;
  308.                 us500++;
  309.         }
  310.         if( us500 > 199 )        //定時(shí)100ms到否
  311.         {        
  312. ……………………

  313. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
51測(cè)速測(cè)距12864.zip (47.96 KB, 下載次數(shù): 114)


   

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:341601 發(fā)表于 2019-4-15 03:42 | 只看該作者
你的接線方式可以發(fā)下么
回復(fù)

使用道具 舉報(bào)

板凳
ID:247623 發(fā)表于 2023-3-17 16:25 | 只看該作者
這個(gè)只有程序,沒(méi)有仿真文件,大家不要下
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表