标题:
简易小车简单行驶程序
[打印本页]
作者:
daming
时间:
2014-12-30 23:42
标题:
简易小车简单行驶程序
/* 程序名称:简易小车简单行驶程序
功 能;用AT89S52、两个步进电机、红外线遥控控制小车的简易行驶
运行环境:Keil Uvision2.0
程序说明:红外线数据接受部分的程序未写,变速可用变速箱
制 作:hankjulianth
*/
#include"reg52.h"
#define uint unsigned int
#define uchar unsigned char
uint temp=0x88;
uint temp1=0x08;
uint temp2=0x80;
uint temp3=0x11;
sbit A1=P0^0;
sbit B1=P0^1;
sbit C1=P0^2;
sbit D1=P0^3;
sbit A2=P0^4;
sbit B2=P0^5;
sbit C2=P0^6;
sbit D2=P0^7;
void start();//小车启动函数
void Rstart();//启动倒退函数
void timestart();//设计计时函数
sbit CTR1=P3^0;//左电机1停止-左转弯-控制信号
uint T1;//每次左转弯时间 =T1*50ms
sbit CTR2=P3^1;//右电机2停止-右转弯-控制信号
uint T2;//每次右转弯时间 =T2*50ms
uint T3;//每次倒退时间 =T3*50ms
void set(Recieve()); //设置转弯时间函数
sbit CTR=P3^2;//启动信号
sbit RCTR=P3^3;//倒退控制信号
void delay();//延迟函数
void _init_();//转弯中断初始函数
void Recieve();//红外线数据接受函数,包括T1、T2、CRT、CRT1、CRT2的状态
void main()
{
while(1)
{
while(CTR)
{
set(Recieve());
start();
while(CRT1)
{ //t以毫秒为单位
_init_();
P0=temp1;
temp1>>=1;
if(temp1==0x0)
{temp1=0x08;}
delay();
if(t==T1)
{CRT1=0;}//中断停止左转弯
}
while(CRT2)
{
_init_();
P0=temp2;
temp2>>=1;
if(temp2==0x0)
{temp2=0x80;}
void delay();
if(t==T2)
{CRT2=0;}//中断停止右转弯
}
while(RCTR)
{Rstart();
if(t==T3)
{RCTR=0;}//中断停止倒退
}
}
delay();
}
}
void _init_()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
EA=1;
ET0=1;
t=0;
}
void timer0() interrupt 1
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
EA=1;
ET0=1;
t++;
}
void set(Recieve())
{
T1=x;
T2=y;
}
void start()
{
P0=temp;
temp>>=1;
if(temp==0x0)
{temp=0x88;}
}
void Rstart()
{
P0=temp3;
temp3<<=1;
if(temp3==0)
{
temp1=0x11;
}
}
void delay()
{
uint i,j;
for(i=20;i>0;i--)
for(j=10;j>0;j--);
}
复制代码
作者:
daming
时间:
2014-12-30 23:42
改进版:
/* 程序名称:简易小车简单行驶程序
功 能;用AT89S52、两个步进电机、红外线遥控控制小车的简易行驶
运行环境:Keil Uvision2.0
程序说明:红外线数据接受部分的程序补上,变速可用变速箱
制 作:hankjulianth
*/
#include"reg52.h"
#include"stdio.h"
#include"intrins.h"
#define uint unsigned int
#define uchar unsigned char
uint temp=0x88;
uint temp1=0x08;
uint temp2=0x80;
uint temp3=0x11;
sbit A1=P0^0;
sbit B1=P0^1;
sbit C1=P0^2;
sbit D1=P0^3;
sbit A2=P0^4;
sbit B2=P0^5;
sbit C2=P0^6;
sbit D2=P0^7;
uint t=0;
void start();//小车启动函数
void Rstart();//启动倒退函数
void timestart();//设计计时函数
sbit CTR1=P3^0;//左电机1停止-左转弯-控制信号
//uint T1=40;//每次左转弯时间 =T1*50ms
sbit CTR2=P3^1;//右电机2停止-右转弯-控制信号
//uint T2=40;//每次右转弯时间 =T2*50ms
//uint T3=40;//每次倒退时间 =T3*50ms
sbit CTR=P3^2;//启动信号
sbit RCTR=P3^3;//倒退控制信号
sbit STOP=P3^4;//停止键控制信号
void delay();//延迟函数
void _init_();//转弯中断初始函数
//*****************************************************************
//红外控制程序段
//*****************************************************************
unsigned char irtime;//红外用全局变量
bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char irdata[33];
sbit IR=P3^2;//红外接口标志
void Ircordpro()//红外码值处理函数
{
uchar i,j,k;
uchar cord,value;
k=1;
for(i=0;i<4;i--)//处理4个字节
{
for(j=8;j>0;j--)//处理一个字节八位
{
cord=irdata[k];
if(cord>7)//大于某值为1
{value=value|0x08;}
else
{value=value;}
if(j>0)
{value=value>>1;}
k++;
}
IRcord[i]=value;
value=0;
}
irpro_ok=1;//处理完毕标志位置1
}
//******************************************************************
void Ir_work()//红外键值散转程序
{
switch(IRcord[2])//判断第三个数码值
{
case 0:CTR=1;break;//各键实现的功能:小车启动键
case 1:RCTR=1;break;//小车倒退键
case 3:CTR2=1;break;//小车右转弯键
case 4:CTR1=1;break;//小车左转弯键
case 5:STOP=0;break;//小车停止键
}
irpro_ok=0;//处理完成标志
}
//******************************************************************
void ex0 () interrupt 0 using 0//外部中断0服务函数
{
static uchar i;
static bit startflag;
if(startflag)
{
if(irtime<42&&ritime>=33)//引导码TC9012的头码
{
i=0;
irdata[i]=irtime;//一次存储32位电平宽度
irtime=0;
i++;
if(i=33)
{
irok=1;
i=0;
}
}
else
{irtime=0;startflag=1;}
}
}
//******************************************************************
void tim1 (void) interrupt 3 //定时器1中断服务函数
{
irtime++;
}
void RAD_RESERCH();//红外检测函数
{
IT0=1;//外部0中断开启
EX0=1;
EA=1;
TMOD=0x11;
ET1=1;//开启定时器1中断
TH1=0;
TL1=0;
if(irok)
{
Ircordpro();//码值处理
irok=0;
}
if(irpro_ok)//step press key
{
Ir_work();//码值识别散转
}
}
//***************************************************结束
//******************************************************************
void main()
{
while(1)
{//***********************************************红外控制检测
RAD_RESERCH();
//红外检测结束
while(CTR)
{
RAD_RESERCH();
start();
while(CTR1)
{ //t以毫秒为单位
_init_();
P0=temp1;
temp1>>=1;
if(temp1==0x0)
{temp1=0x08;}
delay();
if(t==40)
{CTR1=0;t=0;}//中断停止左转弯
}
while(CTR2)
{
_init_();
P0=temp2;
temp2>>=1;
if(temp2==0x0)
{temp2=0x80;}
void delay();
if(t==40)
{CTR2=0;t=0;}//中断停止右转弯
}
while(RCTR)
{
Rstart();
if(t==40)
{RCTR=0;t=0;}//中断停止倒退
}
}
delay();
}
}
void _init_()
{
TMOD=0x11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
EA=1;
ET0=1;
t=0;
}
void timer0() interrupt 1
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
EA=1;
ET0=1;
t++;
}
void start()
{
P0=temp;
temp>>=1;
if(temp==0x0)
{temp=0x88;}
}
void Rstart()
{
P0=temp3;
temp3<<=1;
if(temp3==0)
{
temp1=0x11;
}
}
void delay()
{
uint i,j;
for(i=20;i>0;i--)
for(j=10;j>0;j--);
}
复制代码
作者:
whrui5033
时间:
2015-1-12 13:09
研究研究
作者:
LHQWELH
时间:
2015-1-18 10:50
ZHENHAO
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1