找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2246|回復(fù): 1
收起左側(cè)

51單片機(jī)循跡小車程序

[復(fù)制鏈接]
ID:601581 發(fā)表于 2020-11-4 15:18 | 顯示全部樓層 |閱讀模式
#include <reg52.h>
# define uchar unsigned char
# define uint unsigned int
//定義單片機(jī)不同的I/O口來進(jìn)行信號(hào)的輸入與輸出
sbit  in1=P3^7;
sbit  in2=P3^6;
sbit  in3=P3^5;
sbit  in4=P3^4;

sbit  c1=P2^7;
sbit  c2=P2^6;
sbit  c3=P2^5;
sbit  c4=P2^4;
sbit  c5=P2^3;
sbit  c6=P2^2;
sbit  c7=P2^1;
sbit  c8=P2^0;
sbit  c9=P1^6;
sbit  c10=P1^5;         //循跡10個(gè)燈

sbit D = P3^3;      

uchar  stop=0;
uchar  count=0;     
uchar  temp = 0;   
uchar  SE = 0;   
uchar speed_left = 0;     
uchar speed_right = 0;  

void time0_init(void)   
{
        TMOD=0x01;   //對(duì)定時(shí)器0的模式進(jìn)行選擇0001 即gate為0即T0只受TR0控制 C/T為0即為定時(shí)器  01對(duì)應(yīng)16位的定時(shí)器
        TH0=0xFF;    //寄存器的高8位 1111 1111
        TL0=0xea;   //寄存器的低8位  1110 1010
        TR0=1;      //啟動(dòng)定時(shí)器0
        ET0=1;      //打開T0的中斷
        EA=1;       //打開全局中斷
}
uchar judge(void)    //檢測情況判斷
{
          if((c1==0)&&(c2==0)&&(c3==0)&&(c4==0)&&(c5==1)&&(c6==1)&&(c7==0)&&(c8==0)&&(c9==0)&&(c10==0))
                return 1;
    else        if((c1==0)&&(c2==0)&&(c3==0)&&(c4==0)&&(c5==1)&&(c6==0)&&(c7==0)&&(c8==0)&&(c9==0)&&(c10==0))
                return 2;
         else        if((c1==0)&&(c2==0)&&(c3==0)&&(c4==0)&&(c5==0)&&(c6==1)&&(c7==0)&&(c8==0)&&(c9==0)&&(c10==0))
                return 3;
         else        if((c1==0)&&(c2==0)&&(c3==0)&&(c4==1)&&(c5==1)&&(c6==0)&&(c7==0)&&(c8==0)&&(c9==0)&&(c10==0))
                return 4;
         else        if((c1==0)&&(c2==0)&&(c3==0)&&(c4==0)&&(c5==0)&&(c6==1)&&(c7==1)&&(c8==0)&&(c9==0)&&(c10==0))
                return 5;
        else        if((c1==0)&&(c2==0)&&(c3==0)&&(c4==1)&&(c5==0)&&(c6==0)&&(c7==0)&&(c8==0)&&(c9==0)&&(c10==0))
                return 6;
        else        if((c1==0)&&(c2==0)&&(c3==0)&&(c4==0)&&(c5==0)&&(c6==0)&&(c7==1)&&(c8==0)&&(c9==0)&&(c10==0))
                return 7;
        else        if((c1==0)&&(c2==0)&&(c3==1)&&(c4==1)&&(c5==0)&&(c6==0)&&(c7==0)&&(c8==0)&&(c9==0)&&(c10==0))
                return 8;
        else        if((c1==0)&&(c2==0)&&(c3==0)&&(c4==0)&&(c5==0)&&(c6==0)&&(c7==1)&&(c8==1)&&(c9==0)&&(c10==0))
                return 9;
        else        if((c1==0)&&(c2==0)&&(c3==1)&&(c4==0)&&(c5==0)&&(c6==0)&&(c7==0)&&(c8==0)&&(c9==0)&&(c10==0))
                return 10;
        else        if((c1==0)&&(c2==0)&&(c3==0)&&(c4==0)&&(c5==0)&&(c6==0)&&(c7==0)&&(c8==1)&&(c9==0)&&(c10==0))
                return 11;
        else        if((c1==0)&&(c2==1)&&(c3==1)&&(c4==0)&&(c5==0)&&(c6==0)&&(c7==0)&&(c8==0)&&(c9==0)&&(c10==0))
                return 12;
else        if((c1==0)&&(c2==0)&&(c3==0)&&(c4==0)&&(c5==0)&&(c6==0)&&(c7==0)&&(c8==1)&&(c9==1)&&(c10==0))
                return 13;
        else        if((c1==0)&&(c2==1)&&(c3==0)&&(c4==0)&&(c5==0)&&(c6==0)&&(c7==0)&&(c8==0)&&(c9==0)&&(c10==0))
                return 14;
        else        if((c1==0)&&(c2==0)&&(c3==0)&&(c4==0)&&(c5==0)&&(c6==0)&&(c7==0)&&(c8==0)&&(c9==1)&&(c10==0))
                return 15;
        else        if((c1==1)&&(c2==1)&&(c3==0)&&(c4==0)&&(c5==0)&&(c6==0)&&(c7==0)&&(c8==0)&&(c9==0)&&(c10==0))
                return 16;
else if((c1==0)&&(c2==0)&&(c3==0)&&(c4==0)&&(c5==0)&&(c6==0)&&(c7==0)&&(c8==0)&&(c9==1)&&(c10==1))
                return 17;
else if((c1==1)&&(c2==0)&&(c3==0)&&(c4==0)&&(c5==0)&&(c6==0)&&(c7==0)&&(c8==0)&&(c9==0)&&(c10==0))
                return 18;
        else        if((c1==0)&&(c2==0)&&(c3==0)&&(c4==0)&&(c5==0)&&(c6==0)&&(c7==0)&&(c8==0)&&(c9==0)&&(c10==1))
                return 19;
        else        if((c1==1)&&(c2==1)&&(c3==1)&&(c4==1)&&(c5==1)&&(c6==1)&&(c7==1)&&(c8==1)&&(c9==1)&&(c10==1))
                return 20;
        else
                 return 0;
}

uchar dadt,dadt_1;
void main(void)
{
               
                uchar wark = 0;
                time0_init();
                speed_left = 50;
                speed_right = 50;
                SE =15;
        
                while(1)
                {
      dadt=judge();
                        if(dadt == 0)
                        dadt=dadt_1;
                        dadt_1=dadt;
                        switch(dadt)
                        {
                        case 1:SE =15;speed_left =85;speed_right =85; break;
                        case 2:SE =15;speed_left =80;speed_right =85; break;         
                        case 3:SE =15;speed_left =85;speed_right =80; break;
                        case 4:SE =14;speed_left =70;speed_right =85; break;
            case 5:SE =16;speed_left =85;speed_right =70; break;         
                                
                        case 6:SE =14;speed_left =60;speed_right =75; break;
                        case 7:SE =16;speed_left =75;speed_right =60; break;
                        case 8:SE =13;speed_left =57;speed_right =75; break;
                        case 9:SE =17;speed_left =75;speed_right =57; break;
                                
                        case 10:SE =12;speed_left =45;speed_right =75; break;
                        case 11:SE =18;speed_left =75;speed_right =55; break;
                        case 12:SE =12;speed_left =55;speed_right =80; break;
                        case 13:SE =18;speed_left =75;speed_right =63; break;
                                
                    case 14:SE =11;speed_left =53;speed_right =80;  break;         
                    case 15:SE =19;speed_left =75;speed_right =58; break;         
                        case 16:SE =11;speed_left =55;speed_right =80; break;         
                        case 17:SE =19;speed_left =80;speed_right =55; break;
                                
                        case 18:SE = 11;speed_left =55;speed_right =80; break;
                        case 19:SE = 19;speed_left =80;speed_right =55; break;
            case 20:SE = 15;speed_left =85;speed_right =85;stop++;break;
                        default:
        break;
                        }                 
                }        
}

void T0_time() interrupt 1   //中斷函數(shù)
{
        TR0=0;
        TH0=0xff;      //255
        TL0=0Xea;      //234
        temp++;
        if(temp>=833)                        //202           //1000
   {
         temp=0;
   }
  if(temp<=SE)
   {
    D=1;
   }
   else
   {
     D=0;
   }
         count++;
        if(count>100)
        count=0;
        if(count<speed_left)
        {
                in1=1;
                in2=0;
        }
        else
        {
                in1=0;
                in2=0;
        }
        if(count<speed_right)
        {
                in3=1;
                in4=0;
        }
    else
        {
                in3=0;
                in4=0;
        }
        TR0=1;        
}

程序.zip

102.48 KB, 下載次數(shù): 15, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

ID:328014 發(fā)表于 2020-11-11 18:02 | 顯示全部樓層
這個(gè)能發(fā)一下原理圖嗎?不知道電路連接啊
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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