找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1944|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机循迹小车程序

[复制链接]
跳转到指定楼层
楼主
ID:601581 发表于 2020-11-4 15:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
# define uchar unsigned char
# define uint unsigned int
//定义单片机不同的I/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个灯

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;   //对定时器0的模式进行选择0001 即gate为0即T0只受TR0控制 C/T为0即为定时器  01对应16位的定时器
        TH0=0xFF;    //寄存器的高8位 1111 1111
        TL0=0xea;   //寄存器的低8位  1110 1010
        TR0=1;      //启动定时器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   //中断函数
{
        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, 下载次数: 15, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:328014 发表于 2020-11-11 18:02 | 只看该作者
这个能发一下原理图吗?不知道电路连接啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表