资源简介

这是用加强型单片机stc12c5a60s2为控制核心制作的迷宫小吃,本车利用前方五个红外传感器进行黑线循迹,采用右手法则和底部两个光电传感器进行拐弯。

资源截图

代码片段和文件信息

#include
#include
#define uchar unsigned char
#define uint unsigned int
#define LEFTPMW 0x40
#define RIGHTPWM 0x43
#define TURNL1PWM 0x33
#define TURNR1PWM 0x36
#define TURNL2PWM 0x25
#define TURNR2PWM 0x28
/*stc12c5a60s2相关宏定义*/
sfr AUXR  = 0X8E;
sfr CCON     = 0xD8; //PCA控制寄存器
sfr CMOD     = 0xD9; //PCA模式寄存器
sfr CCAPM0   = 0xDA; //PCA模块0模式寄存器    
sfr CCAPM1   = 0xDB; //PCA模块1模式寄存器 
sfr CL       = 0xE9; //PCA 定时寄存器 低位
sfr CH       = 0xF9; //PCA 定时寄存器 高位
sfr CCAP0L   = 0xEA; //PCA模块0的 捕获寄存器 低位
sfr CCAP0H   = 0xFA; //PCA模块0的 捕获寄存器 高位
sfr CCAP1L   = 0xEB; //PCA模块1的 捕获寄存器 低位
sfr CCAP1H   = 0xFB; //PCA模块1的 捕获寄存器 高位
sfr PCA_PWM0 = 0xF2; //PCA PWM 模式辅助寄存器0
sfr PCA_PWM1 = 0xF3; //PCA PWM 模式辅助寄存器1

sbit CF      = 0xDF;    //PCA计数溢出标志位
sbit CR      = 0xDE;    //PCA计数器 运行控制位
sbit CCF1    = 0xD9;    //PCA模块1中断标志
sbit CCF0    = 0xD8;    //PCA模块0中断标志

/*电机控制口以及红外传感器控制口*/
sbit p20zuo = P2^0;
sbit p21zuo = P2^1;
sbit p22you = P2^2;
sbit p23you = P2^3;
sbit youhong1 = P0^0;
sbit youhong2 = P0^1;
sbit zhonghong = P0^2;
sbit zuohong2 = P0^3;
sbit zuohong1 = P0^4;


/*变量定义*/
uint speed1 = 0;
uint speed2 = 0;
bit flag1 = 0;
bit flag2 = 0;
uchar stopnum = 0;
uchar turnflag = 0;
uchar temp = 0;

void delay(uchar a)
{
uchar b;
while(a--)
{
for(b=0;b<=115;b++)
{;}
}
}

/*芯片初始化,开中断允许*/
void init()
{
EA=1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
ET0=1;                        
TMOD=0x01;            
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;          
}

/*初始化pwn控制器*/
void pwn_init() 
{
CMOD = 0x0a;
CL = 0;
CH = 0;
CCAP0L = CCAP0H = LEFTPMW; //控制左电机的PCA模块
CCAPM0 = 0x42;
CCAP1L = CCAP1H = RIGHTPWM; //控制右电机的PCA模块
CCAPM1 = 0X42;
CR = 1;  //启动计数器
}

/*小车行走功能函数*/
/*到达迷宫出口*/
void stopforever()
{
p20zuo = 1;
p21zuo = 1;
p22you = 1;
p23you = 1;
while(1)
{}
}
/*小车短暂停顿为拐弯做准备*/
void stop()
{
p20zuo = 1;
p21zuo = 1;
p22you = 1;
p23you = 1;
TR0 = 1;
while(1)
{
if(stopnum==10)
{
stopnum = 0;
TR0 = 0;
break;
}
}
}

/*直走调速函数*/
/*直线行走,左加速*/
void speed_regulation1(uint condition)
{
if(condition==2)
{

CCAP0L = CCAP0H = TURNL2PWM;
p22you = 1;
delay(3);
p22you = 0;
CCAP0L = CCAP0H = LEFTPMW;
}
else
{
if(condition==6)
{
CCAP0L = CCAP0H = TURNL1PWM;
delay(20);
CCAP0L = CCAP0H = LEFTPMW;
}
}
}

/*直线行走,右加速*/
void speed_regulation2(uint condition)
{
if(condition==12)
{
CCAP1L = CCAP1H = TURNR1PWM;
delay(20);
CCAP1L = CCAP1H = RIGHTPWM;

}
else
{
if(condition==8)
{
CCAP1L = CCAP1H = TURNR2PWM;
p20zuo = 1;
    delay(3);
p20zuo = 0;
CCAP1L = CCAP1H = RIGHTPWM;

}
}
}

/*直线行走,保持原速*/
void speed_regulation3()
{
CCAP0L = CCAP0H = LEFTPMW;
CCAP1L = CCAP1H = RIGHTPWM;
delay(30);
}

void gostraight(uint condition)
{
switch(condition)
{
case 2:speed_regulation1(condition);break;  //直线行走,

评论

共有 条评论