微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 简单单片机程序,有偿求助!急

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

时间:10-02 整理:3721RD 点击:
想要实现颜色传感器检测到红球步进电机正转90度,其他颜色反转90度,目前没有编译错误,但烧录后没有执行IF语句,并且不是90度。步进电机型号是:28BYJ-48 若有想法+Q1130011026
#include <reg52.h>
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<Ms;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!='\0';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<m<90&&0<n<30&&0<o<30)
      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

具体的是那个语句呢?

程序智能看到一部分。你把主要的发出来

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top