欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 51單片機(jī)L298N循跡避障功能智能小車程序設(shè)計(jì) [打印本頁(yè)]

作者: abscond    時(shí)間: 2023-12-29 10:28
標(biāo)題: 51單片機(jī)L298N循跡避障功能智能小車程序設(shè)計(jì)
該設(shè)計(jì)是在單片機(jī)小車為基礎(chǔ)開(kāi)發(fā)的循跡系統(tǒng)。小車由L298N電機(jī)驅(qū)動(dòng)模塊、紅外循跡模塊,由STC89C52RC控制芯片完成各模塊之間的連接與控制。按鍵能傳送相應(yīng)命令,對(duì)小車移動(dòng)進(jìn)行靈活巧妙的控制。當(dāng)系統(tǒng)啟動(dòng)后,通過(guò)按鍵來(lái)選擇紅外循跡的圖形從而改變小車的移動(dòng)方向。在自動(dòng)模式下,能沿著紅外循跡到地面黑線運(yùn)動(dòng),能躲避障礙物。具體設(shè)計(jì)模塊圖如圖1-1所示。  
制作出來(lái)的實(shí)物圖如下:


電路原理圖如下:


4.1 主程序設(shè)計(jì)
在軟件設(shè)計(jì)中,采用了PWM 調(diào)速、信息融合技術(shù)等,編寫程序時(shí)使用了C/C++語(yǔ)言,實(shí)現(xiàn)相同功能時(shí)只需要更簡(jiǎn)單的語(yǔ)句,循跡模塊主程序?yàn)榕袛嗾Z(yǔ)句,判斷光電開(kāi)關(guān)的狀態(tài),如果其中一個(gè)光電傳感器未接收到反射信號(hào)(黑線或障礙物吸收了紅外光線),單片機(jī)使用PWM 算法調(diào)控,通過(guò)控制電流在一個(gè)周期中的占空比,立刻調(diào)整左右輪差速實(shí)現(xiàn)方向調(diào)控,實(shí)現(xiàn)轉(zhuǎn)彎循跡,如果兩個(gè)光電傳感器同時(shí)未接收到反射信號(hào),單片機(jī)輸出電平停止直流電機(jī)的運(yùn)轉(zhuǎn),實(shí)現(xiàn)避障停車。通過(guò)調(diào)用各個(gè)子函數(shù)實(shí)現(xiàn)智能小車的功能,經(jīng)實(shí)踐檢測(cè)程序的整體可讀性較好,方便移植。
4.2 電機(jī)驅(qū)動(dòng)程序
本設(shè)計(jì)采用 L298N電機(jī)驅(qū)動(dòng)模塊。由L298N模塊各個(gè)端口的邏輯關(guān)系可知,當(dāng) ENA與ENB為 1 時(shí),通過(guò)控制 IN1、IN2、IN3、IN4 端口電平的高低來(lái)改變電機(jī)的轉(zhuǎn)向。電機(jī)方向控制邏輯表如表3-1。同時(shí)單片機(jī)還可以產(chǎn)生PWM波,通過(guò)調(diào)節(jié)占空比的方式來(lái)控制電機(jī)的轉(zhuǎn)速。
4.3 紅外循跡程序
初始化結(jié)束后,接收到循跡指令,小車前方有一對(duì)紅外對(duì)管,分別置于黑線兩側(cè),紅外管相對(duì)于黑線有 2mm到 4mm的距離。當(dāng)兩對(duì)紅外管都能探測(cè)到黑線時(shí),汽車就會(huì)一直向前行駛。當(dāng)左側(cè)傳感器無(wú)法檢測(cè)到黑線時(shí),左側(cè)電機(jī)向前旋轉(zhuǎn),右側(cè)電機(jī)向后旋轉(zhuǎn),利用差速原理實(shí)現(xiàn)車輛的向右轉(zhuǎn)向,直到檢測(cè)到左側(cè)的黑線后,小車?yán)^續(xù)沿直線行駛。同樣,當(dāng)無(wú)法在右側(cè)檢測(cè)到黑線時(shí),右電機(jī)向左旋轉(zhuǎn),左電機(jī)向右旋轉(zhuǎn),實(shí)現(xiàn)車輛的向左轉(zhuǎn)向,直到在右側(cè)檢測(cè)到黑線,小車?yán)^續(xù)直線行駛。循跡流程如圖3-1所示。
4.4 按鍵掃描程序
只要使用單片機(jī),按鍵檢測(cè)基本上是一定要實(shí)現(xiàn)的功能。按鍵檢測(cè)要好用,最重要的是實(shí)時(shí)和去抖。初學(xué)者往往會(huì)在主循環(huán)調(diào)用按鍵檢測(cè)程序(實(shí)時(shí))并利用延時(shí)去抖(準(zhǔn)確)。這種在主循環(huán)內(nèi)延時(shí)的做法對(duì)整個(gè)程序非常不友好,也非常不高效。因此我們將其做成一個(gè)按鍵檢測(cè)的模塊化程序,方便調(diào)用和調(diào)試

單片機(jī)源程序如下:
  1. #include <REGX52.H>
  2. #include "LCD1602.h"
  3. #include "Delay.h"
  4. #include "Timer0.h"
  5. #include "CCDR.h"
  6. #include "Key.h"
  7. sbit MotorA=P1^4;
  8. sbit MotorB=P1^5;

  9. sbit A01=P1^0;
  10. sbit A02=P1^1;
  11. sbit B01=P1^2;
  12. sbit B02=P1^3;

  13. unsigned char Sr=1;////半徑(無(wú)限制)
  14. unsigned char Rr=10;////半徑(1~80)

  15. unsigned char Counter,CompareA,CompareB;        //計(jì)數(shù)值和比較值,用于輸出PWM
  16. unsigned char KeyNum,m,
  17.         SpeedA=13,
  18.   SpeedB=10;


  19. void cwA(int a)///正
  20. {
  21.                 A01=0;
  22.     A02=1;
  23.     CompareA=a;
  24. }
  25. void ccwA(int a)///反
  26. {
  27.                 A01=1;
  28.     A02=0;
  29.     CompareA=a;
  30. }
  31.        
  32. void cwB(int b)///反
  33. {
  34.                 B01=1;
  35.     B02=0;
  36.     CompareB=b;
  37. }
  38. void ccwB(int b)///正
  39. {
  40.                 B01=0;
  41.     B02=1;
  42.     CompareB=b;
  43. }

  44. void qian(void)
  45. {
  46.          cwA(SpeedA);
  47.          cwB(SpeedB);
  48. }
  49. void hou (void)
  50. {
  51.          ccwA(SpeedA);
  52.          ccwB(SpeedB);
  53. }
  54. void you(void)
  55. {
  56.         cwA(SpeedA);
  57.         ccwB(SpeedB);
  58. }
  59. void zuo(void)
  60. {
  61.         ccwA(SpeedA);
  62.         cwB(SpeedB);
  63. }
  64. void square()
  65. {
  66.         qian();
  67.         time(Sr);
  68.   zuo();
  69.         Delay(600);

  70. }
  71. void round()
  72. {
  73.          cwA(SpeedA);
  74.          cwB(SpeedB+Rr);
  75. }




  76. void main()
  77. {
  78.                 Timer0_Init();
  79. //          LCD_Init();                                                //LCD初始化
  80. //          LCD_ShowChar(1,1,'A');                        //在1行1列顯示字符A
  81. //          LCD_ShowString(1,3,"Hello");        //在1行3列顯示字符串Hello
  82. //        LCD_ShowNum(1,9,66,2);                        //在1行9列顯示數(shù)字66,長(zhǎng)度為2
  83. //        LCD_ShowSignedNum(1,12,-88,2);        //在1行12列顯示有符號(hào)數(shù)字-88,長(zhǎng)度為2
  84. //        LCD_ShowHexNum(2,1,0xA5,2);                //在2行1列顯示十六進(jìn)制數(shù)字0xA5,長(zhǎng)度為2
  85. //        LCD_ShowBinNum(2,4,0xA5,8);                //在2行4列顯示二進(jìn)制數(shù)字0xA5,長(zhǎng)度為8
  86. //        LCD_ShowChar(2,13,0xDF);                //在2行13列顯示編碼為0xDF的字符
  87. //        LCD_ShowChar(2,14,'C');                        //在2行14列顯示字符C
  88.         while(1)
  89.         {
  90.                 KeyNum=Key();
  91.                 if(KeyNum==1)
  92.                 {
  93.       m=0;
  94.                 }               
  95.                 if(KeyNum==2)
  96.                 {
  97.       m=1;
  98.                 }
  99.                 if(m==1)
  100.                 {
  101. //                 LCD_ShowString(1,3,"square");                        //在1行1列顯示字符A
  102.      square();
  103.                 }
  104.                 if(m==0)
  105.                 {
  106. //                        LCD_ShowString(1,3,"round");                        //在1行1列顯示字符A
  107.             round();
  108.                 }

  109.         }
  110. }
  111. void Timer0_Routine() interrupt 1
  112. {
  113.         TL0 = 0x9C;                //設(shè)置定時(shí)初值
  114.         TH0 = 0xFF;                //設(shè)置定時(shí)初值
  115.         Counter++;
  116.         Counter%=100;        //計(jì)數(shù)值變化范圍限制在0~99
  117.         if(Counter<CompareA)        //計(jì)數(shù)值小于比較值
  118.         {
  119.                 MotorA=1;                //輸出1
  120.         }
  121.         else                                //計(jì)數(shù)值大于比較值
  122.         {
  123.                 MotorA=0;                //輸出0
  124.         }
  125.         if(Counter<CompareB)        //計(jì)數(shù)值小于比較值
  126.         {
  127.                 MotorB=1;                //輸出1
  128.         }
  129.         else                                //計(jì)數(shù)值大于比較值
  130.         {
  131.                 MotorB=0;                //輸出0
  132.         }
  133. }

復(fù)制代碼
原理圖PCB: 無(wú)
仿真: 無(wú)
代碼: 51單片機(jī)電子繪圖小車.7z (1.57 MB, 下載次數(shù): 23)

視頻.7z

5.85 MB, 下載次數(shù): 6, 下載積分: 黑幣 -5


作者: deng1234567890    時(shí)間: 2024-1-4 10:07
求 怎么把里面顯示日期的代碼改成顯示學(xué)號(hào)的啊...靜態(tài)顯示就行




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1