• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

简单单片机程序,有偿求助!急

心晴的嘻哈马 2016-02-26 浏览量:868
想要实现颜色传感器检测到红球步进电机正转90度,其他颜色反转90度,目前没有编译错误,但烧录后没有执行IF语句,并且不是90度。步进电机型号是:28BYJ-48 若有想法+Q1130011026
#include

sbit led=P1^0;

sbit A1=P2^0; //定义步进电机连接端口
sbit B1=P2^1;
sbit C1=P2^2;
sbit D1=P2^3;

sbit    tcs230_s2=P3^2;//TCS230 S2接单片机P1.0
sbit    tcs230_s3=P3^3;//TCS230 S3接单片机P1.1
sbit    tcs230_en=P3^4; //TCS230 EN(E0)接GND

#define uchar unsigned char
#define uint  unsigned int
#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电

unsigned char Speed;

void    DelayMs(uint Ms);//1MS基准延时程序
void    baipingheng();//白平衡子程序
void    celiang();//实际颜色程序
void    zhengzhuan();
void    fanzhuan();
void    panduan();
uint    ryz,gyz,byz;//分别定义红色因子 绿色因子 蓝色因子
uint    rb,gb,bb;//RGB值
uchar   tab1[]={\'0\',\'1\',\'2\',\'3\',\'4\',\'5\',\'6\',\'7\',\'8\',\'9\',\'A\',\'B\',\'C\',\'D\',\'E\',\'F\'};

void DelayMs(uint Ms)
{
  uint i,TempCyc;
  for(i=0;i
  {
    TempCyc = 250;
    while(TempCyc--);
  }
}

void Serial_Init(void)//串口初始化函数
{
SCON = 0x50;//串口:方式1,允许发送和接收
TMOD = 0x20;//定时器1:模式2,8位自动重装模式,用于产生波特率    
TH1 = 0xFD; //11.0592MHZ晶振,波特率为9600
TL1 = 0xFD;   
TR1 = 1;    //开启定时器1   
ES = 1;     //开启串口中断
EA = 1;     //开启全局中断
}
void Send_Hex(unsigned char c)         
{
    ES = 0;               //关串口中断
    SBUF = c;
    while(TI!=1);         //等待发送完成
    TI = 0;               //清除发送中断标志位
        ES = 1;               //开串口中断
}
void Send_ASCII(unsigned char *b)         
{
    ES = 0;                   //关串口中断
    for (b; *b!=\'\';b++)
            {
                SBUF = *b;
                while(TI!=1);     //等待发送完成
                        TI = 0;           //清除发送中断标志位
                }
        ES = 1;                   //开串口中断
        Send_Hex(0x0d);           //发送回车符
        Send_Hex(0x0a);           //发送换行符 
}

main()   
{   

   //Serial_Init();   
         SCON = 0x50;//串口:方式1,允许发送和接收
         RCAP2H=0xFF;         
         RCAP2L=0xDC;
         TH2=RCAP2H;
         TL2=RCAP2L;
         T2CON=0X34;
//         TMOD = 0x20;//定时器1:模式2,8位自动重装模式,用于产生波特率    
//         TH1 = 0xFD; //11.0592MHZ晶振,波特率为9600
//         TL1 = 0xFD;   
//         TR1 = 1;    //开启定时器1   
//         ES = 1;     //开启串口中断
//         EA = 1;     //开启全局中断



   TMOD=0x51;//设定T0以工作方式1定时10毫秒

   Send_ASCII("system init..");
   baipingheng();//上电时先白平衡一次
   Send_ASCII("init OK");
   while(1)
   {
       celiang();//颜色测试

           Send_Hex(\'R\');
           Send_Hex(rb/100+0x30);
           Send_Hex(rb/10%10+0x30);
           Send_Hex(rb%10+0x30);
           Send_Hex(\' \');
           Send_Hex(\'G\');
           Send_Hex(gb/100+0x30);
           Send_Hex(gb/10%10+0x30);
           Send_Hex(gb%10+0x30);
           Send_Hex(\' \');
           Send_Hex(\'B\');
           Send_Hex(bb/100+0x30);
           Send_Hex(bb/10%10+0x30);
           Send_Hex(bb%10+0x30);
           Send_Hex(0X0D);
           Send_Hex(0X0A);

      panduan();
//       DisplayOneChar(0, 0,\'R\');//以十进制显示RGB中红色的分值
//       DisplayOneChar(0, 1, rb/100+0x30); //显示百位数据
//       DisplayOneChar(0, 2, rb/10%10+0x30);//显示十位数据
//       DisplayOneChar(0, 3, rb%10+0x30);//显示个位数据
//       DisplayOneChar(0, 5,\'G\');//以十进制显示RGB中绿色的分值
//       DisplayOneChar(0, 6, gb/100+0x30); //显示百位数据
//       DisplayOneChar(0, 7, gb/10%10+0x30);
//       DisplayOneChar(0, 8, gb%10+0x30);
//       DisplayOneChar(0, 10,\'B\');//以十进制显示RGB中蓝色的分值
//       DisplayOneChar(0, 11, bb/100+0x30);
//       DisplayOneChar(0, 12, bb/10%10+0x30);
//       DisplayOneChar(0, 13, bb%10+0x30);
//       //*****在LCD1602的第二行以16进制显示RGB*******************
//       DisplayOneChar(1, 1, tab1[rb/16]); 
//       DisplayOneChar(1, 2, tab1[rb%16]);
//       DisplayOneChar(1, 3, \'H\');
//       DisplayOneChar(1, 6, tab1[gb/16]); 
//       DisplayOneChar(1, 7, tab1[rb%16]);
//       DisplayOneChar(1, 8, \'H\');
//       DisplayOneChar(1, 11,tab1[bb/16]);
//       DisplayOneChar(1, 12,tab1[bb%16]);
//       DisplayOneChar(1, 13,\'H\');
          

   }


void   panduan()
{
    uint m;
    uint n;
    uint o;
      m=100*(rb/100+0x30)+10*(rb/10%10+0x30)+1*(rb%10+0x30);
      n=100*(gb/100+0x30)+10*(gb/10%10+0x30)+1*(gb%10+0x30);
      o=100*(bb/100+0x30)+10*(bb/10%10+0x30)+1*(bb%10+0x30);
      if(20
      zhengzhuan();

      else
      fanzhuan();

}

//白平衡子程序
void   celiang()
{
     //*********求R值************************************
     TH0=(65536-10000)/256;
           TL0=(65536-10000)%256;
     TH1=0;
     TL1=0;
     tcs230_s2=0;
     tcs230_s3=0;//选择红色滤光器
     tcs230_en=0;
     TR0=1;//10毫秒开始计时
     TR1=1;//开始计数
     while(TF0==0);//等待定时器溢出
     TF0=0;//清楚定时器0溢出标志
     TR0=0;//关闭定时0
     TR1=0;
     rb=(unsigned long)(TH1*256+TL1)*255/ryz;
     if(rb>255)rb=255;//判断RGB值是否合法
     //***********求B值**************************************
     TH0=(65536-10000)/256;
           TL0=(65536-10000)%256;
     TH1=0;
     TL1=0;
     tcs230_s2=0;
     tcs230_s3=1;//选择蓝色滤光器
     TR0=1;//10毫秒开始计时
     TR1=1;//开始计数
     while(TF0==0);//等待定时器溢出
     TF0=0;//清楚定时器0溢出标志
     TR0=0;//关闭定时0
     TR1=0;
     bb=(unsigned long)(TH1*256+TL1)*255/byz;
     if(bb>255)bb=255;//判断RGB值是否合法     
     //***********求G值**************************************   
     TH0=(65536-10000)/256;
           TL0=(65536-10000)%256;
     TH1=0;
     TL1=0;
     tcs230_s2=1;
     tcs230_s3=1;//选择绿色滤光器
     TR0=1;//10毫秒开始计时
     TR1=1;//开始计数
     while(TF0==0);//等待定时器溢出
     TF0=0;//清楚定时器0溢出标志
     TR0=0;//关闭定时0
     TR1=0;
     tcs230_en=1;
     gb=(unsigned long)(TH1*256+TL1)*255/gyz;
     if(gb>255)gb=255;//判断RGB值是否合法  
}
//******************************************************
//白平衡子程序
void    baipingheng()
{
     //**************求取红色因子***********************
     TH0=(65536-10000)/256;
           TL0=(65536-10000)%256;
     TH1=0;
     TL1=0;
     tcs230_s2=0;
     tcs230_s3=0;//选择红色滤光器
     tcs230_en=0;
     TR0=1;//10毫秒开始计时
     TR1=1;//开始计数
     while(TF0==0);//等待定时器溢出
     TF0=0;//清楚定时器0溢出标志
     TR0=0;//关闭定时0
     TR1=0;
     ryz=TH1*256+TL1;//其实这里的比例因子应该为255/(TH1*256+TL1)
     //**************求取蓝色因子***********************
     TH0=(65536-10000)/256;
           TL0=(65536-10000)%256;
     TH1=0;
     TL1=0;
     tcs230_s2=0;
     tcs230_s3=1;//选择蓝色滤光器
     TR0=1;//10毫秒开始计时
     TR1=1;//开始计数
     while(TF0==0);//等待定时器溢出
     TF0=0;//清楚定时器0溢出标志
     TR0=0;//关闭定时0
     TR1=0;
     byz=TH1*256+TL1;//其实这里的比例因子应该为255/(TH1*256+TL1)
     //**************求绿红色因子***********************
     TH0=(65536-10000)/256;
           TL0=(65536-10000)%256;
     TH1=0;
     TL1=0;
     tcs230_s2=1;
     tcs230_s3=1;//选择绿色滤光器
     TR0=1;//10毫秒开始计时
     TR1=1;//开始计数
     while(TF0==0);//等待定时器溢出
     TF0=0;//清楚定时器0溢出标志
     TR0=0;//关闭定时0
     TR1=0;
     tcs230_en=1;
     gyz=TH1*256+TL1;//其实这里的比例因子应该为255/(TH1*256+TL1)
}

void  zhengzhuan()
{
unsigned int j=0;
Speed=1;         
led=0;//转动
         j=43; //旋转一周时间
         Coil_OFF
         while(j--)  //正向
          {         
             Coil_A1                //遇到Coil_A1  用{A1=1;B1=0;C1=0;D1=0;}代替
             DelayMs(Speed);         //改变这个参数可以调整电机转速 ,
                                     //数字越小,转速越大,力矩越小
             Coil_B1
             DelayMs(Speed);
             Coil_C1
             DelayMs(Speed);
             Coil_D1
             DelayMs(Speed);
          }
}

void  fanzhuan()
{
unsigned int j=0;
Speed=1;         
led=1;//反向
          Coil_OFF
          j=43;
          while(j--)//反向
          {
             Coil_D1                //遇到Coil_A1  用{A1=1;B1=0;C1=0;D1=0;}代替
             DelayMs(Speed);         //改变这个参数可以调整电机转速 ,
                                 //数字越小,转速越大,力矩越小
             Coil_C1
             DelayMs(Speed);
             Coil_B1
             DelayMs(Speed);
             Coil_A1
             DelayMs(Speed);
          }
}
想要实现颜色传感器检测到红球步进电机正转90度,其他颜色反转90度,目前没有编译错误,但烧录后没有执行IF语句,并且不是90度。步进电机型号是:28BYJ-48 若有想法+Q1130011026 
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 就第一个条件20 if((m<20)&(m<90)) ,我之前做项目的时候有同事就遇到过,按照前一写法,程序运行不了,后一种写法就能正常运行了……
    • 发布于 2016-02-26
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:3
  • 加你Q了,加我:121377715可以帮你分析一下
    • 发布于2016-02-26
    • 举报
    • 评论 0
    • 0
    • 0

  • 楼上好尽职、我都没耐心看完
    • 发布于2016-02-26
    • 举报
    • 评论 0
    • 0
    • 0

  • 初步看了一下,发现了一个语法错误:if(20
    • 发布于2016-02-26
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

简单单片机程序,有偿求助!急