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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機超聲波測距控制步進電機轉速實驗程序

  [復制鏈接]
跳轉到指定樓層
樓主
這個起初是學校的單片機實驗課的簡單題目,就是這幾天的課程,但是我發現網上找不到直接的程序,就自力更生用我很有限的單片機知識和C語言基礎寫了這個程序。里面測距和步進電機驅動都是現成的,不過我稍微改動了一點點,可以顯示學號,設置兩個閾值控制三段轉速,我試了試,在這個學校很常見的開發板上很好用。程序很簡單很簡陋,但確實給我帶來了一些新的知識,也希望能給有需要的朋友一點點幫助。
這里是顯示固定數字,程序里各個部分我都放了注釋,本來是為了讓老師多給點分寫的,不過好像大家也能看得更清楚。

這里是顯示實時測距。

這里是兩段閾值的加減設置,用來隔開三段速度控制


單片機源程序如下:
  1. /*********************************************************************
  2. * 實 驗 名:超聲波測距控制步進電機實驗
  3. *********************************************************************/
  4. #include "reg52.h"
  5. #include <intrins.h>

  6. sbit RX=P2^1;
  7. sbit TX=P2^0;          //t,e定義超聲波管教
  8. unsignedint  time=0;
  9. unsignedint  timer=0;
  10. unsigned long S=0;
  11. bit      flag =0; //測量標志
  12. bit                srFlag                = 1;
  13. unsignedint a=100;
  14. unsignedint b=600;
  15. unsignedinta_o=100;
  16. unsignedintb_o=600;
  17. unsignedint mid;
  18. unsigned char        iSW        = 0;
  19. unsigned char uMode                                = 1;

  20. #define GPIO_DIG P0
  21. sbit LSA=P2^2;
  22. sbit LSB=P2^3;
  23. sbit LSC=P2^4;
  24. unsigned char code DIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  25. unsigned char disbuff[8] ={0,0,0,0,0,0,0,0};
  26. //電機IO
  27. #define GPIO_MOTOR P1
  28. sbit F1 = P1^0;
  29. sbit F2 = P1^1;
  30. sbit F3 = P1^2;
  31. sbit F4 = P1^3;
  32. //按鍵IO
  33. sbit K1=P3^1;
  34. sbit K2=P3^0;
  35. sbit K3=P3^2;
  36. sbit K4=P3^3;
  37. unsigned char        keyEx        = 0;

  38. unsigned char code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //反轉順序
  39. unsigned char code FFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正轉順序

  40. unsigned char Direction,Speed;
  41. void Delay(unsigned int t);
  42. void  Motor();
  43. voidDigDisplay();

  44. void Delay1ms()   //?? 0us
  45. {
  46. unsigned char a,b,c;
  47. for(c=2;c>0;c--)
  48. for(b=38;b>0;b--)
  49. for(a=13;a>0;a--);       
  50.                        
  51. }

  52. voidDigDisplay()
  53. {
  54.         unsigned char i;
  55.         unsignedint j;
  56.         for(i=0;i<8;i++)
  57.         {
  58.                 switch(i)         //位選,選擇點亮的數碼管,
  59.                 {
  60.                         case(0):
  61.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  62.                         case(1):
  63.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  64.                         case(2):
  65.                                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  66.                         case(3):
  67.                                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  68.                         case(4):
  69.                                 LSA=0;LSB=0;LSC=1; break;//顯示第4位
  70.                         case(5):
  71.                                 LSA=1;LSB=0;LSC=1; break;//顯示第5位
  72.                         case(6):
  73.                                 LSA=0;LSB=1;LSC=1; break;//顯示第6位
  74.                         case(7):
  75.                                 LSA=1;LSB=1;LSC=1; break;//顯示第7位  //勢能端       
  76.                 }
  77.                  GPIO_DIG=disbuff[i];//發送段碼
  78.                        
  79.                 j=10;                                                 //掃描間隔時間設定       
  80.                 while(j--);                                            //延時
  81.                 GPIO_DIG=0x00;//消隱
  82.         }
  83. }

  84. unsigned char scanKey(void)
  85. {
  86. // 如果此前沒有按鍵
  87.         if(keyEx == 0 )
  88.         {
  89.                 if( K1 == 0 )
  90.                 {
  91.                         keyEx        = 1;        // 有鍵按下
  92.                         return 1;                // 鍵值1表示閾值ab切換
  93.                 }
  94.                 if( K2 == 0 )
  95.                 {
  96.                         keyEx        = 1;        // 有鍵按下
  97.                         return 2;                // 鍵值2表示'+'
  98.                 }
  99.                 if( K3 == 0 )
  100.                 {
  101.                         keyEx        = 1;        // 有鍵按下
  102.                         return 3;                // 鍵值3表示'-'
  103.                 }
  104.                 if( K4 == 0 )
  105.                 {
  106.                         keyEx        = 1;        // 有鍵按下
  107.                         return 4;                // 鍵值4表示數位切換
  108.                 }               
  109.                 return 0;
  110.         }
  111.         else
  112.         {
  113.                 if( K1 == 1 && K2 == 1 && K3 == 1 && K4 == 1 )
  114.                 {
  115.                         keyEx        = 0;        // 等待沒有按鍵后,按鍵保護值清0
  116.                 }
  117.         }
  118.         return 0;
  119. }
  120. /*********************************************************************
  121. * 函 數 名:Motor
  122. * 函數功能:電機旋轉函數
  123. *********************************************************************/
  124. void  Motor()
  125. {
  126.         unsigned char i;
  127.         for(i=0;i<8;i++)
  128.         {
  129.                 if(Direction==1)
  130.                         GPIO_MOTOR = FFW[i]&0x1f;  //???
  131.                 if(Direction==2)
  132.                         GPIO_MOTOR = FFZ[i]&0x1f;
  133.                 Delay(Speed);        //????       
  134.         }       
  135. }

  136. void  zd3()  interrupt 3                  //T1中斷用來掃描數碼管和計800MS啟動模塊
  137. {
  138.         TH1=0xf8;
  139.         TL1=0x30;
  140.         DigDisplay();
  141.         timer++;
  142.         if(srFlag||timer>=100)
  143. //200ms 中斷一次
  144.         {
  145.                 srFlag = 0;
  146.                 timer=0;
  147.                 TX=1;        //至高點平                                //800MS  啟動一次模塊
  148.                 _nop_();
  149.                 _nop_();
  150.                 _nop_();
  151.                 _nop_();
  152.                 _nop_();       
  153.                 _nop_();
  154.                 _nop_();
  155.                 _nop_();
  156.                 _nop_();
  157.                 _nop_();        
  158.                 _nop_();
  159.                 _nop_();
  160.                 _nop_();
  161.                 _nop_();
  162.                 _nop_();       
  163.                 _nop_();
  164.                 _nop_();
  165.                 _nop_();
  166.                 _nop_();
  167.                 _nop_();
  168.                 //20us高電平               
  169.                 TX=0;
  170.         }
  171. }

  172. /*********************************************************************
  173. * 函 數 名:main
  174. * 函數功能:主函數
  175. *********************************************************************/
  176. void main(void)
  177. {
  178.         unsigned char i;
  179.         Speed=15;
  180.         TMOD=0x11;                   //設T0為方式1,GATE=1;
  181.         TH0=0;
  182.         TL0=0;         
  183.         //清0
  184.        
  185.         TH1=0xf8;                   //2MS定時
  186.         TL1=0x30;
  187.         ET0=1;             //允許T0中斷
  188.         ET1=1;                           //允許T1中斷
  189.         TR1                = 0;
  190.         EA                = 0;
  191.         while(scanKey() == 0 )
  192.         {
  193.                 disbuff[0]        = DIG_CODE[4];
  194.                 disbuff[1]        = DIG_CODE[5];
  195.                 disbuff[2]        = DIG_CODE[0];
  196.                 disbuff[3]        = DIG_CODE[1];
  197.                 disbuff[4]        = DIG_CODE[0];
  198.                 disbuff[5]        = DIG_CODE[3];
  199.                 disbuff[6]        = DIG_CODE[1];
  200.                 disbuff[7]        = DIG_CODE[1];
  201.                 DigDisplay();
  202.         }
  203.         for(i=0;i<100;i++)
  204.         {
  205.                 Delay1ms();       
  206.         }
  207.         if(uMode == 1 )
  208.         {
  209.                 TR1                = 1;
  210.                 EA                = 1;
  211.         }
  212.         while(1)
  213.         {
  214.                 if(uMode == 0 )
  215.                 {
  216.                         disbuff[0]        = DIG_CODE[a% 10];
  217.                         disbuff[1]        = DIG_CODE[(a / 10) % 10];
  218.                         disbuff[2]        = DIG_CODE[(a / 100) % 10];
  219.                         disbuff[3]        = DIG_CODE[(a / 1000) % 10];
  220.                         disbuff[4]        = DIG_CODE[b% 10];
  221.                         disbuff[5]        = DIG_CODE[(b / 10) % 10];
  222.                         disbuff[6]        = DIG_CODE[(b / 100) % 10];
  223.                         disbuff[7]        = DIG_CODE[(b / 1000) % 10];
  224.                         DigDisplay();
  225.                         switch(scanKey() )
  226.                         {
  227.                         // 如果按下了模式切換鍵
  228.                                 case 1:
  229.                                         uMode        = 1;
  230.                                         TR1                = 1;
  231.                                         EA                = 1;
  232.                                         break;                               
  233.                                 // 如果按下了'+'鍵
  234.                                 case 2:
  235.                                         switch(iSW )
  236.                                         {
  237.                                                 case 0:
  238.                                                 mid = a;
  239.                                                 if( mid        + 100 <= 3000 )
  240.                                                 mid        += 100;
  241.                                                 a = mid;
  242.                                                 break;                                                       
  243.                                                 case 1:
  244.                                                 mid = b;
  245.                                                 if( mid        + 100 <= 3000 )
  246.                                                 mid        += 100;
  247.                                                 b = mid;
  248.                                                 break;                                                                                               
  249.                                                 default:
  250.                                                 break;
  251.                                         }
  252.                                         break;                               
  253.                                 // 如果按下了'-'鍵
  254.                                 case 3:
  255.                                         switch(iSW )
  256.                                         {
  257.                                                 case 0:
  258.                                                 mid = a;
  259.                                                 if( mid        - 100 > 0 )
  260.                                                 mid        -= 100;
  261.                                                 a = mid;
  262.                                                 break;                                                       
  263.                                                 case 1:
  264.                                                 mid = b;
  265.                                                 if( mid        - 100 > 0 )
  266.                                                 mid        -= 100;
  267.                                                 b = mid;                                               
  268.                                                 default:
  269.                                                 break;
  270.                                         }
  271.                                         break;                               
  272.                                 // 如果按下了換位鍵
  273.                                 case 4:
  274.                                         iSW++;
  275.                                         if(iSW>= 2 )
  276.                                                 iSW        = 0;
  277.                                         break;                                       
  278.                                         default:
  279.                                         break;       
  280.                         }
  281.                         if (a>=b)
  282.                         {
  283.                                 a = a_o;
  284.                                 b + b_o;
  285.                         }
  286.                 }
  287.                         else
  288.                 {
  289.                         TH0                 = 0;                // 計數清0,等待測距計數
  290.                         TL0                 = 0;                       
  291.                         // 我們假定工作模式=1代表超聲波測距
  292.                         while( !RX &&scanKey() != 1 );                       
  293.                         // 如果有echo信號或者有SET按鍵
  294.                         TR0        = 1;                       
  295.                         if( !RX &&keyEx )                // 如果是有按鍵而沒有echo,則返回參數設置
  296.                         {
  297.                                 // 如果有SET按鍵
  298.                                 uMode        = 0;
  299.                                 TR0                = 0;
  300.                                 TR1                = 0;
  301.                                 EA                = 0;
  302.                                 continue;
  303.                         }                       
  304.                         // 如果有echo信號,則一直等待echo信號結束
  305.                         while(RX );
  306.                         // echo信號結束,停止計數
  307.                         TR0                        = 0;
  308.                         time        = TH0 * 256 + TL0;
  309.                         S= (long)(time*0.17);
  310.                         disbuff[3]=DIG_CODE[S%10000/1000];
  311.                         disbuff[2]=DIG_CODE[S%1000/100];
  312.                         disbuff[1]=DIG_CODE[S%100/10];
  313.                         disbuff[0]=DIG_CODE[S%10/1];
  314.                         disbuff[4]        = 0;
  315.                         disbuff[5]        = 0;
  316.                         disbuff[6]        = 0;
  317.                         disbuff[7]        = 0;
  318. ……………………

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

所有資料51hei提供下載:
c源文件.rar (2.33 KB, 下載次數: 89)

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:546439 發表于 2019-6-26 19:44 | 只看該作者
為什么我這里報錯第九行
回復

使用道具 舉報

板凳
ID:421308 發表于 2019-7-13 16:56 | 只看該作者
正需要,學習下
回復

使用道具 舉報

地板
ID:583390 發表于 2019-7-13 17:24 | 只看該作者
用不了,什么情況
回復

使用道具 舉報

5#
ID:421308 發表于 2019-7-13 17:26 | 只看該作者
用不了,這個
回復

使用道具 舉報

6#
ID:471817 發表于 2019-7-13 23:16 | 只看該作者
感謝樓主,可以正常使用
大家看下代碼有些沒有空格的改下就行,
比如第九行的unsignedint  time=0;
改成unsigned int  time=0;
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产一区二区在线 | 日韩欧美国产精品 | 日韩欧美网 | 欧美8一10sex性hd | 四季久久免费一区二区三区四区 | 农村妇女毛片精品久久久 | 欧美色专区 | 黄色一级大片在线免费看产 | www.99久久.com | 亚洲精品久久久蜜桃 | 国产欧美日韩一区 | 天天草夜夜骑 | 精品一区二区三区在线播放 | 亚洲精品一区二区三区免 | 日本三级网站在线观看 | 日韩欧美国产精品 | 亚洲欧美日韩在线 | www.蜜桃av| 日本aⅴ中文字幕 | 日韩午夜一区二区三区 | 在线视频91 | 99热在线观看精品 | 天天操天天操 | 福利视频亚洲 | 亚洲黄色一区二区三区 | 四虎影院在线观看av | 色播99| 日韩精品一区二区三区中文在线 | 天堂色 | 欧美性受xxxx白人性爽 | 国产精品免费在线 | 亚洲精品一区二区另类图片 | 九九精品在线 | 中文字幕日韩欧美一区二区三区 | 久久久精彩视频 | 男人av在线播放 | 国产高清在线精品 | 亚洲视频中文字幕 | 黄网站在线播放 | 欧美成年人视频在线观看 | 一区二区三区视频在线免费观看 |