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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

電設 管道鋼珠的程序和電路原理圖+51單片機源程序

[復制鏈接]
跳轉到指定樓層
樓主
電路原理圖如下:



系統理論分析與計算

1、管道傾斜角度的分析   
小球在管道中運動需要受力,通過受力分析獲取受力之間的關系角度;與力聯系在一起的是加速度a,從而引入小球運動速度的公式;考慮到摩擦力,小球釋放的方式,傳感器的位置,通過整體固定來減小誤差;通過程序對時間的精進減小誤差。傳感器A距離A端及S1 = 28.5cm,傳感器B距離B端S2 = 2cm。摩擦系數0.04。
2、小球滾動加速度a的計算
1小球在管道中運動速度分析
當從管道口放下小球時速度為零,通過加速度a變速運動,在通過兩個電感式接近開關會計算這段距離的時間,通過物理分析可得方程組:S1 = 1/2*a*T1^2; S2 =(a*T1)*T2 + 1/2*a*T2^2;綜合方程組可得S2/S1 = 2S1*(T2/T1) + S1*(T2/T1)^2;令x=T2/T1;
2將帶回公式S2/S1 = 2S1*(T2/T1) +S1*(T2/T1)^2求算T1
代入公式會得(x+1)^2 = S2/S1;求得T1,T1 = T2/((S2/S1+1)^1/2-1);
3求出加速度a
因為a=2*S1/T1^2;兩傳感器間的距離已知;
所以最終a=(2S2+4S1-4*(S1*S2+S1^2)^1/2)/T1^2;

3、所求夾角余弦值的計算
1受力分析
小球在運動過程中會受到重力,管壁的支持力和摩擦力,通過物理公式m*g*Sinx - u*m*g*Cosx =ma;(  注:u為摩擦系數,m為質量,a為加速度,x為角度)
2夾角余弦值的公式化簡
通過數學三角函數公式化簡得到最終等式為:Cosx=(-a*u+(-a^2+g^2+g*u^2)^1/2)/(g*(1+u^2));參數帶入得算法公式:x=((0.5503*t^3-3.535*T^2)+72.59*x-260.5)/(x-8.322)+0.5;程序的設計
1程序功能描述與設計思路
通過3個獨立按鍵分別實現切換菜單,設置角度顯示數據
1)通過單片機檢測從傳感器檢測得來的開關量,實現對通過鋼珠的計數并顯示;
2)對比兩個鋼珠通過傳感器的時間,顯示鋼珠運動方向;
3)通過采樣鋼珠在不同角度通過兩個傳感器的時間差進行擬合曲線,得出擬合曲線方程并計算,從而顯示出管道的的傾斜角度;

單片機源程序如下:
  1. #include "reg51.h"       
  2. #define LCDPORT P0  //液晶的數據口


  3. sbit DU = P2^0; //數碼管段選
  4. sbit WE = P2^1; //數碼管位選
  5. sbit CS88 = P2^2; //8X8點陣使能
  6. sbit DS1302=P2^7; //HJ-C52主板 時鐘復位 關掉DS1302 以免影響其他IO口實驗。
  7. sbit LCD1602=P2^5;//HJ-C52主板 LCD1602復位 關掉LCD1602顯示 以免影響其他IO口實驗。
  8. sbit LCD1602_RS = P1^0;        //位定義,液晶的數據/命令選擇
  9. sbit LCD1602_RW = P1^1;        //位定義,液晶的讀寫選擇
  10. sbit LCD1602_EN = P2^5;        //位定義,液晶使能信號

  11. sbit k1=P3^4;         //選擇
  12. sbit k2=P3^5;         //確認返回
  13. sbit k3=P3^6;         //加
  14. sbit k4=P3^7;         //減

  15. sbit catch_A = P2^0;        //A傳感器引腳定義
  16. sbit catch_B = P2^4;        //B傳感器引腳定義




  17. unsigned int ang,time,ang_ge,ang_shi,ang_bai,power;
  18. float time_buff=0;
  19. char buft = 0;
  20. char i=0,j=0,n=0,flag_1=0,flag_2=0,flag_0=1,flag_buf=0;
  21. char ten,bits,a,b,c,d,z=1;
  22. char NO_a = 0,NO_b = 0,buff;//NO_a、NO_b分別代表A傳感器、B傳感器檢測到的鋼珠數,buff表示識別運動方向的標志

  23. unsigned char code ucForum0[] =" Welcome  SZ076 ";
  24. unsigned char code ucForum_0[] =" Pipe Ball Move";
  25. unsigned char code ucForum[] ="ang:";          //在CODE區定義一個用于顯示的常量字符串
  26. unsigned char code ucForum1[]="Set fuc:";

  27.           
  28. unsigned char code ucForum2[]="Num:";
  29. unsigned char code ucForum3[]="Dir:";
  30. unsigned char code ucForum5[]="Cyc:";

  31. void conversion(char date);
  32. void direction();
  33. void screen_0();
  34. void screen_1();
  35. void screen_2();
  36. void hj_c52();  //HJ-C52復位函數
  37. void key_control();
  38. void Delay(unsigned int uiCount);        //延時函數
  39. void LCD1602_CheckBusy(void);        //液晶忙檢測
  40. void LCD1602_WriteInformation(unsigned char ucData,bit bComOrData);        //在液晶上寫數據或者寫命令,0為命令,1為數據
  41. void LCD1602_Init(void);        //液晶初始化
  42. void LCD1602_MoveToPosition(unsigned char x,unsigned char y);        //液晶的坐標移動到指定位置
  43. void LCD1602_DisplayOneCharOnAddr(unsigned char x,unsigned char y,unsigned char ucData);        //在液晶指定位置顯示字符
  44. void LCD1602_DisplayString(unsigned char addr,unsigned char *ucStr);        //在液晶上顯示字符串

  45. //按鍵控制
  46. void key_control()          
  47. {               
  48.                   
  49.                   if(k1==0)
  50.                   {
  51.                        
  52.                            j++;
  53.                            while(k1!=1);
  54.                            if(j==2)  j=0;
  55.                   }

  56.                   if(k2 == 0)
  57.                   {
  58.                                 i++;
  59.                                 if(i==1)
  60.                                 {
  61.                                         flag_0=0;
  62.                                         flag_1=1;
  63.                                         flag_2=0;
  64.                                 }
  65.                                 else  
  66.                                 {
  67.                                         flag_1=0;
  68.                                         flag_2=1;
  69.                                         flag_0=0;

  70.                         }
  71.                                 if(i>=2)  i=0;
  72.                                 NO_b=0;                          //將計過的球數清零
  73.                         buff = 0;                  //將運動方向標志清零
  74.                                 while(k2!=1);
  75.                                 LCD1602_WriteInformation(0x01,0);
  76.                   }
  77.        

  78.                   if(k3==0)
  79.                  {
  80.                                    n++;
  81.                                 while(k3!=1);
  82.                   }


  83.                  
  84.                   if(k4==0)
  85.                  {
  86.                                    n--;
  87.                                 while(k4!=1);
  88.                   }

  89. }


  90. //數據處理
  91. void conversion(char date)                       
  92. {
  93.                   date<0?date=-date:date;
  94.                   ten=date/10+0x30;
  95.                   bits=date%10+0x30;
  96. }


  97. //        判斷小球運動方向
  98. void direction()                                 
  99. {
  100.                   while(catch_A == 0)         //判斷小球通過A傳感器與否
  101.                 {
  102.                      
  103.                          if(c == 0)
  104.                          {          
  105.                                  NO_a++;
  106.                                  c++;          //防止觸發A傳感器期間多次執行NO_a++;
  107.                          }
  108.                          a = 1;
  109.                      if(a > b)
  110.                      {
  111.                      buff = 2;     //  從B到A
  112.                                  a  = 0;
  113.                      }
  114.                 }
  115.                 c = 0;
  116.                 while(catch_B == 0)
  117.                 {
  118.                         if(d == 0)
  119.                         {
  120.                                 NO_b++;
  121.                                 d++;
  122.                         }
  123.                         b = 1        ;
  124.                     if(b > a)
  125.                     {
  126.                                   buff = 1;    //從A到B
  127.                             b = 0;
  128.                     }
  129.                 }
  130.                 d = 0;

  131. }

  132. //初始界面
  133. void screen_0()
  134. {
  135.                   if(flag_0==1)
  136.                   {
  137.                           LCD1602_DisplayString(0x80,ucForum0);        //顯示的內容
  138.                          
  139.                           LCD1602_DisplayString(0xc0,ucForum_0);        //顯示的內容

  140.                   }
  141. }


  142. //界面一
  143. void screen_1()                       
  144. {
  145.                  if(flag_1==1)
  146.                                  {

  147.                                          if(j==0)
  148.                                          {
  149.                                            LCD1602_WriteInformation(0xcf,0);
  150.                                            LCD1602_WriteInformation(42,1);
  151.                                    z+=n;
  152.                                            if(z>=4) z=1;
  153.                                            if(z<=0)        z=3;
  154.                                            n=0;
  155.                                          }
  156.                                   
  157.                                   LCD1602_DisplayString(0x80,ucForum);        //顯示的內容
  158.                                              LCD1602_DisplayString(0xc0,ucForum1);        //顯示的內容
  159.                                           LCD1602_WriteInformation(0xca,0);
  160.                                           LCD1602_WriteInformation(z%10+48,1);
  161.                  }
  162. }

  163. void screen_2()           //界面二
  164. {
  165.                   char Cyc = 0;
  166.                              if(flag_2==1)
  167.                                   {
  168.                           LCD1602_DisplayString(0x80,ucForum2);        //Num
  169.                                                                       
  170.                                      LCD1602_DisplayString(0x88,ucForum3);        //Dir
  171.                                     
  172.                                      LCD1602_DisplayString(0xc0,ucForum5);        //Cyc
  173.                                   
  174.                                   

  175.                                   switch(z)
  176.                                   {
  177.                                           case 1:       
  178.                                                 conversion(NO_b);
  179.                                                         LCD1602_WriteInformation(0x84,0);          //計數
  180.                                                         LCD1602_WriteInformation(ten,1);
  181.                                                         LCD1602_WriteInformation(0x85,0);
  182.                                                     LCD1602_WriteInformation(bits,1);  
  183.                                         break;
  184.                                         case 2:
  185.                                                 if(buff == 1)                                                  //方向
  186.                                                         {
  187.                                                           LCD1602_WriteInformation(0x8c,0);          
  188.                                                           LCD1602_WriteInformation(0x30,1);
  189.                                                           LCD1602_WriteInformation(0x8d,0);
  190.                                                           LCD1602_WriteInformation(1+0x30,1);
  191.                                                         }
  192.                                             if(buff == 2)
  193.                                                         {
  194.                                                           LCD1602_WriteInformation(0x8c,0);
  195.                                                           LCD1602_WriteInformation(1+0x30,1);
  196.                                                           LCD1602_WriteInformation(0x8d,0);
  197.                                                           LCD1602_WriteInformation(0x30,1);
  198.                                                         }   
  199.                                         break;
  200. //                                          case 3:       
  201. //                                                flag_buf=1;                                                                           //角度
  202. //                                                angle_zhi();
  203. //                                                        LCD1602_WriteInformation(0xc4,0);
  204. //                                                        LCD1602_WriteInformation((power/10)+0x30,1);
  205. //                                                        LCD1602_WriteInformation(0xc5,0);
  206. //                                                        LCD1602_WriteInformation(((power%10))+0x30,1);  
  207. //                                                        conversion(power);
  208. //                                                        LCD1602_WriteInformation(0xc4,0);
  209. //                                                        LCD1602_WriteInformation(ten,1);
  210. //                                                        LCD1602_WriteInformation(0xc5,0);
  211. //                                                        LCD1602_WriteInformation(bits,1);

  212. //                                                        LCD1602_WriteInformation(0xc6,0);
  213. //                                                        LCD1602_WriteInformation(time/1000+0x30,1);
  214. //                                                        LCD1602_WriteInformation(0xc7,0);
  215. //                                                        LCD1602_WriteInformation(time/100%10+0x30,1);
  216. //                                                        LCD1602_WriteInformation(0xcd,0);
  217. //                                                        LCD1602_WriteInformation(time/10%10+0x30,1);
  218. //                                                        LCD1602_WriteInformation(0xcf,0);
  219. //                                                        LCD1602_WriteInformation(time%10+0x30,1);

  220. //                                        break;
  221.                                         case 3:                                                                                   //周期
  222.                                                 Cyc=NO_b/2;
  223.                                                         conversion(Cyc);
  224.                                                         LCD1602_WriteInformation(0xc4,0);
  225.                                                         LCD1602_WriteInformation(ten,1);
  226.                                                         LCD1602_WriteInformation(0xc5,0);
  227.                                                         LCD1602_WriteInformation(bits,1);
  228.                                         break;
  229.                                  }
  230.     }
  231. }

  232. //main函數
  233. void main()
  234. {
  235.    
  236.     hj_c52();  //HJ-C52復位函數
  237.         LCD1602_Init();          //液晶初始化
  238.         TMOD=0x01;   //
  239.         TH0=0;
  240.         TL0=0;

  241.         while(1)                 //程序循環
  242.         {
  243.                    key_control();
  244.                 screen_0();
  245.                 screen_1();
  246.                 screen_2();
  247.                 direction();
  248.                 if(k1 == 0)
  249.                 {
  250.                                 Delay(20);
  251.                                 if(k1==0)
  252.                                 {
  253.                                         flag_buf++;
  254.                                         while(k1 != 1);
  255.                                 }
  256.                 }
  257.                 while(flag_buf==1)
  258.        {
  259.           if(catch_A == 0)
  260.               {
  261.                     TH0 = 0;
  262.                         TL0 = 0;
  263.                         TR0 = 1;        //定時器T0計數
  264.                        
  265.                         while(catch_B == 1)
  266.                         {
  267.                                  if(TF0 == 1)
  268.                                  {
  269.                                    buft++;
  270.                                    TF0 = 0;
  271.                                  }
  272.                         }
  273.                         TR0 = 0        ;        //定時器T0停止
  274.                         time=((TH0*256) + TL0 + (65536*buft))/10;           //ms為單位
  275.                         time_buff=time/100.0;
  276.                         power=(int)((-(0.6566*time_buff*time_buff)+28.75*time_buff+13.76)/(time_buff-8.925))+0.5;
  277.                         conversion(power);
  278.                         LCD1602_WriteInformation(0x84,0);
  279.                         LCD1602_WriteInformation(ten,1);
  280.                         LCD1602_WriteInformation(0x85,0);
  281.                         LCD1602_WriteInformation(bits,1);
  282.                         TH0 = 0;
  283.                         TL0 = 0;
  284.                         time = 0;
  285.                         buft = 0;
  286.              }
  287.                          if(k1 == 0)
  288.                         {
  289.                                 Delay(20);
  290.                                 if(k1==0)
  291.                                 {
  292.                                         flag_buf++;
  293.                                         while(k1 != 1);
  294.                                 }
  295.                         }
  296.   }
  297.     if(flag_buf==2)
  298.         {
  299.            flag_buf=0;
  300.            LCD1602_WriteInformation(0x01,0);
  301.        
  302.         }
  303.         }
  304.        
  305. }
  306.                





  307. /******************************************************************************
  308. 函數名稱:LCD1602_CheckBusy
  309. 函數功能:忙檢測
  310. *******************************************************************************/
  311. void LCD1602_CheckBusy(void)               
  312. {
  313.         unsigned char i = 255;
  314.         LCDPORT = 0xFF;  //讀之前先置位,準備讀取IO口數據
  315.         LCD1602_RS = 0;
  316.         LCD1602_RW = 1;         //使液晶處于讀數據狀態
  317.         LCD1602_EN = 1;         //使能液晶,高電平有效
  318.         while((i--) && (LCDPORT & 0x80));        //忙檢測
  319.         LCD1602_EN = 0;
  320. }

  321. /******************************************************************************
  322. 函數名稱:LCD1602_WriteInformation
  323. 函數功能:向LCD1602液晶寫入數據或者命令
  324. ********************************************************************/
  325. void LCD1602_WriteInformation(unsigned char ucData,bit bComOrData)         
  326. {
  327.         LCD1602_CheckBusy();         //在寫入數據或者命令前先進行忙檢測
  328.         LCDPORT = ucData;                 //先將數據或者命令送至IO
  329.         LCD1602_RS = bComOrData;        //確定是寫入數據還是寫命令
  330.         LCD1602_RW = 0;                //使液晶處于寫入信息狀態
  331.         LCD1602_EN = 1;                //使能液晶,高電平有效
  332.         LCD1602_EN = 0;
  333. }

  334. /******************************************************************************
  335. 函數名稱:LCD1602_Init
  336. 函數功能:液晶初始化函數
  337. *******************************************************************************/
  338. void LCD1602_Init(void)                 
  339. {
  340.         LCD1602_WriteInformation(0x38,0);
  341.         Delay(200);
  342.         LCD1602_WriteInformation(0x38,0);
  343.         Delay(100);
  344.         LCD1602_WriteInformation(0x38,0);
  345.         Delay(100);
  346.         LCD1602_WriteInformation(0x38,0);         //寫入命令,5x7點陣工作方式,8位數據接口
  347.         Delay(100);
  348.         LCD1602_WriteInformation(0x0c,0);        //顯示設置,開顯示,光標不顯示,不閃爍
  349.         Delay(20);
  350.         LCD1602_WriteInformation(0x01,0);        //清屏指令
  351.         Delay(20);
  352. }

  353. /******************************************************************************
  354. 函數名稱:LCD1602_MoveToPosition
  355. 函數功能:將液晶的光標移動到指定的位置
  356. *******************************************************************************/
  357. void LCD1602_MoveToPosition(unsigned char x,unsigned char y)       
  358. {
  359.         if(0 == x)
  360.                 LCD1602_WriteInformation((0x80 | y),0);           //光標定位到第一行的y列
  361.         if(1 == x)
  362.                 LCD1602_WriteInformation((0xC0 | y),0);           //光標定義到第二行的y列
  363. }

  364. /******************************************************************************
  365. 函數名稱:LCD1602_DisplayOneCharOnAddr
  366. 函數功能:在指定的位置上顯示指定的字符
  367. *******************************************************************************/
  368. void LCD1602_DisplayOneCharOnAddr(unsigned char x,unsigned char y,unsigned char ucData)
  369. {
  370.         LCD1602_MoveToPosition(x,y);   //光標位置
  371.         LCD1602_WriteInformation(ucData,1);          //寫入數據
  372. }

  373. /******************************************************************************
  374. 函數名稱:LCD1602_DisplayString
  375. 函數功能:顯示字符串
  376. *******************************************************************************/
  377. void LCD1602_DisplayString(unsigned char addr,unsigned char *ucStr)       
  378. {
  379.     LCD1602_WriteInformation(addr,0);
  380.         while(*ucStr != '\0')           //字符串結束之前,循環顯示
  381.         {
  382.                  LCD1602_WriteInformation(*ucStr,1);         //依次寫入每一個字符
  383.                  ucStr++;                                                                 //指針增加
  384.         }
  385. }

  386. /******************************************************************************
  387. 函數名稱:Delay
  388. 函數功能:延時函數
  389. *******************************************************************************/
  390. void Delay(unsigned int uiCount)
  391. {
  392.         unsigned char j = 244;
  393.         for(;uiCount > 0;uiCount--) while(--j);       
  394. }


  395. /******************************************************************/
  396. // 以下為HJ-C52復位函數
  397. /******************************************************************/
  398.     void hj_c52()
  399.     {
  400.     LCD1602=0;//關掉LCD1602 以免影響點陣管IO口電評
  401.     DS1302=0;//關掉DS1302 以免影響點陣管IO口電評
  402.     CS88=0;     //關掉8X8點陣顯示
  403.     WE=1;  
  404.     P0=0Xff;
  405.     WE=0;        //關掉數碼管顯示
  406.     CS88=0;      //關掉8X8點陣顯示
  407.     }
復制代碼

所有資料51hei提供下載:
原理圖.rar (436.93 KB, 下載次數: 18)
M題程序.rar (60.15 KB, 下載次數: 23)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:447051 發表于 2019-1-26 10:47 | 只看該作者
看起來不錯啊!有空試試看!
回復

使用道具 舉報

板凳
ID:473161 發表于 2019-1-26 17:11 | 只看該作者
謝謝樓主
回復

使用道具 舉報

地板
ID:492460 發表于 2019-3-31 13:52 | 只看該作者

樓主,角度有問題啊
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日日日操 | 北条麻妃av一区二区三区 | 午夜精品久久久久久久星辰影院 | 波多野结衣一区二区 | 99久久久国产精品 | 蜜桃传媒一区二区 | 91综合在线观看 | 99热欧美 | 久久综合色综合 | 精品国产一区二区三区久久久蜜月 | 亚洲天堂一区 | www精品美女久久久tv | 日韩一区二区三区av | 国产精品欧美一区二区三区 | 免费观看一级特黄欧美大片 | 亚洲国产精品99久久久久久久久 | 欧美日韩视频在线 | 欧美一区二区综合 | 亚洲国产精品成人 | 久久激情视频 | 国产美女永久免费无遮挡 | 人妖无码 | 亚洲 欧美 日韩在线 | 亚洲精品久久久久avwww潮水 | 一级黄色片在线看 | 久久青草av| www.久久久久久久久久久 | 干狠狠| 日韩在线一区二区三区 | 久久专区 | 久久99精品久久久久久狂牛 | 日韩视频一区二区 | 在线观看日韩 | 三级成人在线 | 日韩成人在线播放 | 日韩在线电影 | 噜啊噜在线 | 男女国产网站 | 中文字幕电影在线观看 | 午夜视频免费在线观看 | 精品福利在线 |