简单单片机程序,有偿求助!急
时间: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
#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
具体的是那个语句呢?
程序智能看到一部分。你把主要的发出来