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

QQ登錄

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

搜索
查看: 13510|回復(fù): 10
收起左側(cè)

單個(gè)超聲波測(cè)距模塊控制小車前進(jìn)/后退程序—(有最詳細(xì)的注釋)

  [復(fù)制鏈接]
ID:76556 發(fā)表于 2015-4-10 01:55 | 顯示全部樓層 |閱讀模式



  1. //晶振=11.0592M
  2. //MCU=STC516RD+
  3. //************************************
  4. #include<reg51.h>        //包括一個(gè)52標(biāo)準(zhǔn)內(nèi)核的頭文件
  5. #define uchar unsigned char        //定義一下方便使用
  6. #define uint unsigned int        //定義一下方便使用
  7. uchar Distance;        //定義Distance(距離)變量
  8. sbit Tr1=P1^4;        //定義超聲波模塊的控制端(Tr)
  9. sbit Ec1=P1^5;        //定義超聲波模塊的接收端(Ec)
  10. sbit IN1=P2^1;        //定義L298n步進(jìn)電機(jī)驅(qū)動(dòng)芯片的IN1管腳由51MCU的P2^1管腳控制IN1對(duì)應(yīng)控制OUT1電機(jī)驅(qū)動(dòng)腳
  11. sbit IN2=P2^0;        //定義L298n步進(jìn)電機(jī)驅(qū)動(dòng)芯片的IN2管腳由51MCU的P2^0管腳控制IN2對(duì)應(yīng)控制OUT2電機(jī)驅(qū)動(dòng)腳
  12. sbit IN3=P2^2;        //定義L298n步進(jìn)電機(jī)驅(qū)動(dòng)芯片的IN3管腳由51MCU的P2^2管腳控制IN3對(duì)應(yīng)控制OUT3電機(jī)驅(qū)動(dòng)腳
  13. sbit IN4=P2^3;        //定義L298n步進(jìn)電機(jī)驅(qū)動(dòng)芯片的IN4管腳由51MCU的P2^3管腳控制IN4對(duì)應(yīng)控制OUT4電機(jī)驅(qū)動(dòng)腳
  14. sbit ENA=P2^5;        //定義L298n步進(jìn)電機(jī)驅(qū)動(dòng)芯片的ENA管腳由51MCU的P2^5管腳控制ENA腳是使能腳控制IN1,2腳輸入的高低電平是否有效
  15. sbit ENB=P2^4;        //定義L298n步進(jìn)電機(jī)驅(qū)動(dòng)芯片的ENB管腳由51MCU的P2^4管腳控制ENA腳是使能腳控制IN3,4腳輸入的高低電平是否有效
  16. void Delays(uint x)        //延時(shí)函數(shù)Delays..定義形參x為unsigned int 型
  17. {
  18. uint q,w;        //定義實(shí)際參數(shù)q,w為unsigned int 型
  19. for(q=x;q>0;q--)        //q=x,q小于0,q減一。如果q小于零則退出此語(yǔ)句
  20. for(w=110;w>0;w--);        //w=110,w小于0,w減一。如果w小于零則退出此語(yǔ)句
  21. }
  22. void init()           //初始化函數(shù)init
  23. {           //初始化Ec1=0;
  24. Ec1=0;           //初始化Tr1=0;
  25. Tr1=0;
  26. }
  27. void Ranging()           //Ranging(測(cè)距)函數(shù)用于檢測(cè)出距離并控制電機(jī)做出相應(yīng)的動(dòng)作
  28. {
  29. static uchar Num3=0;           //定義unsigned char型局部變量Num3,并且只第一次執(zhí)行時(shí)Num3=0,以后執(zhí)行時(shí)不會(huì)再次初始,主要用于超聲波模塊的使能信號(hào)過(guò)后用來(lái)檢測(cè)接收端Ec1是否有高電平,或用于進(jìn)入和退出while循環(huán),,
  30. bit Bit_Num2;           //定義bit型變量(51特有變量)Bit_Num2。。主要用于關(guān)閉定時(shí)器并進(jìn)入下一個(gè)函數(shù)(檢測(cè)Ec1的脈寬長(zhǎng)度)
  31. Tr1=1;           //Tr1給高電平
  32. Delays(10);           //至少延時(shí)10微秒
  33. Tr1=0;           //Tr1給低電平
  34. Num3=1;           //Num3給1
  35. Bit_Num2=0;           //Bit_Num2給0用于進(jìn)入下一步while循環(huán)
  36. while(Num3==1)           //當(dāng)Num3檢測(cè)到定于1時(shí)進(jìn)入本循環(huán)
  37. {
  38. while(Ec1==1)           //當(dāng)Ec1檢測(cè)等于1是進(jìn)入本循環(huán),當(dāng)Ec1(接收信號(hào)的高電平脈寬結(jié)束后退出此循環(huán))
  39. {           //Bit_Num2給以用來(lái)鍵入笑一個(gè)if語(yǔ)句
  40. Bit_Num2=1;           //打開(kāi)定時(shí)器TR0進(jìn)入定時(shí)器0中斷
  41. TR0=1;
  42. }
  43. if(Ec1==0&Bit_Num2==1)           //如果Ec1等于0(超聲波測(cè)距模塊的接收端發(fā)送到高電平脈寬傳送完后)而且Bit_Num2等于1進(jìn)入此語(yǔ)句
  44. {          
  45. uchar Move;           //定義unsigned char變量Move(用來(lái)進(jìn)入switch語(yǔ)句并選擇那種工作方式)
  46. TR0=0;           //關(guān)閉定時(shí)器
  47. if(Distance<50)           //如果脈寬小于50微秒
  48. {
  49. Move=1;           //Move等于1
  50. }
  51. else if(Distance>50)           //如果上一語(yǔ)句不成立則檢測(cè)此語(yǔ)句,如果脈寬的時(shí)間長(zhǎng)度大于50微秒
  52. {
  53. Move=2;           //Move等于2
  54. }
  55. switch(Move)           //檢測(cè)Move的值并進(jìn)入相應(yīng)的語(yǔ)句
  56. {
  57. case 1:P3=0x00;IN1=0;IN2=1;IN3=0;IN4=1;ENA=1;ENB=1;Num3=0;Distance=0;break;         //如果Move等于1,則電機(jī)正轉(zhuǎn),并P3口所有IO口低電平,并給Distance清零,然后退出此語(yǔ)句
  58. case 2:P3=0xff;IN1=1;IN2=0;IN3=1;IN4=0;ENA=1;ENB=1;Num3=0;Distance=0;break;         //如果Move等于0,則電機(jī)反轉(zhuǎn),并P3口所有IO口高電平,并給Distance清零,然后退出此語(yǔ)句
  59. default:break;         //如果以上都不符合,則退出此語(yǔ)句,準(zhǔn)備下一循環(huán)
  60. }
  61. Move=0;
  62. }           //Move清零;
  63. }       

  64. }
  65. void open_time()           //定時(shí)器初始函數(shù)
  66. {
  67. TMOD=0x01;           //確定工作方式位01,(內(nèi)容自己上網(wǎng)查啊,大概是16位手動(dòng)重裝計(jì)數(shù)器,,記不清了)
  68. TH0=(65536-1)/256;           //確定一微秒記一次
  69. TL0=(65536-1)%256;           //確定一微秒記一次
  70. EA=1;           //打開(kāi)總中斷
  71. ET0=1;           //打開(kāi)定時(shí)器0中斷
  72. TR0=0;           //關(guān)閉定時(shí)器0
  73. }
  74. void main()           //main函數(shù)(主函數(shù)),,所有函數(shù)都從這個(gè)函數(shù)開(kāi)始執(zhí)行
  75. {          
  76. init();           //執(zhí)行init函數(shù)
  77. open_time();           //執(zhí)行open_time函數(shù)
  78. while(1)           //進(jìn)入大循環(huán)(除非執(zhí)行中斷函數(shù)否則永不退出)
  79. {
  80. Ranging();           //執(zhí)行Ranging函數(shù)
  81. }
  82. }
  83. void time() interrupt 1           //定時(shí)器0中斷語(yǔ)句
  84. {
  85. TH0=(65536-1)/256;           //重裝初值TH0=(65536-1)/256;
  86. TL0=(65536-1)%256;           //重裝初值TL0=(65536-1)%256;
  87. Distance++;           //每次走一步Distance加一
  88. if(Distance==6553)           //如果Distance等于65535就進(jìn)入此語(yǔ)句
  89. {
  90. Distance=0;           //Distance的值清零
  91. }
  92. }
復(fù)制代碼





評(píng)分

參與人數(shù) 2威望 +5 黑幣 +6 收起 理由
趙京輝 + 1 很給力!
absflash + 5 + 5 這注釋是夠詳細(xì)的

查看全部評(píng)分

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:83494 發(fā)表于 2015-6-20 11:47 | 顯示全部樓層
大神在不?
回復(fù)

使用道具 舉報(bào)

ID:84495 發(fā)表于 2015-7-3 21:18 | 顯示全部樓層
這注釋是夠詳細(xì)的
回復(fù)

使用道具 舉報(bào)

ID:85948 發(fā)表于 2015-7-27 21:56 | 顯示全部樓層
哈哈 這個(gè)詳細(xì),謝謝樓主了
回復(fù)

使用道具 舉報(bào)

ID:79544 發(fā)表于 2015-8-3 19:34 | 顯示全部樓層
用12M晶振單片機(jī)是STC12C5608AD下載進(jìn)去不好用?
回復(fù)

使用道具 舉報(bào)

ID:114460 發(fā)表于 2016-4-16 23:55 | 顯示全部樓層
終于找到了
回復(fù)

使用道具 舉報(bào)

ID:219197 發(fā)表于 2017-7-12 18:43 | 顯示全部樓層
樓主大佬
回復(fù)

使用道具 舉報(bào)

ID:257144 發(fā)表于 2017-12-4 13:19 | 顯示全部樓層
感謝樓主分享找了好久
回復(fù)

使用道具 舉報(bào)

9#
無(wú)效樓層,該帖已經(jīng)被刪除
ID:327876 發(fā)表于 2018-5-11 20:54 | 顯示全部樓層
大神我的驅(qū)動(dòng)上沒(méi)有ENA和ENB管腳怎么辦
回復(fù)

使用道具 舉報(bào)

ID:449368 發(fā)表于 2018-12-21 21:53 | 顯示全部樓層
大神 怎么在你這個(gè)程序上添加舵機(jī)和pwm程序呢 可以指點(diǎn)一下么
回復(fù)

使用道具 舉報(bào)

ID:512052 發(fā)表于 2019-4-30 16:06 | 顯示全部樓層
very nice!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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