智能循迹小车程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#define uint unsigned int
//D0-D7:f,b,a,e,d,h,c,g 共阴 依次编码 //74LS04 反相器驱动数码管
uchar code table[10] = {0x5F,0x42,0x9E,0xD6,0xC3,0xD5,0xDD,0x46,0xDF,0xD7};
uchar
i = 0; // 用于 0-3 数码管轮流显示 uint
j = 0; // 计时的次数 uint
time=0; // 计时 uint
pwm=16; // 占空比 uint
speed; //调制PWM 波的当前的值
// 电机驱动口定义
sbit
ENB=P1A0; // 前轮电机停止控制使能 sbit
ENA=P1A1; // 后轮控制调速控制端口 sbit
IN1=P1A2; // 前轮 sbit
IN2=P1A3; // 前轮 sbit
IN3=P1A4; // 后轮 sbit IN4=P1A5; // 后轮
void Init()
{
TMOD = 0x12; // 定时器 0 用方式 2, 定时器 1 用方式 1
TH0=(256-200)/256; //pwm
TL0=(256-200)/256;
TH1 = 0x0F8; // 定时 2ms
TL1 = 0x30;
EA = 1;
ET0 = 1;
ET1 = 1;
TR0 = 1;
TR1 = 1;
}
void tim0(void) interrupt 1 //
产生 PWM
{ speed ++; if(speed <= pwm)
sbit
R=P3A 2; // 右边传感器 P3A 2 sbit L=P3A3; // 左边传感器 P3A3 //pwm 就相当于占 100 的比例
ENA = 1;
}
else if(speed < 100) {
ENA = 0;
}
else
speed = 0;
}
void time1() interrupt 3 {
TH1 = 0x0F8;
TL1 = 0x30;
i =(i+1) % 4; j++;
if(i == 0)
{ P0 = 0x00; P0 = table[time%10]; } if(i == 1) {
P0 = 0x00;
P0 = table[time/ 10% 10]; } if(i == 2) { P0 = 0x00;
P0 = table[time/ 100% 10]; } if(i == 3) {
P0 = 0x00;
P0 = table[time/ 1000% 10];
}
P2 = ( 0x10 << i );
// 送位选信号 if(j == 500)
{
time ++; //500 次为 1 秒 j = 0;
void forward() // 前进
{
IN2=1;
IN1=0;
}
void back() // 后退
{
IN2=0;
IN1=1;
}
void left()
// 左转
{ ENB=1;
// 打开使能 IN3=1;
// 定时 2ms //0-3 循环
// 显示最低位数码管
// 段选清零防止乱码
// 送段码信号
IN4=0;
}
void right() // 右转
{
ENB=1; // 打开使能
IN3=0;
IN4=1;
}
void stop() // 停止
{
IN2=0;
IN1=0;
IN3=0;
IN4=0;
}
void main()
{
Init(); // 定时器初始化while(1)
{
if(R==0 && L==1) // 右传感器检测到黑线
{
right(); // 右转
forward();
while(R==0 && L==1);
}
if(R==1 && L==0) // 左传感器检测到黑线{
left(); forward(); while(R==1 && L==0);
}
if(R==0 && L==0) // 都检测到黑线则停止
{
stop();
j = 0; // 定时器仍在工作,计数时间清空} else // 都没有检测到黑线
{
ENB = 0; // 关闭转向控制
forward();
}
}
}