智能车制作
标题:
c51做智能小车
[打印本页]
作者:
aiery
时间:
2009-4-5 15:04
标题:
c51做智能小车
/**********飞思卡尔智能汽车程序***/
//资源分配如下
//舵机用定时器0频率为50HZ
//直流用定时器1频率为10KHZ
//测速用外部中断0周期为50ms
#include<AT89X52.h>
#define uchar unsigned char
#define uint unsigned int
sbit PWM_Steer=P1^0;
sbit PWM_IN1=P1^2;
sbit PWM_IN2=P1^3;
//****舵机控制量************
//====f=24MHz
uchar angle=8;
/*
uchar Low_Angle_L[]={0x6d,0xdc,0x4b,0xba,0x29,0x98,0x07,0x77,0xe6, 0x55,0xc4,0x34,0xa2,0x11,0x80};
uchar High_Angle_L[]={0x6c,0x6c,0x6d,0x6d,0x6e,0x6e,0x6f,0x6f,0x6f,0x70,0x70,0x71,0x71,0x72,0x72};
uchar Low_Angle_H[]={0x50,0xe1,0x72,0x03,0x94,0x25,0xb6,0x47,0xd7,0x68,0xf9,0x8a,0x1b,0xac,0x3d};
uchar High_Angle_H[]={0xf7,0xf6,0xf6,0xf6,0xf5,0xf5,0xf4,0xf4,0xf3,0xf3,0xf2,0xf2,0xf2,0xf1,0xf1};
*/
//===f=11.0592
uchar Low_Angle_L[]={0x00,0x33,0x66,0x99,0xcc,0x00,0x33,0x66,0x99,0xcc,0x00,0x33,0x66,0x99,0xcc};
uchar High_Angle_L[]={0xbc,0xbc,0xbc,0xbc,0xbc,0xbd,0xbd,0xbd,0xbd,0xbd,0xbe,0xbe,0xbe,0xbe,0xbe};
uchar Low_Angle_H[]={0x00,0xcc,0x99,0x66,0x33,0x00,0xcc,0x99,0x66,0x33,0x00,0xcc,0x99,0x66,0x33};
uchar High_Angle_H[]={0xfc,0xfb,0xfb,0xfb,0xfb,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfb,0xf9,0xf9,0xf9};
/*
//****直流电机控制量********
uchar code speed_hope[]={52,78,104,130,130,156,182,208,182,156,130,130,104,78,52}; //期望的速度值
uchar PWM_H_D=0x00;
uchar PWM_L_D=0xff; //PID运算之后
uchar last_error=0,pre_error=0;
uchar times_stopline=0;
uchar stop=0;
*/
//******子程序*************
void Init();
void Route_Detect();
void Start_Delay(uchar);
//******主程序*************
void main()
{
PWM_IN1=1;
PWM_IN2=0;
Init();
Start_Delay(2);
while(1)
{
Route_Detect();
}
}
//*********初始化************************
void Init()
{
IE=0X8b;
TMOD=0X11;
TH0=0XF4;
TL0=0X48;
TH1=0X38;
PWM_IN1=1;
PWM_IN2=0;
TCON=0X53;
}
//********路径检测*****************
void Route_Detect()
{
uchar led1,led2;
led1=P0;
led2=P2;
if(((led1==0xf3)||(led1==0xfb)||(led1==0xfc)||(led1==0xfe)||(led1==0xfd)||(led1==0xf9))&&(led2==0xff))
angle=0; //-35
else if((led1==0xf7)&&(led2==0xff))
angle=1; //-30
else if((led1==0xe7)&&(led2==0xff))
angle=2; //-25
else if((led1==0xef)&&(led2==0xff))
angle=3; //-20
else if((led1==0xcf)&&(led2==0xff))
angle=4; //-15
else if((led1==0xdf)&&(led2==0xff))
angle=5; //-10
else if((led1==0x9f)&&(led2==0xff))
angle=6; //-5
else if((led1==0xbf)&&(led2==0xff))
angle=7; //0
else if((led1==0x3f)&&(led2==0xff))
angle=8; //5
else if((led1==0x7f)&&(led2==0xff))
angle=9; //10
else if((led1==0x7f)&&(led2==0xfe))
angle=10; //15
else if((led1==0xff)&&(led2==0xfe))
angle=11; //20
else if((led1==0xff)&&(led2==0xfc))
angle=12; //25
else if((led1==0xff)&&(led2==0xfd))
angle=13; //30
else if((led1==0xff)&&((led2==0xf9)||(led2==0xfb)||(led2==0xf3)||(led2==0xf7)||(led2==0xef)||(led2==0xe7)))
angle=14; //35
else
angle=9;
}
//********舵机控制*****************
void Steer_Control() interrupt 1
{
if(PWM_Steer==1)
{
TL0=Low_Angle_L[angle];
TH0=High_Angle_L[angle];
PWM_Steer=0;
}
else
{
TL0=Low_Angle_H[angle];
TH0=High_Angle_H[angle];
PWM_Steer=1;
}
} /*
//*******速度检测***************
void Speed_Test() interrupt 0
{
speed_count++;
}
//********速度运算*****************
void speed_cal()
{
if(speed_t>=100)
{
EX0=0;
speed=26*speed_count; //(cm/s)
speed_count=0;
EX0=1;
}
}
//*********PID运算******************
void PID()
{
int PID;
int error;
int derror;
int pre_derror;
error=speed_hope[angle]-speed;
derror=error-last_error;
pre_derror=last_error-pre_error;
PID=PID_P*derror+PID_I*error+PID_D*(derror-pre_error);
PWM_H_D=256-(PWM_H_D+PID);
PWM_L_D=256-(PWM_L_D-PID);
pre_error=last_error;
last_error=error;
}
//*************************
void Motor_Contol() interrupt 3
{
speed_t++;
if(stop==1) //当停车标志为1时给直流电机制动脉冲
{
if(PWM_IN2==0)
{
TH1=trig_H_TH1;
TL1=trig_H_TL1;
PWM_IN2=1;
PWM_IN1=0;
}
else
{
TH1=trig_L_TH1;
TL1=trig_L_TL1;
PWM_IN2=0;
PWM_IN1=0;
}
if(speed<=0) //当速度减少到0时停车
{
TR1=0;
PWM_IN1=0;
PWM_IN2=0;
}
}
else
{
if(((angle>=11)||(angle<=3))&&(speed_hope[angle]<speed))
{
if(PWM_IN2==1)
{
TL1=speed_d_l;
TH1=0xff;
PWM_IN1=0;
PWM_IN2=0;
}
else
{
TL1=speed_d_h;
TH1=0xff;
PWM_IN1=0;
PWM_IN2=1;
}
}
else
{
if(PWM_IN1==1)
{
TH1=0XFF;
TL1=0x38;
PWM_IN1=0;
PWM_IN2=0;
}
else
{
TH1=0XFF;
TL1=0xff;
PWM_IN1=1;
PWM_IN2=0;
}
}
}
} */
//===========
void Start_Delay(uchar k)
{
int i=4000; //当K为1时定时1S
int j=1000;
for(;k>=0;k--)
for(;i>=0;i--)
for(;j>=0;j--)
;
}
作者:
yudongx
时间:
2009-4-5 15:56
不错不错,谢谢!
作者:
烙铁头
时间:
2009-4-5 20:01
拍手
作者:
xiejunqing
时间:
2009-4-15 12:12
作者:
zzc200640
时间:
2009-4-16 15:23
有点强?
作者:
Michael_Fei
时间:
2009-4-17 16:03
没有硬件图,让观众们看的费劲哦
作者:
FlyCar
时间:
2009-4-19 09:19
鼓掌
作者:
伴月迎风
时间:
2009-4-21 22:36
强
作者:
cj5407101
时间:
2009-5-19 09:32
你好,这程序只包括循迹和铁片检测吗
作者:
zhpan001
时间:
2009-5-20 08:40
有没有硬件图?只看程序确实有点费劲哦。
作者:
张瀚文315
时间:
2009-5-21 20:45
定啊
作者:
阿隆
时间:
2009-6-15 00:05
楼主很厉害哩 我那时候 我用的是汇编语言 主要是觉得 汇编执行的时候比较快一点 比较适合在实时环境中!!!
作者:
寒潭
时间:
2009-7-30 20:22
支持 ! 谢了
作者:
寒潭
时间:
2009-8-4 11:26
请问谁能发个硬件连接图吗? 先谢了。
作者:
jianghusandao
时间:
2009-8-24 00:44
不甚感激!
作者:
断线
时间:
2009-8-28 17:48
作者:
yingdebuzu
时间:
2009-8-30 12:11
作者:
huier225
时间:
2009-8-30 15:23
多谢@!好东西!!!!
作者:
gallen
时间:
2009-9-5 10:50
应该是03年的电子大赛的题目
作者:
xiaokk
时间:
2009-9-6 10:48
能发一下硬件电路图吗?很想学一学!
作者:
MRB
时间:
2010-3-23 00:18
牛人,强啊
作者:
zety
时间:
2010-3-23 13:32
楼主无私奉献!赞!
作者:
dybasyj
时间:
2010-4-3 14:08
hehe!!!111111
作者:
依林
时间:
2010-4-16 10:57
强
作者:
何江健
时间:
2010-4-16 14:55
牛
作者:
一笑天
时间:
2010-4-17 19:15
谢谢
作者:
nanxue1989
时间:
2010-11-8 20:06
作者:
wuhuideren
时间:
2010-11-18 09:01
交流!!
作者:
jinyongxiang
时间:
2010-11-23 19:46
给力
作者:
dangfangchao521
时间:
2010-11-29 13:43
这个 …… 啊
作者:
lnpsilent
时间:
2012-4-9 15:16
顶下
作者:
掩耳倾听
时间:
2015-10-7 10:45
厉害
:):)
欢迎光临 智能车制作 (http://111.231.132.190/)
Powered by Discuz! X3.2