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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求大佬看下單片機程序的問題,在實物中小車不動

[復制鏈接]
回帖獎勵 2 黑幣 回復本帖可獲得 2 黑幣獎勵! 每人限 1 次
跳轉到指定樓層
樓主
ID:728262 發表于 2020-5-23 22:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. <避障小車的問題,在實物中小車不動
  2. #include<reg52.h>                                          //此文件中定義了單片機的一些特殊功能寄存器
  3. #include"lcd.h"
  4. #include<intrins.h>
  5. #define uchar unsigned char                          //無符號字符型 宏定義        變量范圍0~255
  6. #define uint unsigned int                          //無符號整型 宏定義        變量范圍0~65535
  7. /***************超聲波**I/O口******************/        
  8. sbit Trig = P2^3;                     //超聲波測距模塊Trig                                
  9. sbit Echo = P2^4;                                          //超聲波測距模塊Echo
  10. /*****************蜂鳴器******************/
  11. sbit beep = P2^7;                                          //蜂鳴器
  12. /*****************舵機******************/
  13. sbit SG_PWM = P3^7;                                          //舵機
  14. /****************電機驅動**IO口******************/
  15. /*使能端*/
  16. sbit ENA = P2^5;                //左下電機pwm信號端
  17. sbit ENB = P2^6;                //右下電機pwm信號端
  18. sbit ENC = P3^0;                //左上電機pwm信號端
  19. sbit END = P3^1;                //右上電機pwm信號端
  20. /*電機口*/
  21. sbit IN1 = P1^0;        
  22. sbit IN2 = P1^1;
  23. sbit IN3 = P1^2;        
  24. sbit IN4 = P1^3;
  25. sbit IN5 = P1^4;        
  26. sbit IN6 = P1^5;
  27. sbit IN7 = P1^6;        
  28. sbit IN8 = P1^7;
  29. /***************定義全局變量******************/
  30. static unsigned char DisNum = 0;         //顯示用指針
  31.            unsigned char table[]="Distance:";  
  32.        unsigned char code ASCII[13] = {'0','1','2','3','4','5','6','7','8','9','.','-','M',};                  
  33.        unsigned int  time=0;                        //用于存放定時器時間的值
  34.        unsigned long S=0;                                //用于存放距離的值
  35.            unsigned long S1=0;
  36.            unsigned long S2=0;
  37.            unsigned long S3=0;
  38.            unsigned int timer=10000;                         //延時基準變量
  39.        bit      flag =0;                                //超聲波超出量程溢出標志位      
  40.            unsigned char disbuff[4] = { 0,0,0,0,};          //用于存放距離的值0.1mm、mm、cm和m的值
  41.            unsigned char pwm_val_left1 = 0;        //左下電機變量定義
  42.            unsigned char pwm_val_right1 =0;               //右下電機變量定義
  43.            unsigned char pwm_val_left2 = 0;               //左上電機變量定義
  44.            unsigned char pwm_val_right2 = 0;           //右下電機變量定義
  45.            unsigned char push_val_left1 = 0;       //左下電機占空比N/20
  46.            unsigned char push_val_right1 =0;       //右下電機占空比N/20
  47.            unsigned char push_val_left2 = 0;           //左上電機占空比N/20
  48.            unsigned char push_val_right2 = 0;           //右下電機占空比N/20
  49.            unsigned char count=0;                       //0.2ms次數標識   
  50.        unsigned char PWM_count=5;                   //舵機歸中
  51. /******************************************************************************
  52. * 函 數 名         : Delay1ms
  53. * 函數功能                   : 延時函數,延時1ms
  54. *******************************************************************************/
  55. void Delay1ms(uint j)
  56. {
  57.     uchar k;        
  58.         while(j--)                          
  59.         {                  
  60.            for(k = 120; k > 0; k--);
  61.         }                                   
  62. }
  63. /******************************************************************************
  64. * 函 數 名         : feng
  65. * 函數功能                   : 報警函數
  66. *******************************************************************************/
  67. void feng()
  68. {
  69.         if(S<=40)
  70.           {
  71.             beep=~beep;
  72.             Delay1ms(50);
  73.           }
  74.         else
  75.                 beep=1;
  76. }               
  77. void StartModule()                          //啟動模塊
  78. {
  79.           Trig=1;                                             //啟動一次模塊
  80.           _nop_();
  81.           _nop_();
  82.           _nop_();
  83.           _nop_();
  84.           _nop_();
  85.           _nop_();
  86.           _nop_();
  87.           _nop_();
  88.           _nop_();
  89.           _nop_();
  90.           _nop_();
  91.           _nop_();
  92.           _nop_();
  93.           _nop_();
  94.           _nop_();
  95.           _nop_();
  96.           _nop_();
  97.           _nop_();
  98.           _nop_();
  99.           _nop_();
  100.           _nop_();
  101.           Trig=0;
  102. }
  103. //計算距離
  104. void Conut(void)                                          
  105.         {
  106.          TH0=0;
  107.          TL0=0;         
  108.          while(!Echo);                //當RX為零時等待
  109.          TR0=1;                            //開啟計數
  110.          while(Echo);                        //當RX為1計數并等待
  111.          TR0=0;                                //關閉計數
  112.          time=TH0*256+TL0;
  113.          TH0=0;
  114.          TL0=0;
  115.         
  116.          S=(time*1.7)/100;     //算出來是CM
  117.          if((S>=450)||flag==1) //超出測量范圍顯示“-”
  118.          {         
  119.           flag=0;
  120.          
  121.           DisplayOneChar(10, 0, ASCII[11]);
  122.           DisplayOneChar(11, 0, ASCII[10]);        //顯示點
  123.           DisplayOneChar(12, 0, ASCII[11]);
  124.           DisplayOneChar(13, 0, ASCII[11]);
  125.           DisplayOneChar(14, 0, ASCII[12]);        //顯示M
  126.          }
  127.          else
  128.          {
  129.           disbuff[0]=S%1000/100;
  130.           disbuff[1]=S%1000%100/10;
  131.           disbuff[2]=S%1000%10 %10;
  132.           DisplayOneChar(10, 0, ASCII[disbuff[0]]);
  133.           DisplayOneChar(11, 0, ASCII[10]);        //顯示點
  134.           DisplayOneChar(12, 0, ASCII[disbuff[1]]);
  135.           DisplayOneChar(13, 0, ASCII[disbuff[2]]);
  136.           DisplayOneChar(14, 0, ASCII[12]);        //顯示M
  137.          }
  138.         }
  139. void Timer0() interrupt 1                          //T0中斷用來計數器溢出,超過測距范圍
  140. {
  141.     flag=1;                                                         //中斷溢出標志
  142. }
  143. void run(void)                                                //前進
  144. {
  145.           push_val_left1 = 10;                //PWM 調節參數1-20   1為最慢,20是最快  改這個值可以改變其速度
  146.           push_val_right1 = 10;      
  147.           push_val_left2 = 10;         
  148.           push_val_right2 = 10;
  149.           IN1 = 1;
  150.           IN2 = 0;
  151.           IN3 = 1;
  152.           IN4 = 0;
  153.           IN5 = 1;
  154.           IN6 = 0;
  155.           IN7 = 1;
  156.           IN8 = 0;
  157. }
  158. void backrun(void)                                                //后退
  159. {
  160.           push_val_left1 = 8;                       //PWM 調節參數1-20   1為最慢,20是最快  改這個值可以改變其速度
  161.           push_val_right1 = 8;      
  162.           push_val_left2 = 8;         
  163.           push_val_right2 = 8;
  164.           IN1 = 0;
  165.           IN2 = 1;
  166.           IN3 = 0;
  167.           IN4 = 1;
  168.           IN5 = 0;
  169.           IN6 = 1;
  170.           IN7 = 0;
  171.           IN8 = 1;
  172. }
  173. void leftrun(void)                                                //左轉
  174. {
  175.           push_val_left1 = 7;                       //PWM 調節參數1-20   1為最慢,20是最快  改這個值可以改變其速度
  176.           push_val_right1 = 7;      
  177.           push_val_left2 = 7;         
  178.           push_val_right2 = 7;
  179.           IN1 = 0;
  180.           IN2 = 0;
  181.           IN3 = 1;
  182.           IN4 = 0;
  183.           IN5 = 0;
  184.           IN6 = 0;
  185.           IN7 = 1;
  186.           IN8 = 0;
  187. }
  188. void rightrun(void)                                                //右轉
  189. {
  190.           push_val_left1 = 7;                       //PWM 調節參數1-20   1為最慢,20是最快  改這個值可以改變其速度
  191.           push_val_right1 = 7;      
  192.           push_val_left2 = 7;         
  193.           push_val_right2 = 7;
  194.           IN1 = 1;
  195.           IN2 = 0;
  196.           IN3 = 0;
  197.           IN4 = 0;
  198.           IN5 = 1;
  199.           IN6 = 0;
  200.           IN7 = 0;
  201.           IN8 = 0;
  202. }
  203. void stop(void)                                                //停止
  204. {
  205.           IN1 = 0;
  206.           IN2 = 0;
  207.           IN3 = 0;
  208.           IN4 = 0;
  209.           IN5 = 0;
  210.           IN6 = 0;
  211.           IN7 = 0;
  212.           IN8 = 0;
  213. }
  214. //pwm控制電機速度
  215. void pwm_out_left1_moto(void)                                   //左下電機
  216. {
  217.    if(pwm_val_left1<=push_val_left1)
  218.                ENA=1;
  219.    else
  220.                   ENA=0;
  221.    if(pwm_val_left1>=20)
  222.                  pwm_val_left1=0;
  223.    else
  224.                   ENA=0;
  225. }
  226. void pwm_out_right1_moto(void)                                   //右下電機
  227. {
  228.    if(pwm_val_right1<=push_val_right1)
  229.                ENB=1;
  230.    else
  231.                   ENB=0;
  232.    if(pwm_val_right1>=20)
  233.                  pwm_val_right1=0;
  234.    else
  235.                   ENB=0;
  236. }
  237. void pwm_out_left2_moto(void)                                   //左上電機
  238. {
  239.    if(pwm_val_left2<=push_val_left2)
  240.                ENC=1;
  241.    else
  242.                   ENC=0;
  243.    if(pwm_val_left2>=20)
  244.                  pwm_val_left2=0;
  245.    else
  246.                   ENC=0;
  247. }
  248. void pwm_out_right2_moto(void)                                   //右上電機
  249. {
  250.    if(pwm_val_right2<=push_val_right2)
  251.                END=1;
  252.    else
  253.                   END=0;
  254.    if(pwm_val_right2>=20)
  255.                  pwm_val_right2=0;
  256.    else
  257.                   END=0;
  258. }
  259. void timer1 () interrupt 3                           //中斷產生pwm信號
  260. {
  261.   TH1=0xFC;
  262.   TL1=0x18;                                         //1ms延時
  263.   pwm_val_left1++;
  264.   pwm_val_right1++;
  265.   pwm_val_left2++;
  266.   pwm_val_right2++;

  267.   pwm_out_left1_moto();
  268.   pwm_out_right1_moto();
  269.   pwm_out_left2_moto();
  270.   pwm_out_right2_moto();
  271. }
  272. //舵機控制方向函數
  273. void COMM(void)
  274. {
  275.           count=1;                                                        //舵機向左轉90度
  276.           Delay1ms(1000);                                        //延時1000ms讓舵機轉到位置
  277.           StartModule();                                                //啟動測距        
  278.           Conut();                                                        
  279.           S2=S;                                                                        //得到左邊距離

  280.           count=9;                                                        //舵機右轉
  281.           Delay1ms(1000);                                            //延時1000ms讓舵機轉到位置
  282.           StartModule();                                                //啟動測距
  283.           Conut();                                                               
  284.           S3=S;                                                                        //得到右邊距離

  285.           count=5;                                                        //舵機歸中
  286.           Delay1ms(1000);                                            //延時1000ms讓舵機轉到位置
  287.           StartModule();                                                //啟動測距
  288.           Conut();
  289.           S1=S;                                                                        //得到中間距離

  290.           if((S2<10)||(S3<10))                                        //只要左右各有距離小于10CM小車后退
  291.           {
  292.                    backrun();
  293.                  Delay1ms(1000);
  294.           }

  295.           if(S2>S3)                                                                 //車的左邊比車的右邊距離小右轉
  296.           {
  297.                    rightrun();
  298.                  Delay1ms(1000);
  299.           }
  300.           else                                                                         //車的左邊比車的右邊距離大 左轉
  301.           {
  302.                    leftrun();
  303.                  Delay1ms(1000);
  304.           }
  305. }
  306. void Timer2() interrupt 5
  307. {
  308.         TF2=0;
  309.         TH2=(65536-200)>>8;
  310.         TL2=(65536-200);
  311.         count=count+1;
  312.             
  313.         if(count >100)   
  314.         {
  315.    
  316.                 count = 0;
  317.         }        
  318.         if(count<=compare)  
  319.         {
  320.         SG_PWM=1;   
  321.         }
  322.     else
  323.     {
  324.             SG_PWM=0;  
  325.     }                          //次數始終保持為40即保持周期為20ms
  326. }
  327. /***************初始化定時器************/
  328. void init_T0()
  329. {
  330.      TMOD=0x01;                   //設T0為方式1,GATE=1;
  331.          TH0=0;
  332.          TL0=0;         
  333.          ET0=1;             //允許T0中斷
  334.          EA=1;                           //開啟總中斷
  335. }
  336. void init_T1()
  337. {
  338.      TMOD=0x11;                   //設T1為方式1,GATE=1;
  339.          TH1=0xFC;
  340.          TL1=0x18;          //1ms延時
  341.          ET1=1;             //允許T1中斷
  342.          EA=1;                           //開啟總中斷
  343.          TR1=1;                        //t1開啟及時
  344. }
  345. void init_T2()
  346. {

  347.      T2CON=0;
  348.          TH2=0xfe;
  349.          TL2=0x0c;          //0.5ms
  350.          ET2=1;             //允許T1中斷
  351.          EA=1;                           //開啟總中斷
  352.          TR2=1;                           //t2開啟及時
  353. }
  354. void main()
  355. {
  356.          init_T0();
  357.          init_T1();
  358.          init_T2();
  359.          
  360.          LcdInit();
  361.          LcdShowStr(0,0,table);                  
  362.          Delay1ms(5);
  363.          count=5;
  364.          while(1)
  365.          {                                 
  366.          StartModule();
  367.                  Conut();
  368.                  feng();
  369.                     if(S<=10)
  370.                 {
  371.                           stop();
  372.                           COMM();
  373.                 }
  374.                  else
  375.                 {
  376.                         run();
  377.                 }
  378.          }
  379. }   
復制代碼


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 特黄av| 精精国产xxxx视频在线播放7 | 亚洲人成人一区二区在线观看 | 91麻豆精品国产91久久久更新资源速度超快 | 日韩第一区 | av在线免费观看网址 | 成人久久久 | 成人性生交大片免费看r链接 | 97人人澡人人爽91综合色 | 亚洲成人一区二区三区 | 99热这里都是精品 | 中文字幕日韩在线 | 国产福利在线播放麻豆 | 玖玖视频网 | 亚洲成人一区二区三区 | 欧美二级 | 欧美综合一区 | 国产精品成av人在线视午夜片 | 中文字幕色站 | 午夜影院在线观看免费 | 91精品国产综合久久精品 | 午夜合集| 91激情电影 | 免费国产一区 | 日韩a | 久久av资源网 | 美女张开腿露出尿口 | 国产午夜精品一区二区三区嫩草 | 欧美一区二区三区免费电影 | 日韩欧美在线播放 | www.日韩欧美 | 欧美中文在线 | 国产精品久久久久久久久久免费 | 久久69精品久久久久久国产越南 | 99久久久99久久国产片鸭王 | 99精品免费 | 欧州一区二区三区 | 亚洲第一网站 | 国产成人av在线播放 | 国产精品18hdxxxⅹ在线 | 在线视频一区二区三区 |