久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5977|回復: 2
打印 上一主題 下一主題
收起左側

51單片機直流電機測速測距系統程序設計 LCD12864顯示

[復制鏈接]
跳轉到指定樓層
樓主
1.設計目的
     設計并制作一個測量模擬小車(如模擬自行車、摩托車等)的行駛速度及距離的裝置,且能分別顯示其行駛速度和行駛距離值。
2.方案簡介
  硬件:
     主控:stc89c52rc最小系統板
     測速模塊:槽式光電測速傳感器,20柵格編碼盤
     顯示:LCD12864
     輸入:4*4鍵盤
     電機:5v直流電機
     電機驅動:L298N
     報警模塊:放大電路、蜂鳴器、發光二極管
     電源:單片機、LCD、傳感器供電由最小系統版供電;
         電機驅動由3節3.7v鋰電池供電(電機驅動要和單片機共地)


     因為都是用的模塊,除了信號放大電路,其他都是杜邦線連接單片機與各個模塊。
  軟件:
     大致思路是定時器T0輸出PWM波改變電機轉速,模擬小車轉動。外部中斷INT0記脈沖(下降沿)。測速方法為M法。有能力的可以嘗試改為M/T法,
  單片機的定時器TI已經特意留出來了,具體程序見附件。


單片機源程序如下:
  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;   //最高速度設置
  9. u8     actual_speed=0;           //實際速度
  10. u8     temp=0;  //按鍵掃描中間值
  11. uchar  key_flag=0;//按鍵標志
  12. unsigned int    num_flag=0;          // 按鍵次數標志

  13. unsigned char flag_h=0;
  14. unsigned char us500 = 0;//500us定時次數計數器
  15. unsigned char ms100_flag=0; //100ms定時到標志
  16. unsigned char s1_flag=0;        //500ms標志
  17. unsigned char Time1L=0,Time1H=0,Time0L=0,Time0H=0;//PWM波定時器占空比高,低電平時間變量
  18. unsigned char        maichong_count=0;        //電機轉數脈沖計數器

  19. char         NextState=1; //定時器高,低電平轉換標志
  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'};        //第一行顯示緩沖區
  31. uchar Buff2[4]={'0','0',' ','0'};  //  第二行顯示緩沖區
  32. uchar Buff3[4]={'0','0',' ','0'};  // 第三行顯示緩沖區
  33. uchar Buff4[4]={'0','0',' ','0'};  // 第四行顯示緩沖區        


  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. //延時一毫秒子程序
  43. void mDelay(uint Delay)           
  44. {        uint i;
  45.         for(;Delay > 0;Delay--)
  46.                 for(i = 0;i < 110;i++);
  47. }

  48. /**********************************************************/
  49. //定時計數器0初始化               
  50. void Init_T0()
  51. {
  52.         TMOD=0x01; //定時器0模式設置
  53.         Time1H=(65536-PWM_a)/256;  //定時器0初值1
  54.     Time1L=(65536-PWM_a)%256;  // 定時器0初值1
  55.         Time0H=(65536+PWM_a-T)/256;        // 定時器0初值2
  56.         Time0L=(65536+PWM_a-T)%256;// 定時器0初值2
  57.         TH0=Time1H;
  58.         TL0=Time1L;
  59.         ET0=1;
  60.         TR0=1;
  61.         EX0=1; //外中斷0允許
  62.         IT0=1; //外部中斷邊沿觸發方式
  63.         NextState=1;
  64.         PWM=1;
  65. }
  66. /**********************************************************/
  67. //電機啟動
  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. //電機停止
  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')      //輸入設定轉速
  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. /*****************速度距離計算*************/
  235. void a_count(void)
  236. {
  237.         actual_speed=CurrentWaves*3.6;  //實際轉速計算
  238.         
  239.         distant=distance/10;
  240. }
  241. /*******************顯示***************************/
  242. void disp(void)
  243. {
  244.            write_12864com(0x80+3);  //12864LCD第一行顯示 設置參數指示顯示位置
  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第二行顯示 設置參數指示顯示位置
  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第三行顯示 設置參數指示顯示位置
  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];  //  占空比個位
  264.            write_12864com(0x88+5);               
  265.            write_12864data(Buff3[1]);
  266.                 Display_string(6,2,"km/h");
  267.         

  268.            write_12864com(0x98+3);    //12864LCD第四行顯示 設置參數指示顯示位置
  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];  //  占空比個位
  274.            write_12864com(0x98+5);               
  275.            write_12864data(Buff4[2]);
  276.            Buff4[2]=Buff[distant%10];
  277.            Display_string(6,3,"m");

  278. }


  279. /*****************報警*************/

  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中斷服務程序
  293. void time0(void) interrupt 1
  294. {               
  295.         EX0=0;         //關閉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 )        //定時100ms到否
  311.         {        
  312. ……………………

  313. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

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


   

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

板凳
ID:247623 發表于 2023-3-17 16:25 | 只看該作者
這個只有程序,沒有仿真文件,大家不要下
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲天堂精品久久 | 中文字幕亚洲欧美 | 电影91久久久 | 午夜精品久久 | 一本大道久久a久久精二百 欧洲一区二区三区 | 黄色骚片 | av大全在线 | 九九在线视频 | 亚洲精品在线看 | 黄色片免费看视频 | 国产精品区二区三区日本 | 亚洲欧美视频一区 | 亚洲欧美一区二区三区国产精品 | 欧美激情精品久久久久久 | 成人午夜免费视频 | 男女羞羞视频在线免费观看 | 嫩草网| 99精品网 | 中文字幕av一区二区三区 | 一级全黄视频 | 亚洲综合国产 | 欧美日韩一区在线播放 | 亚洲精品一区二区三区在线 | 成人综合一区二区 | 久久久久久免费毛片精品 | 精品久久久久久 | 天天草天天干 | 四虎永久免费黄色影片 | 亚洲一区 中文字幕 | 五月婷婷视频 | 国产在线二区 | 中文字幕国产 | 精产国产伦理一二三区 | 99热精品在线| 亚洲精品欧美一区二区三区 | 日韩欧美网 | 国产精品久久av | 在线日韩精品视频 | 国产精品视频在 | 免费国产一区二区视频 | 国产成人精品一区二区三区四区 |