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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4989|回復: 2
收起左側

51單片機智能小車PCB源程序 C51FPS.LIB浮點運算庫下載

[復制鏈接]
ID:747099 發表于 2020-11-28 18:27 | 顯示全部樓層 |閱讀模式
解壓C51FPS.rar
把C51FPS.LIB這個文件放到\Keil\C51\LIB下面,這個文件有浮點運算

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png

原理圖

原理圖


單片機源程序如下:
  1. #include <at89x51.h>        
  2. #include <intrins.h>

  3. #define  TX  P2_0
  4. #define  RX  P2_1

  5. #define Forward_L_DATA  180//當前進不能走直線的時候,請調節這兩個參數,理想的時候是100,100,最大256,最小0。0的時候最慢,256的時候最快
  6. #define Forward_R_DATA  180        //例如小車前進的時候有點向左拐,說明右邊馬達轉速過快,那可以取一個值大一點,另外一個值小一點,例如 200  190
  7.                             //直流電機因為制造上的誤差,同一個脈寬下也不一定速度一致的,需要自己手動調節

  8. /*****按照原圖接線定義******/
  9. sbit L293D_IN1=P1^2;
  10. sbit L293D_IN2=P1^3;
  11. sbit L293D_IN3=P1^6;
  12. sbit L293D_IN4=P1^7;

  13. sbit L293D_EN1=P1^4;
  14. sbit L293D_EN2=P1^5;

  15. sbit BUZZ=P2^3;


  16. void Delay400Ms(void);//延時400毫秒函數


  17. unsigned char disbuff[4]={0,0,0,0};//用于分別存放距離的值0.1mm、mm、cm和m的值

  18. void Count(void);//距離計算函數
  19.                           
  20. unsigned int  time=0;//用于存放定時器時間值
  21. unsigned long S=0;//用于存放距離的值
  22. bit  flag =0; //量程溢出標志位
  23. bit  turn_right_flag;


  24. //**********************************************************
  25. //函數名稱:Delay1ms(unsigned int i)
  26. //函數功能:延時i*1ms的子程序(對應于22.1184Mhz晶振)   
  27. //形式參數:unsigned int i
  28. //行參說明:無
  29. //返回參數:無
  30. //使用說明:i為要延時的時間長度,單位是MS,最大可以延時65536 ms
  31. //**********************************************************
  32. void Delay1ms(unsigned int i)
  33. {
  34. unsigned char j,k;
  35. do{
  36.   j = 10;
  37.   do{
  38.    k = 50;
  39.    do{
  40.     _nop_();
  41.    }while(--k);     
  42.   }while(--j);
  43. }while(--i);

  44. }
  45. //**********************************************************
  46. //函數名稱:Delay10us(unsigned char i)
  47. //函數功能:延時i*10us的子程序(對應于22.1184Mhz晶振)   
  48. //形式參數:無
  49. //行參說明:無
  50. //返回參數:無
  51. //使用說明:i為要延時的時間長度,單位是US,最大可以延時250 ms
  52. //**********************************************************
  53. void Delay10us(unsigned char i)
  54. {
  55.    unsigned char j;
  56. do{
  57.   j = 10;
  58.   do{
  59.    _nop_();
  60.    }while(--j);
  61. }while(--i);
  62. }  

  63. //=========================================================================================================================
  64. void Forward()//           前進
  65. {

  66.          L293D_IN1=1;
  67.          L293D_IN2=0;
  68.          L293D_IN3=1;
  69.          L293D_IN4=0;
  70. //     PWM_Set(255-Speed_Right,255-Speed_Left);
  71. }
  72. void Stop(void)        //剎車
  73. {

  74.      L293D_IN1=0;
  75.          L293D_IN2=0;
  76.          L293D_IN3=0;
  77.          L293D_IN4=0;
  78. //         PWM_Set(0,0);
  79. }
  80. void Turn_Retreat()         //后
  81. {
  82.     L293D_IN1=0;
  83.         L293D_IN2=1;
  84.         L293D_IN3=0;
  85.         L293D_IN4=1;
  86. //        PWM_Set(255-Speed_Right,255-Speed_Left);
  87. }

  88. void Turn_left()         //左
  89. {
  90.     L293D_IN1=0;
  91.         L293D_IN2=1;
  92.         L293D_IN3=1;
  93.         L293D_IN4=0;
  94. //        PWM_Set(255-Speed_Right,255-Speed_Left);
  95. }

  96. //=========================================================================================================================
  97. /********距離計算程序***************/
  98.     void Conut(void)
  99.         {
  100.          time=TH1*256+TL1;
  101.          TH1=0;
  102.          TL1=0;
  103.         
  104.          //此時time的時間單位決定于晶振的速度,外接晶振為11.0592MHZ時,
  105.                     //time的值為0.54us*time,單位為微秒
  106.                                 //那么1us聲波能走多遠的距離呢?1s=1000ms=1000000us
  107.                                 // 340/1000000=0.00034米
  108.                                 //0.00034米/1000=0.34毫米  也就是1us能走0.34毫米
  109.                                 //但是,我們現在計算的是從超聲波發射到反射接收的雙路程,
  110.                                 //所以我們將計算的結果除以2才是實際的路程

  111.         S=time*2;//先算出一共的時間是多少微秒。
  112.            S=S*0.17;//此時計算到的結果為毫米,并且是精確到毫米的后兩位了,有兩個小數點
  113.          if(S<=300)         //
  114.          {        
  115.             if(turn_right_flag!=1)
  116.                 {
  117.                     Stop();
  118.                     Delay1ms(5);//發現小車自動復位的時候,可以稍微延長一點這個延時,減少電機反向電壓對電路板的沖擊。
  119.                 }
  120.                 turn_right_flag=1;
  121.                
  122.                 P1_7=0;
  123.                 P2_0=0;
  124.                 P0_6=0;

  125.                 Delay1ms(10);
  126.                
  127.                 P1_7=1;
  128.                 P2_0=1;
  129.                 P0_6=1;

  130.            // Turn_Right(120,120);
  131.            
  132.            Delay1ms(5);         // 關鍵點  延時5MS  
  133.          //  Delay1ms(500);           //后退500MS
  134.            Turn_left();
  135.            Delay1ms(10);           //左轉800MS

  136.          }
  137.          else
  138.          {
  139.             turn_right_flag=0;
  140.             //Forward(Forward_R_DATA,Forward_L_DATA);
  141.                 Forward();


  142.          }
  143.          //=======================================
  144.          if((S>=5000)||flag==1) //超出測量范圍
  145.          {        
  146.           flag=0;
  147.       //DisplayListChar(0, 1, table1);
  148.          }
  149.          else
  150.          {
  151.       disbuff[0]=S%10;
  152.           disbuff[1]=S/10%10;
  153.           disbuff[2]=S/100%10;
  154.           disbuff[3]=S/1000;
  155.          }
  156.         }

  157. /********************************************************/
  158.      void zd0() interrupt 3                  //T0中斷用來計數器溢出,超過測距范圍
  159.   {
  160.     flag=1;                         //中斷溢出標志
  161.         RX=0;
  162.   }

  163. /********超聲波高電平脈沖寬度計算程序***************/
  164. void Timer_Count(void)
  165. {
  166.                  TR1=1;                            //開啟計數
  167.              while(RX);                        //當RX為1計數并等待
  168.              TR1=0;                                //關閉計數
  169.          Conut();                        //計算

  170. }
  171. /********************************************************/
  172.    void  StartModule()                          //啟動模塊
  173.   {
  174.           TX=1;                                             //啟動一次模塊
  175.       Delay10us(2);
  176.           TX=0;
  177.   }
  178. /********************************************************/

  179. /*************主程序********************/
  180. void main(void)
  181. {
  182.     unsigned char i;
  183.         unsigned int a;
  184.         //cmg88();//關數碼管
  185.         Delay1ms(400); //啟動等待,等LCM講入工作狀態
  186. //        LCMInit(); //LCM初始化
  187.         Delay1ms(5);//延時片刻
  188.    TMOD=TMOD|0x10;//設T0為方式1,GATE=1;
  189.     EA=1;
  190.     TH1=0;
  191.     TL1=0;         
  192.     ET1=1;             //允許T0中斷
  193.                                    //開啟總中斷
  194.         //===============================
  195.         //PWM_ini();
  196.         //===============================
  197.         turn_right_flag=0;
  198.         //=================================
  199. B:                for(i=0;i<50;i++) //判斷K3是否按下
  200.                 {
  201.                    Delay1ms(1);        //1ms內判斷50次,如果其中有一次被判斷到K3沒按下,便重新檢測
  202.                    if(P3_5!=0 )//當K3按下時,啟動小車
  203.                    goto B; //跳轉到標號B,重新檢測
  204.                 }
  205.         //蜂鳴器響一聲
  206.         BUZZ=0;        //50次檢測K3確認是按下之后,蜂鳴器發出“滴”聲響,然后啟動小車。
  207.         Delay1ms(50);
  208.         BUZZ=1;//響50ms后關閉蜂鳴器
  209.         //=======================================================================================================================                        
  210.          while(1)
  211.           {
  212.                 RX=1;
  213.             StartModule();
  214.         for(a=951;a>0;a--)
  215.             {
  216.                   
  217.                if(RX==1)
  218.                    {
  219.            Timer_Count();
  220.                    }
  221.              }
  222.            }
  223. }
復制代碼

所有資料51hei提供下載:
03.7z (5.08 MB, 下載次數: 125)

評分

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

查看全部評分

回復

使用道具 舉報

ID:170693 發表于 2024-6-24 21:18 | 顯示全部樓層
下載-C51FBS.LIB文件備用。先謝謝樓主。
回復

使用道具 舉報

ID:170693 發表于 2024-6-24 21:25 | 顯示全部樓層
需要用最新版的winrar解壓
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品视频偷伦精品视频 | 男人天堂国产 | 激情黄色在线观看 | 成人国产精品 | 欧洲精品视频一区 | 国产91精品在线 | 在线观看中文字幕 | 亚洲视频在线免费观看 | 天天影视综合 | 中文久久 | 日本一二区视频 | 亚洲一二三区免费 | 精品欧美乱码久久久久久 | 久久精品国产一区二区三区 | 小h片免费观看久久久久 | 中文字幕乱码一区二区三区 | 精品国产91乱码一区二区三区 | 色综合天天天天做夜夜夜夜做 | 日本黄色一级片视频 | 青青久在线视频 | 亚洲免费在线观看视频 | 日本成人毛片 | 日韩不卡在线 | 中文字幕亚洲欧美日韩在线不卡 | 欧美一级毛片免费观看 | 91精品国产777在线观看 | 青青草综合网 | 欧美日韩久久精品 | 日韩欧美国产精品一区二区 | 日韩精品久久久 | 97人人草 | 91精品国产综合久久精品 | 午夜视频一区二区 | 自拍在线| 国产欧美视频一区二区 | 欧美九九 | 国产二区三区 | 国产农村一级国产农村 | 91精品国产综合久久精品图片 | 91精品久久久久久久 | 国产伦精品一区二区三区视频金莲 |