找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4528|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

基于單片機(jī)循跡小車Proteus仿真+程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
分享一個(gè)簡單的循跡小車的程序
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. //----------------------------------------------------------
  2. //----文件:自動(dòng)循跡小車源代碼
  3. //----直流電機(jī)的開環(huán)控制keil c51 源代碼
  4. //----------------------------------------------------------
  5. //--------------------調(diào)用庫函數(shù)----------------
  6. #include        <AT89X52.h>
  7. #include        <xiaoche.h>
  8. #include        <xunji.c>
  9. #include        <stop.c>
  10. #include        <keyboard.c>
  11. #include        <bizhang.c>
  12. #include        <pwmout.c>

  13. //----------------------------------------------------------
  14. //函數(shù)名稱:main      
  15. //用戶主函數(shù)               
  16. //函數(shù)功能:主函數(shù)
  17. //----------------------------------------------------------
  18. void main()
  19. {
  20.           WDT_CONTR=0x3b;
  21.           timer_init();                //初始化
  22.           while(1)
  23.         {
  24.           keyboard();                //鍵盤掃描
  25.           jieshou();                //遙控信號檢測,要與傳感器實(shí)物連接才能正常使用.
  26.           xunji();                        //循跡檢測
  27.           bizhang();                //避礙物檢測
  28.           stop();                        //目標(biāo)站點(diǎn)檢測
  29.           WDT_CONTR=0x3b;          //喂狗
  30.         }
  31. }
復(fù)制代碼
  1. //-------------------------------------------------------
  2. //----函數(shù)名稱: timer_init
  3. //----函數(shù)功能: 初始化設(shè)置定時(shí)器
  4. //-------------------------------------------------------
  5. void timer_init()
  6. {
  7.                 flag=0;flag3=0;
  8.                 key=0xFF;
  9.             TMOD=0x20;                                                //定時(shí)器1為模式2(8位自動(dòng)重裝)
  10.                 TF1=0;                                                        //清中斷標(biāo)志
  11.                 TH1=timer_data;                                        //保證定時(shí)時(shí)長為0.1ms
  12.                 TL1=TH1;
  13.                 ET1=1;                                                        //允許T0中斷
  14.                 TR1=1;                                                        //開始計(jì)數(shù)
  15.                 EA=1;                                                        //中斷允許
  16.                 ENA=0;                                                        //電機(jī)禁止
  17.             PWM_t=PWM_t0;                                        //看門狗復(fù)位后速度恢復(fù)
  18.             flag=flag4;                                                //看門狗復(fù)位后小車狀態(tài)恢復(fù)
  19. }
  20. //----------------------------------------------------------
  21. //----函數(shù)名稱: intTime0
  22. //----函數(shù)功能: 定時(shí)器中斷處理程序
  23. //----------------------------------------------------------
  24. void IntTime1()interrupt 3        using        2
  25. {
  26.       time_count++;
  27.                   if(flag3)number++;
  28.                 if(number==6000){number=0;number1++;}
  29.                 if(number1==8){flag3=0;number1=0;flag=flag2;}        
  30.                   if(flag==0)ENA=0;                                //小車停止,flag=0,小車停止標(biāo)志
  31.                 if(flag==1)                                                //小車前進(jìn),flag=1,小車前進(jìn)標(biāo)志
  32.         {
  33.                 ENA=1;                                                        //PWM波輸出使能
  34.                 DR=0;                                                        //直流電機(jī)一端接低電平
  35.                 DR2=0;                                                        //直流電機(jī)一端接低電平
  36.                 if(kind==0)                                                //沒有傳感器檢測到黑線,走直線
  37.         {        if(time_count<PWM_t)
  38.                 {PWM=1;PWM2=1;}
  39.                 else
  40.                 {PWM=0;PWM2=0;}
  41.                 }
  42.                 if(kind==1)                                                //左邊第一個(gè)傳感器檢測到黑線
  43.         {        
  44.                         if(time_count<(PWM_t-20))
  45.                 {PWM=1;}
  46.                 else
  47.                 {PWM=0;}                        
  48.                         if(time_count<PWM_t)
  49.                 {PWM2=1;}
  50.                 else
  51.                 {PWM2=0;}
  52.                 }
  53.                 if(kind==2)                                                //左邊第二個(gè)傳感器檢測到黑線
  54.         {        
  55.                         if(time_count<3)
  56.                 {PWM=1;}
  57.                 else
  58.                 {PWM=0;}                        
  59.                         if(time_count<PWM_t)
  60.                 {PWM2=1;}
  61.                 else
  62.                 {PWM2=0;}
  63.                 }
  64.                 if(kind==3)                                                //右邊第一個(gè)傳感器檢測到黑線
  65.         {        
  66.                         if(time_count<(PWM_t-20))
  67.                 {PWM2=1;}
  68.                 else
  69.                 {PWM2=0;}                        
  70.                         if(time_count<PWM_t)
  71.                 {PWM=1;}
  72.                 else
  73.                 {PWM=0;}
  74.                 }
  75.                 if(kind==4)                                                //右邊第二個(gè)傳感器檢測到黑線
  76.         {        
  77.                         if(time_count<3)
  78.                 {PWM2=1;}
  79.                 else
  80.                 {PWM2=0;}                        
  81.                         if(time_count<PWM_t)
  82.                 {PWM=1;}
  83.                 else
  84.                 {PWM=0;}
  85.                 }
  86.         }
  87.                 if(flag==2)                                                //小車倒退,flag=2,小車倒退標(biāo)志
  88.         {
  89.                 ENA=1;
  90.                 PWM=0;
  91.                 PWM2=0;
  92.                 if(kind==0)                                                //沒有傳感器檢測到黑線,走直線
  93.             {        if(time_count<PWM_t)
  94.                         {DR=1;DR2=1;}
  95.                         else
  96.                         {DR=0;DR2=0;}
  97.                 }
  98.                 if(kind==1)                                                //左邊第一個(gè)傳感器檢測到黑線
  99.             {        
  100.                         if(time_count<(PWM_t-20))
  101.                 {DR=1;}
  102.                 else
  103.                 {DR=0;}                        
  104.                         if(time_count<PWM_t)
  105.                 {DR2=1;}
  106.                 else
  107.                 {DR2=0;}
  108.                 }
  109.                 if(kind==2)                                                //左邊第二個(gè)傳感器檢測到黑線
  110.             {        
  111.                         if(time_count<3)
  112.                 {DR=1;}
  113.                 else
  114.                 {DR=0;}                        
  115.                         if(time_count<PWM_t)
  116.                 {DR2=1;}
  117.                 else
  118.                 {DR2=0;}
  119.                 }
  120.                 if(kind==3)                                                   //右邊第一個(gè)傳感器檢測到黑線
  121.             {        
  122.                         if(time_count<(PWM_t-20))
  123.                 {DR2=1;}
  124.                 else
  125.                 {DR2=0;}                        
  126.                         if(time_count<PWM_t)
  127.                 {DR=1;}
  128.                 else
  129.                 {DR=0;}
  130.                 }
  131.                 if(kind==4)                                                  //右邊第二個(gè)傳感器檢測到黑線
  132.             {        
  133.                         if(time_count<3)
  134.                 {DR2=1;}
  135.                 else
  136.                 {DR2=0;}                        
  137.                         if(time_count<PWM_t)
  138.                 {DR=1;}
  139.                 else
  140.                 {DR=0;}
  141.                 }
  142.         }
  143.       if(time_count >= PWM_T)                          //每輸出一個(gè)PWM波計(jì)數(shù)器清一次零,也即PWM波周期長度
  144.         {
  145.          time_count=0;
  146.         }
  147. }
復(fù)制代碼

Proteus7.5版本的dsn文件與Keil2代碼 51hei附件下載:
pwm.7z (377.47 KB, 下載次數(shù): 91)

評分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

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

使用道具 舉報(bào)

沙發(fā)
ID:908826 發(fā)表于 2021-12-7 09:53 | 只看該作者
媽耶,你這是怎么改的背景,好科幻的樣子
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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