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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機L298N循跡避障功能智能小車程序設計

[復制鏈接]
跳轉到指定樓層
樓主
該設計是在單片機小車為基礎開發的循跡系統。小車由L298N電機驅動模塊、紅外循跡模塊,由STC89C52RC控制芯片完成各模塊之間的連接與控制。按鍵能傳送相應命令,對小車移動進行靈活巧妙的控制。當系統啟動后,通過按鍵來選擇紅外循跡的圖形從而改變小車的移動方向。在自動模式下,能沿著紅外循跡到地面黑線運動,能躲避障礙物。具體設計模塊圖如圖1-1所示。  
制作出來的實物圖如下:


電路原理圖如下:


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

單片機源程序如下:
  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;////半徑(無限制)
  14. unsigned char Rr=10;////半徑(1~80)

  15. unsigned char Counter,CompareA,CompareB;        //計數值和比較值,用于輸出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列顯示數字66,長度為2
  83. //        LCD_ShowSignedNum(1,12,-88,2);        //在1行12列顯示有符號數字-88,長度為2
  84. //        LCD_ShowHexNum(2,1,0xA5,2);                //在2行1列顯示十六進制數字0xA5,長度為2
  85. //        LCD_ShowBinNum(2,4,0xA5,8);                //在2行4列顯示二進制數字0xA5,長度為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;                //設置定時初值
  114.         TH0 = 0xFF;                //設置定時初值
  115.         Counter++;
  116.         Counter%=100;        //計數值變化范圍限制在0~99
  117.         if(Counter<CompareA)        //計數值小于比較值
  118.         {
  119.                 MotorA=1;                //輸出1
  120.         }
  121.         else                                //計數值大于比較值
  122.         {
  123.                 MotorA=0;                //輸出0
  124.         }
  125.         if(Counter<CompareB)        //計數值小于比較值
  126.         {
  127.                 MotorB=1;                //輸出1
  128.         }
  129.         else                                //計數值大于比較值
  130.         {
  131.                 MotorB=0;                //輸出0
  132.         }
  133. }

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

視頻.7z

5.85 MB, 下載次數: 6, 下載積分: 黑幣 -5

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:1107914 發表于 2024-1-4 10:07 | 只看該作者
求 怎么把里面顯示日期的代碼改成顯示學號的啊...靜態顯示就行
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩在线欧美 | 成人18亚洲xxoo | 精品国产91亚洲一区二区三区www | 久久99国产精品久久99果冻传媒 | 在线视频一区二区 | 在线观看免费观看在线91 | 成人免费视频一区二区 | 性高朝久久久久久久3小时 av一区二区三区四区 | 日韩视频精品在线 | 女同av亚洲女人天堂 | 日日天天 | 日韩一区二区在线视频 | 亚洲 欧美 另类 综合 偷拍 | 亚洲成人二区 | 日本精品视频 | 91超碰在线观看 | av中文在线| 91九色网站 | 国产福利在线看 | 亚洲国产精品一区二区第一页 | 日韩一区在线观看视频 | 久久国产区 | 一二三四在线视频观看社区 | 国产精品视频综合 | 中文一区 | 日韩精品a在线观看图片 | 国产视频日韩 | 国产精品亚洲一区二区三区在线 | 国产精品视频一区二区三区, | 日韩亚洲视频 | aaa大片免费观看 | 国产成人99久久亚洲综合精品 | 国产精品成人在线 | 综合一区二区三区 | 午夜精品久久久久久久久久久久久 | 91精品国产91久久久久久吃药 | 色毛片| a级片在线观看 | 欧美视频一区 | 精品美女视频在免费观看 | 国产精品国产a级 |