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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6263|回復: 4
收起左側

[求助]紅外尋線智能小車

[復制鏈接]
ID:32592 發表于 2011-10-20 20:23 | 顯示全部樓層 |閱讀模式

#include<at89x51.h>//此為紅外線尋線小車程序 單片機為stc89c51rc 發射頻率為38.5mKz 電機驅動芯片為L298 

/
void delay_nus(unsigned int i)  //延時:i>=12 ,i的最小延時單12 us
{
  i=i/10;
  while(--i);
}  

void delay_nms(unsigned int n)  //延時n ms
{
  n=n+1;
  while(--n) 
  delay_nus(900);         //延時 1ms,同時進行補償
}

/******************************************************

/************管腳定義********************/
 extern int abs(int val); //聲明abs函數

sbit ENA = P3^6; //左輪驅動使能
sbit IN1 = P3^2; //左輪黑線
sbit IN2 = P3^3; //左輪紅線
sbit IN3 = P3^4; //右輪紅線
sbit IN4 = P3^5; //右輪黑線
sbit ENB = P3^7; //右輪驅動使能
sbit L_scan=P0^2;    //傳感器掃描管腳
sbit R_scan=P0^3;
sbit L_led=P0^0;     //LED控制管腳
sbit R_led=P0^1;
 

//=============PWM================
#define PWM_COUST 100 //PWM細分等份
unsigned int MOTO_speed1; //左邊電機轉速
unsigned int MOTO_speed2; //右邊電機轉速
unsigned int PWM_abs1; //左邊電機取絕對值后占空比
unsigned int PWM_abs2; //左邊電機取絕對值后占空比
//uchar PWM_var1=20; //左邊電機直走速度 (不同的電機,此參數不同)
//uchar PWM_var2=20; //右邊電機直走速度
unsigned int PWMAnd = 0; //PWM自增變量
/******************************************************************
名稱:motor(char speed1,char speed2);
功能:同時調節電機的轉速
參數:speed1:電機1的PWM值;speed2:電機2的PWM值
speed>0.正轉;speed<0.反轉(-100~100)
調用:extern int abs(int val); 取絕對值
返回:
******************************************************************/
void motor(unsigned int speed1,unsigned int speed2)
{
MOTO_speed1=speed1;
MOTO_speed2=speed2;
//==============左邊電機=============
if(speed1==0)
{
IN1 =0;IN2 =0;
}
if (speed1>0)
{
IN1 =0;IN2 =1;//正轉
}
else if (speed1<0)
{
IN1 =1;IN2 =0;//反轉
}
//==============右邊電機=============
if (speed2==0)
{
IN3 =0;IN4 =0;//不轉
}
if (speed2>0)
{
IN3 =1;IN4 =0;//正轉
}
else if (speed2<0)
{
IN3 =0;IN4 =1;//反轉
}
}
/******************************************************************
名稱:motor_PWM();
功能:PWM占空比輸出
參數:無
調用:無
返回:無
******************************************************************/
void motor_PWM ()
{
PWM_abs1=abs(MOTO_speed1);
PWM_abs2=abs(MOTO_speed2);
if (PWM_abs1>PWMAnd) ENA=1; //左邊電機占空比輸出
else ENA=0;
if (PWM_abs2>PWMAnd) ENB=1; //右邊電機占空比輸出
else ENB=0;
if (PWMAnd>=PWM_COUST) PWMAnd=0; //PWM計數清零
else PWMAnd+=1;
}
/******************************************************************
名稱:void TIME_Init ();

功能:定時器初始化
指令:
調用:無
返回:無
******************************************************************/
void TIME_Init ()
{
//=========定時器T0初始化 PWM==================
EA=1;
// TCON = 0x10;
TMOD = 0x01;
TH0 = 0xff;
TL0 = 0x9B;
// TL0 = 0x47;
ET0 = 1; //定時器1中斷開
TR0 = 1; //PWM定時器開,PWM周期為10ms
}
/******************************************************************
名稱:void PWM_Time0 () interrupt 0
功能:T2中斷,PWM控制
參數:
調用:motor_PWM();//PWM占空比輸出
返回:
******************************************************************/
void PWM_Time0 () interrupt 1
{
TR0 = 0;
//TF2 = 0;
ET0 = 0; //定時器0中斷禁止
TH0 = 0xff;
TL0 = 0x9B;
motor_PWM();//PWM占空比輸出
ET0 = 1; //定時中斷0開啟
TR0 = 1;
}


//掃描傳感器狀態
unsigned char scan(void)
{
    unsigned char i,result,temp1,temp2;
    for(i=38;i>0;i--)    //LED發送38次脈沖
    {
        L_led=0;
        delay_nus(12);
        L_led=1;
        delay_nus(12);
    }
    temp1=L_scan;    //記錄傳感器狀態
    for(i=38;i>0;i--) //另一側發脈沖
    {
        R_led=0;
        delay_nus(12);
        R_led=1;
        delay_nus(12);
    }
    temp2=R_scan;    //記錄傳感器狀態
    if(temp2==1&&temp1==1)  //兩側都掃描到黑邊
        result=1;
    if(temp1==0&&temp2==1) //左側掃描到白線
        result=0;
    if(temp1==1&&temp2==0) //右側掃描到白線
        result=2;
    if(temp1==0&&temp2==0)  //兩側都掃描到白線
        result=3;
    return result;
}
unsigned char result;

void main()
{
    while(1)
    {
        result=scan();
        if(result==1)  //直走
        { 
unsigned int i=0;
unsigned int y=0;
TIME_Init () ;
motor(100,100);//電機的轉速

 

        }
        else if(result==0)//左轉,左輪停止
        {
          unsigned int i=0;
   unsigned int y=0;
   TIME_Init () ;
   motor(0,100);//電機的轉速
   while(1);
        }
        else if(result==2)//右轉,右輪停止
        {
          unsigned int i=0;
   unsigned int y=0;
   TIME_Init () ;
   motor(100,0);//電機的轉速
  
        }
        else if(result==3)//兩邊都沒有返回的狀態(比如小車懸空)~自己定吧,這里停車
        {   unsigned int i=0;
   unsigned int y=0;
   TIME_Init () ;
   motor(0,0);//電機的轉速
   
        }
        delay_nms(200);//延時200ms
     }
   } 
 求高手指點程序中錯誤

[此貼子已經被作者于2011-10-20 20:25:46編輯過]
回復

使用道具 舉報

ID:45329 發表于 2012-10-9 13:37 | 顯示全部樓層

才接觸,看不懂!

回復

使用道具 舉報

ID:52704 發表于 2013-8-6 11:49 | 顯示全部樓層
沒錯誤吧,挺好的
回復

使用道具 舉報

ID:52999 發表于 2013-8-16 12:37 | 顯示全部樓層
我想知道你用的什么紅外傳感器
回復

使用道具 舉報

ID:121114 發表于 2016-5-18 23:06 | 顯示全部樓層
學習了!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品欧美一区二区三区 | 黄色一级大片在线观看 | 国产成人午夜电影网 | 天天搞天天操 | 亚洲一区二区三区在线视频 | 国户精品久久久久久久久久久不卡 | 久久免费精彩视频 | 国产成人小视频 | 久久久网 | 热re99久久精品国99热观看 | 国产一级片在线播放 | 欧美一级黄色片 | 国产一区二区三区四区三区四 | 久草电影网 | 欧美区在线 | 91精品中文字幕一区二区三区 | 国产成人在线一区 | 午夜网址| 中文字幕一区在线 | 国产清纯白嫩初高生视频在线观看 | 欧美一区二区三区四区五区无卡码 | 欧美二区三区 | 精品国产精品国产偷麻豆 | 国产一区二区三区四区三区四 | 成人a在线观看 | 女人毛片a毛片久久人人 | 久国产精品 | 玖玖国产精品视频 | 一级黄色毛片免费 | 亚洲一区综合 | www.天天操.com | 精品久久久久久亚洲精品 | 一级片免费视频 | 自拍偷拍亚洲欧美 | 精品少妇一区二区三区日产乱码 | 国产精品一区二区三区久久 | 成人精品一区二区三区 | 一区二区三区免费 | 亚洲一区视频在线 | 99精品视频在线 | 夜夜夜夜夜夜曰天天天 |