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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4031|回復: 0
收起左側

51單片機追蹤機器人(小車)程序

[復制鏈接]
ID:497103 發表于 2019-3-24 09:59 | 顯示全部樓層 |閱讀模式
之前做的時候茍了一周編出來的程序
QX-A51小車跟隨前方障礙物運動
s2控制小車前進后退左轉右轉
s3跟蹤
s4光敏
功能蠻全的,跟蹤不是特別靈敏,跟小車硬件有關,可以再調整。

單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <C:\Users\Administrator\Desktop\QXA51.h>

  4. unsigned char pwm_left_val =180;//左電機占空比值 取值范圍0-170,0最快
  5. unsigned char pwm_right_val = 175;//右電機占空比值取值范圍0-170 ,0最快
  6. unsigned char pwm_t;//周期

  7. #define MAIN_Fosc                11059200UL        //宏定義主時鐘HZ
  8. #define PCF8591_ADDR        0x90                //PCF8591地址
  9. #define DACOUT_EN                0x40                //DAC輸出使能

  10. typedef unsigned char INT8U;
  11. typedef unsigned char uchar;
  12. typedef unsigned int INT16U;
  13. typedef unsigned int uint;

  14. sbit SDA = P2^0;   //I2C串行數據
  15. sbit SCL = P2^1;   //I2C串行時鐘
  16. sbit we = P2^7;        //位定義數碼管位選鎖存器接口
  17. sbit du = P2^6;         //位定義數碼管位選鎖存器接口
  18. sbit LED0 = P1^0;
  19. sbit LED1 = P1^1;
  20. sbit LED2 = P1^2;
  21. sbit LED3 = P1^3;
  22. sbit LED4 = P1^4;
  23. sbit LED5 = P1^5;
  24. sbit LED6 = P1^6;
  25. sbit LED7 = P1^7;//led流水燈

  26. uchar code leddata[]={  
  27.                                 0x3F,  //"0"
  28.                                 0x06,  //"1"
  29.                                 0x5B,  //"2"
  30.                                 0x4F,  //"3"
  31.                                 0x66,  //"4"
  32.                                 0x6D,  //"5"
  33.                                 0x7D,  //"6"
  34.                                 0x07,  //"7"
  35.                                 0x7F,  //"8"
  36.                                 0x6F,  //"9"
  37.                                 0x00,  //熄滅
  38.                                 0x00  //自定義
  39.                                          };         //數碼管段選表

  40. uchar AD_Value;        //存儲AD轉換回的數字量
  41. uint i=0,a=0,b=0,c=0;

  42. void Delay_Ms(INT16U ms)
  43. {
  44.      INT16U i;
  45.          do{
  46.               i = MAIN_Fosc / 96000;
  47.                   while(--i);   //96T per loop
  48.      }while(--ms);
  49. }

  50. void Delay5us()
  51. {
  52.         #if MAIN_Fosc == 11059200
  53.                 _nop_();
  54.         #elif MAIN_Fosc == 12000000
  55.                 _nop_();
  56.         #elif MAIN_Fosc == 22118400
  57.                 _nop_(); _nop_(); _nop_();
  58.         #endif
  59. }

  60. /*====================================
  61. 函數:I2C_init()
  62. 描述:I2C總線初始化
  63. ====================================*/
  64. void I2C_init()
  65. {
  66.         SDA = 1;   //數據總線高
  67.         _nop_();
  68.         SCL = 1;   //時鐘總線高
  69.         _nop_();
  70. }

  71. /*====================================
  72. 函數:I2C_Start()
  73. 描述:I2C起始信號
  74. ====================================*/
  75. void I2C_Start()  
  76. {
  77.         SCL = 1;
  78.         _nop_();
  79.         SDA = 1;
  80.         Delay5us();
  81.         SDA = 0;
  82.         Delay5us();
  83. }

  84. /*====================================
  85. 函數:I2C_Stop()
  86. 描述:I2C停止信號
  87. ====================================*/
  88. void I2C_Stop()
  89. {
  90.         SDA = 0;
  91.         _nop_();
  92.         SCL = 1;
  93.         Delay5us();
  94.         SDA = 1;
  95.         Delay5us();
  96. }

  97. /*====================================
  98. 函數:Master_ACK(bit i)
  99. 參數:i 為0時發送非應答 為1時發送應答
  100. 描述:I2C主機發送應答
  101. ====================================*/
  102. void Master_ACK(bit i)       
  103. {
  104.         SCL = 0; // 拉低時鐘總線允許SDA數據總線上的數據變化
  105.         _nop_(); // 讓總線穩定
  106.         if (i)         //如果i = 1 那么拉低數據總線 表示主機應答
  107.         {
  108.                 SDA = 0;
  109.         }
  110.         else         
  111.         {
  112.                 SDA = 1;         //發送非應答
  113.         }
  114.         _nop_();//讓總線穩定
  115.         SCL = 1;//拉高時鐘總線 讓從機從SDA線上讀走 主機的應答信號
  116.         _nop_();
  117.         SCL = 0;//拉低時鐘總線, 占用總線繼續通信
  118.         _nop_();
  119.         SDA = 1;//釋放SDA數據總線。
  120.         _nop_();
  121. }

  122. /*====================================
  123. 函數:Test_ACK()
  124. 返回:0為非應答 1為應答
  125. 描述:I2C檢測從機應答
  126. ====================================*/
  127. bit Test_ACK()         // 檢測從機應答
  128. {
  129.         SCL = 1;//時鐘總線為高電平期間可以讀取從機應答信號
  130.         Delay5us();
  131.         if (SDA)
  132.         {
  133.                 SCL = 0;
  134.                 I2C_Stop();
  135.                 return(0);
  136.         }
  137.         else
  138.         {
  139.                 SCL = 0;
  140.                 return(1);
  141.         }
  142. }

  143. /*====================================
  144. 函數:I2C_send_byte(uchar byte)
  145. 參數:byte 要發送的字節
  146. 描述:I2C發送一個字節
  147. ====================================*/
  148. void I2C_send_byte(uchar byte)
  149. {
  150.         uchar i;
  151.         for(i = 0 ; i < 8 ; i++)
  152.         {
  153.                 SCL = 0;
  154.                 _nop_();
  155.                 if (byte & 0x80)        //
  156.                 {
  157.                         SDA = 1;
  158.                         _nop_();
  159.                 }
  160.                 else
  161.                 {
  162.                         SDA = 0;
  163.                         _nop_();
  164.                 }
  165.                 SCL = 1;
  166.                 _nop_();
  167.                 byte <<= 1;
  168.         }
  169.         SCL = 0;
  170.         _nop_();
  171.         SDA = 1;
  172.         _nop_();       
  173. }

  174. /*====================================
  175. 函數:I2C_read_byte()
  176. 返回:讀取的字節
  177. 描述:I2C讀一個字節
  178. ====================================*/
  179. uchar I2C_read_byte()
  180. {
  181.         uchar i, dat;
  182.         SCL = 0 ;
  183.         _nop_();
  184.         SDA = 1;
  185.         _nop_();
  186.         for(i = 0 ; i < 8 ; i++)
  187.         {
  188.                 SCL = 1;
  189.                 _nop_();
  190.                 dat <<= 1;          
  191.                 if (SDA)
  192.                 {
  193.                         dat |= 0x01;  
  194.                 }
  195.                 _nop_();
  196.                 SCL = 0;
  197.                 _nop_();
  198.         }
  199.         return(dat);
  200. }

  201. /*DAC輸出*/
  202. bit DAC_OUT(uchar DAT)
  203. {
  204.         I2C_Start();
  205.         I2C_send_byte(PCF8591_ADDR+0);
  206.         if (!Test_ACK())
  207.         {
  208.                 return(0);
  209.         }
  210.         I2C_send_byte(DACOUT_EN);        //DA輸出使能
  211.         if (!Test_ACK())
  212.         {
  213.                 return(0);
  214.         }
  215.         I2C_send_byte(DAT);
  216.         if (!Test_ACK())
  217.         {
  218.                 return(0);
  219.         }
  220.         I2C_Stop();
  221.         return(1);       
  222. }

  223. /*讀AD數據*/
  224. bit ADC_Read(uchar CON)
  225. {
  226.         I2C_Start();
  227.         I2C_send_byte(PCF8591_ADDR+0);
  228.         if (!Test_ACK())
  229.         {
  230.                 return(0);
  231.         }
  232.         I2C_send_byte(CON);
  233.         Master_ACK(0);
  234.         I2C_Start();
  235.         I2C_send_byte(PCF8591_ADDR+1);
  236.         if (!Test_ACK())
  237.         {
  238.                 return(0);
  239.         }
  240.         AD_Value = I2C_read_byte();
  241.         Master_ACK(0);
  242.         I2C_Stop();
  243.         return(1);       
  244. }

  245. /*小車前進*/
  246. void forward()
  247. {
  248.         left_motor_en; //左電機使能
  249.         right_motor_en;//右電機使能
  250.         left_motor_go; //左電機前進
  251.         right_motor_go; //右電機前進
  252. }
  253. /*小車后退*/
  254. void backward()
  255. {
  256.         left_motor_en; //左電機使能
  257.         right_motor_en;//右電機使能
  258.         left_motor_back; //左電機后退
  259.         right_motor_back; //右電機后退       
  260. }
  261. /*小車左轉*/
  262. void left()
  263. {
  264.         left_motor_stops; //左電機停止
  265.         right_motor_en;//右電機使能
  266.         right_motor_go; //右電機前進       
  267. }
  268. /*小車右轉*/
  269. void right()
  270. {
  271.         right_motor_stops;//右電機停止
  272.         left_motor_en;    //左電機使能
  273.         left_motor_go;    //左電機前進
  274. }
  275. /*小車停止*/
  276. void stop()
  277. {
  278.         right_motor_stops;//右電機停止
  279.         left_motor_stops; //左電機停止       
  280. }       

  281. void timer0() interrupt 1
  282. {
  283.         pwm_t++;//周期計時加
  284.         if(pwm_t == 255)
  285.                 pwm_t = EN1 = EN2 = 0;
  286.         if(pwm_left_val == pwm_t)//左電機占空比       
  287.                 EN1 = 1;               
  288.         if(pwm_right_val == pwm_t)//右電機占空比
  289.                 EN2 = 1;                         
  290. }

  291. void main()
  292. {
  293.         unsigned char j;
  294.         for(;;)
  295.         {         
  296.         while(1)
  297.         {
  298.                 if(key_s2 == 0)//判斷S2是否按下
  299.                 {
  300.                         Delay_Ms(5);//軟件消抖
  301.                         if(key_s2 == 0)
  302.                         {
  303.                                 while(!key_s2);//松手檢測
  304.                                 beep = 0;
  305.                                 Delay_Ms(1000);
  306.                                 beep = 1;
  307.                             
  308.                                 TMOD |= 0x02;//8位自動重裝模塊
  309.                                 TH0 = 220;
  310.                                 TL0 = 220;//11.0592M晶振下占空比最大比值是256,輸出100HZ
  311.                                 TR0 = 1;//啟動定時器0
  312.                                 ET0 = 1;//允許定時器0中斷
  313.                                 EA        = 1;
  314.        
  315.                                 forward();//小車前進
  316.                                 Delay_Ms(1000);//毫秒級延時
  317.                                                        
  318.                                 stop();//小車停止
  319.                                 Delay_Ms(1000);//毫秒級延時
  320.                                                
  321.                                 backward();//小車后退
  322.                                 beep = 0;//蜂鳴器鳴叫
  323.                                 Delay_Ms(1000);//毫秒級延時
  324.                                                                
  325.                                 stop();//小車停止
  326.                                 beep = 1;//蜂鳴器停止鳴叫               
  327.                                 Delay_Ms(1000);//毫秒級延時
  328.                                                        
  329.                                 left();        // 小車左轉
  330.                                 beep = 0;//蜂鳴器鳴叫
  331.                                 Delay_Ms(1000);//毫秒級延時
  332.                                                                
  333.                                 stop();//小車停止
  334.                                 beep = 1;//蜂鳴器停止鳴叫
  335.                                 Delay_Ms(1000);//毫秒級延時
  336.                                
  337.                                 right();// 小車右轉延時
  338.                                 beep = 0;//蜂鳴器鳴叫
  339.                                 Delay_Ms(1000);//毫秒級延時
  340.                                
  341.                                 stop();//小車停止
  342.                                 beep=1;//蜂鳴器停止鳴叫
  343.                                 Delay_Ms(1000);//毫秒級延時               
  344.                         }
  345.                 }

  346.             if(key_s3 == 0)//判斷S3是否按下
  347.                 {               
  348.                         Delay_Ms(5);//軟件消抖
  349.                         if(key_s3 == 0)
  350.                         {
  351.                                 while(!key_s3);//松手檢測
  352.                                 beep = 0;//蜂鳴器鳴叫
  353.                                 Delay_Ms(1000);//毫秒級延時
  354.                                 beep = 1;//蜂鳴器停止鳴叫

  355.                                 TMOD |= 0x02;//8位自動重裝模塊
  356.                                 TH0 = 220;
  357.                                 TL0 = 220;//11.0592M晶振下占空比最大比值是256,輸出100HZ
  358.                                 TR0 = 1;//啟動定時器0
  359.                                 ET0 = 1;//允許定時器0中斷
  360.                                 EA        = 1;

  361.                 I2C_init();
  362.                                 while(1)
  363.                                 {               
  364.                                         if (ADC_Read(0x00))               
  365.                                         if (DAC_OUT(AD_Value))       
  366.                                         if (AD_Value > 150)        {stop(); }
  367.                                         else        {forward(); }
  368.                                         Delay_Ms(5);
  369.                                 }
  370.                         }
  371.                 }

  372.                 if(key_s4 == 0)// 實時檢測S3按鍵是否被按下
  373.                 {
  374.                         Delay_Ms(5);//軟件消抖
  375.                         if(key_s4 == 0)//再檢測S3是否被按下
  376.                         {
  377.                                 while(!key_s4);//松手檢測
  378.                                 beep = 0;        //使能有源蜂鳴器
  379.                                 Delay_Ms(1000);//200毫秒延時
  380.                                 beep = 1;        //關閉有源蜂鳴器

  381.                              TMOD |= 0x02;//8位自動重裝模塊
  382.                                 TH0 = 220;
  383.                                 TL0 = 220;//11.0592M晶振下占空比最大比值是256,輸出100HZ
  384.                                 TR0 = 1;//啟動定時器0
  385.                                 ET0 = 1;//允許定時器0中斷
  386.                                 EA        = 1;//總中斷允許
  387.                        
  388.                                 while(1)
  389.                                 {         
  390.                                         we = 1;//打開位選
  391.                                         P0 = 0xfe;//,注意數碼管的排序,P0.0對應連接的是左邊第一位數碼管
  392.                                         we = 0;        //關閉位選
  393.                                 du = 1;        //打開段選
  394.                                         P0 = leddata[b];
  395.                                         du = 0;        //關閉段選
  396.                                         Delay_Ms(1);
  397.                                                                
  398.                                         we = 1;//打開位選
  399.                                     P0 = 0xfd;//,注意數碼管的排序,P0.0對應連接的是左邊第一位數碼管
  400.                                      we = 0;        //關閉位選
  401.                                 du = 1;        //打開段選
  402.                                         P0 = leddata[i];
  403.                                         du = 0;        //關閉段選
  404.                                         Delay_Ms(1);               
  405.                                
  406.                                         if(left_led2 == 1 && right_led2 == 1)//為0 識別障礙物 為1沒有識別到障礙物
  407.                                         {        stop();
  408.                                         }
  409.                  
  410.                                         if(left_led2 == 0 && right_led2 == 0)//左右識別到障礙物,前進跟隨
  411.                                         {
  412.                                                 forward();
  413.                                                 for(c=0;c<=27000;c++)
  414.                                                 {
  415.                                                         if(c==27000)
  416.                                                         {        j++;
  417.                                                                  a++;}
  418.                                                 }               
  419.                                         }

  420.                                         if(left_led2 == 1 && right_led2 == 0)//小車右側識別到障礙物,右轉跟隨
  421.                                         {
  422.                                                 right();
  423.                                                 for(c=0;c<=27000;c++)
  424.                                                 {
  425.                                                         if(c==27000)
  426.                                                         {        j++;
  427.                                                                 a++;}
  428.                                                 }
  429.                                         }
  430.                 
  431.                                         if(left_led2 == 0 && right_led2 == 1)//小車左側識別到障礙物,左轉跟隨
  432.                                         {
  433.                                                 left();
  434.                                                 for(c=0;c<=27000;c++)
  435.                                                 {
  436.                                                         if(c==27000)
  437.                                                         {        j++;
  438.                                                                 a++;}
  439.                                                 }
  440.                                         }
  441.        
  442.                                         if(j==10)        //當數值為10時,清零
  443.                                         {
  444.                                                 j=0;
  445.                                                 b++;
  446.                                         }
  447.                                         if(b==9)
  448.                                         {        b=0;}
  449.                                         if(a==90)
  450.                                         {
  451.                                                 a=0;
  452.                                                 j=0;
  453.                                                 b=0;
  454.                                         }
  455.                                 }
  456.                         }  
  457.                 }          
  458.         }
  459. break;
  460.         }
  461. }       
復制代碼

所有資料51hei提供下載:
程序.rar (35.83 KB, 下載次數: 16)


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表