📄 xiaoche.c
字号:
//题目:自动往还小车
//用脉宽调制来控制小车速度
//光电传感器检测黑线
//小车以中速开始,检测到第1条黑线变为减速,
//检测到第2条黑线变为加速,检测到第3条黑线变为减速,
//检测到第4条黑线变为暂停3s,然后还回,做同上运动。
//并用数码管显示总时间和遇到的黑线数
//电机启动电流处理
//速度太快检测不到黑线
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
#define SEG_WORDPORT P0 //数码管位码
#define SEG_DIGPORT P2 //数码管段码
sbit MOTOR_IN0=P1^0; //电机输入口0//前转
sbit MOTOR_IN1=P1^1; //电机输入口1//后转
sbit p32=P3^2;
uchar code Seg_Code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~9共阳表
uchar buf[4]={0xc0,0xc0,0xc0,0xc0}; //所要显示内容
uchar t,t_h,t_l; //高电平时间,低高电平时间
uint tt;
uint sec; //总时间
uchar t_zanting; //暂停时间
bit dianping; //高低电平标志
bit zhuanxiang; //转向标志,1为前转
bit zanting; //暂停标志
uchar heixian; //黑线数
void Delay(uchar t1,uchar t2)
{ for(;t1>0;t1--);
for(;t2>0;t2--);
}
void int0() interrupt 0
{ Delay(5,125); //5ms消黑点
if(p32==0)
{ heixian++;
switch(heixian)
{ case 1: //到黑线1减速 //前进
case 3: //到黑线3减速 //前进
case 5: //到黑线5减速 //回走
case 7: //到黑线7减速 //回走
t_h=4; //4ms:6ms
t_l=6;
t=t_h;
dianping=1; //高电平
break;
case 2: //到黑线2加速 //前进
case 6: //到黑线6加速 //回走
t_h=6; //6ms:4ms
t_l=4;
t=t_h;
dianping=1; //高电平
break;
case 4: zanting=1; //暂停
MOTOR_IN0=0; //停止
MOTOR_IN1=0;
break;
case 8: EA=0;
MOTOR_IN0=0; //停止
MOTOR_IN1=0;
break;
default: EA=0;
MOTOR_IN0=0; //停止
MOTOR_IN1=0;
break;
}
}
}
void time0() interrupt 1 //电机前进定时
{ TR0=0;
TH0=0Xfc; TL0=0X18; //1ms
TR0=1;
tt++;
if(tt==1000) //1s
{ tt=0;
sec++; //计时
}
if(zanting==1) //暂停
{ t_zanting--;
if(t_zanting==0)
{ t_h=8; //8ms:2ms中速回走
t_l=2;
t=t_h;
zanting=0;
dianping=1; //高电平
zhuanxiang=0; //反向
MOTOR_IN0=0; //反转
MOTOR_IN1=1;
}
}
else
{ t--;
if(t==0)
{ if(dianping==1) //高电平
{ t=t_l;
dianping=0;
if(zhuanxiang==1)
MOTOR_IN0=0; //电机前转
else
MOTOR_IN1=0; //电机后转
}
else //低电平
{ t=t_h;
dianping=1;
if(zhuanxiang==1)
MOTOR_IN0=1; //电机前转
else
MOTOR_IN1=1; //电机后转
}
}
}
}
void chuli() //结果处理
{ buf[0]=Seg_Code[sec%10]; //总时间个位
buf[1]=Seg_Code[sec/10%10]; //总时间十位
buf[2]=Seg_Code[sec/100%10]; //总时间百位
buf[3]=Seg_Code[heixian%10]; //黑线数
}
void Seg_Display() //数码管显示程序
{ uchar i;
uchar dig=0x01;
for(i=0;i<4;i++)
{ SEG_WORDPORT=0xff; //清屏
SEG_DIGPORT=dig<<i; //位码
SEG_WORDPORT=buf[i]; //段码
Delay(1,100);
}
}
main()
{ Delay(30,125);
EA=0;
IT0=1; EX0=1; //外部中断0
TMOD=0X11; //定时中断
ET0=1; ET1=1;
TH0=0Xfc; TL0=0X18; //1ms
EA=1;
MOTOR_IN0=1; //前转
MOTOR_IN1=0;
Delay(250,250);
Delay(250,250);
Delay(250,250); //给1.5s高电流启动
TR0=1; //启动定时
t_h=7; //7ms:3ms中速
t_l=3;
t=t_h;
dianping=1;
zhuanxiang=1; //前进
while(1)
{ Seg_Display();
chuli();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -