新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 智能小車(chē)C語(yǔ)言程序

        智能小車(chē)C語(yǔ)言程序

        作者: 時(shí)間:2016-11-23 來(lái)源:網(wǎng)絡(luò) 收藏
        智能小車(chē)黑線(xiàn)循跡C語(yǔ)言程序
        #include
        #include
        #define uchar unsigned char
        #define uint unsigned int

        sbit LeftIR=P1^6; //左邊紅外接收
        sbit RightIR=P1^7; //右邊紅外接收
        sbit ENA=P1^2; // L298的Enable A
        sbit IN1=P1^0; // L298的Input 1
        sbit IN2=P1^1; // L298的Input 2
        sbit ENB=P1^5; // L298的Enable B
        sbit IN3=P1^3; // L298的Input 3
        sbit IN4=P1^4; // L298的Input 4
        uchar t=0; //中斷計(jì)數(shù)器
        uchar motor_1=0,motor_2=0; //電機(jī)1,2速度值
        uchar tmp1,tmp2; // 電機(jī)當(dāng)前速度值
        uchar aa; //定時(shí)器1中斷計(jì)數(shù)
        bit flag=0; //標(biāo)志位


        void motor(uchar index, char speed)
        {
        if(speed>=-100 && speed<=100)
        {
        if(index==1) // 電機(jī)1的處理
        {
        motor_1=abs(speed); // 取速度的絕對(duì)值
        if(speed<0) // 速度值為負(fù)則反轉(zhuǎn)
        {
        IN1=0;
        IN2=1;
        }
        else // 不為負(fù)數(shù)則正轉(zhuǎn)
        {
        IN1=1;
        IN2=0;
        }
        }
        if(index==2) // 電機(jī)1的處理
        {
        motor_2=abs(speed); // 取速度的絕對(duì)值
        if(speed<0) // 速度值為負(fù)則反轉(zhuǎn)
        {
        IN3=0;
        IN4=1;
        }
        else // 不為負(fù)數(shù)則正轉(zhuǎn)
        {
        IN3=1;
        IN4=0;
        }
        }
        }
        }
        void init()
        {
        TMOD=0x12; // 設(shè)定T0的工作模式為2
        TH0=0x9B; // 裝入定時(shí)器的初值
        TL0=0x9B;
        TH1=(65536-50000)/256; //設(shè)置初值定時(shí)50ms
        TL1=(65536-50000)%6;
        EA=1; // 開(kāi)中斷
        ET0=1; // 定時(shí)器0允許中斷
        ET1=1; //定時(shí)器1允許中斷
        TR0=0; // 關(guān)閉定時(shí)器0
        TR1=0; // 關(guān)閉定時(shí)器0
        ENA=0; //關(guān)閉電機(jī)1
        ENB=0; //關(guān)閉電機(jī)2
        }
        void main()
        {
        int irDetectLeft,irDetectRight;
        init();
        while(1)// 電機(jī)實(shí)際控制演示
        {
        irDetectRight = RightIR;//右邊接收
        irDetectLeft = LeftIR;//左邊接收
        if((irDetectLeft==0)&&(irDetectRight==0))//向前進(jìn)
        {
        motor(1,100);
        motor(2,100);
        }
        if((irDetectLeft==0)&&(irDetectRight==1))//右轉(zhuǎn)
        {
        motor(1,-100);
        motor(2,100);
        }
        if((irDetectLeft==1)&&(irDetectRight==0))//左轉(zhuǎn)
        {
        motor(1,100);
        motor(2,-100);
        }
        if((irDetectLeft==1)&&(irDetectRight==1)&&(flag==0)) //第一次探測(cè)定時(shí)器1開(kāi)始計(jì)時(shí)
        {
        motor(1,100);
        motor(2,100);
        TR1=1;
        }
        if((irDetectLeft==1)&&(irDetectRight==1)&&(flag==1))//第二次探測(cè)時(shí)小車(chē)停
        {
        TR0=0;
        ENA=0;
        ENB=0;
        }
        }
        }
        void timer0() interrupt 1 // T0中斷服務(wù)程序
        {
        if(t==0) // 1個(gè)PWM周期完成后才會(huì)接受新數(shù)值
        {
        tmp1=motor_1;
        tmp2=motor_2;
        }
        if(t ENA=1;
        else
        ENA=0; // 產(chǎn)生電機(jī)1的PWM信號(hào)
        if(t ENB=1;
        else
        ENB=0; // 產(chǎn)生電機(jī)2的PWM信號(hào)
        t++;
        if(t>=100)
        t=0; // 1個(gè)PWM信號(hào)由100次中斷產(chǎn)生
        }
        void timer1() interrupt 3
        {
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%6;
        aa++;
        if(aa==40) //定時(shí)2s后小車(chē)開(kāi)始運(yùn)動(dòng)
        TR0=1;
        if(aa==60) //定時(shí)3s后置標(biāo)志位
        {
        aa=0;
        flag=1;
        }
        }


        評(píng)論


        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 旌德县| 芜湖县| 自治县| 铁岭市| 秦皇岛市| 武胜县| 洛南县| 准格尔旗| 崇信县| 蒙城县| 徐州市| 措勤县| 哈巴河县| 墨脱县| 织金县| 安乡县| 桃源县| 连江县| 红安县| 海门市| 崇信县| 花莲市| 夏邑县| SHOW| 全州县| 万全县| 东莞市| 桐乡市| 富源县| 正定县| 宣恩县| 油尖旺区| 禹州市| 鹰潭市| 礼泉县| 高台县| 河西区| 永春县| 休宁县| 平阴县| 江山市|