标题:
基于8051单片机的循迹小车 带测速程序
[打印本页]
作者:
Mr.lovable
时间:
2017-7-2 22:50
标题:
基于8051单片机的循迹小车 带测速程序
基于8051单片机的循迹小车
0.png
(37.83 KB, 下载次数: 109)
下载附件
2017-7-3 02:53 上传
单片机源程序如下:
/*
!!!!!!!!!
1.
使用PWM波写驱动程序时,切记PWM波的周期不要太短
(20ms左右应该是可以的!!此程序就是因为pwm波周期太短,烧坏4个驱动,8个电机,多么痛的领悟~~)
2.
因为当时考虑用到超声速壁障,蜂鸣器,红外测速,液晶等多个外设,需要使用多个中断,单个单片机资源不足,
所以此写了两个程序分别写入两个单片机,如果只是使用测速,液晶的话应该可以用中断嵌套的方法写入一个单片机即可。
!!!!!!!!!
*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar b=0xf;
static uint delay=0;//定义接收红外数据变量
static uchar m=0;
//static uint time=1;
uchar signal;
uchar i=0;
uchar persent_l=100;
uchar persent_hl=100;
uchar persent_r=100;
uchar persent_hr=100;
sbit left=P1^3; //定义前方左侧1红外探头
sbit Left_zhong=P1^2; //定义前主左侧2红外探头
sbit right=P1^0; //定义右方1红外探头
sbit right_zhong=P1^1; //定义右方2红外探头
sbit pwm_l=P1^1; //定义电机l正向端口
sbit pwm_hl=P1^2; //定义电机l反向端口
sbit pwm_r=P1^4; //定义电机r正向端口
sbit pwm_hr=P1^5; //定义电机r反向端口
sbit ENA=P1^3;
sbit ENB=P1^0;
void delay1(uchar z)
{
uchar i,j;
for(i=0;i<=100;i++)
for(j=0;j<=z;j++);
}
/*uchar signal()
{
uchar temp=0x0f;
temp&=P0;
return temp;
}*/
void time0_init()
{
EA=1;
TH0=(65536-200)/256;
TL0=(65536-200)%256;
TMOD=1;
ET0=1;
TR0=1;
}
void time0() interrupt 1 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断
{
static uchar time=1;
EA=0;
TH0=(65536-200)/256;
TL0=(65536-200)%256; //0.2ms
if(time<10)
{
if(time<persent_l)
{pwm_l=1;pwm_hl=0;}
else pwm_l=0;
if(time<persent_r)
{pwm_r=1;pwm_hr=1;}
else pwm_r=0;
if(time<persent_hl)
{pwm_hl=1;pwm_l=0;}
else pwm_hl=0;
if(time<persent_hr)
{pwm_hr=1;pwm_r=0;}
else pwm_hr=0;
time++;
}
else
{m++;time=1;if(m==5){delay++;m=0;}} //每2ms m加1 每0.01s delay++;
EA=1;
}
void forward(uchar a)
{
/*pwm_l=0;
pwm_r=0;
pwm_hl=0;
pwm_hr=0;*/
persent_l=11;
persent_r=11;
persent_hl=0;
persent_hr=0;
while(delay<=a);
delay=0;
}
void dun_l(uchar a)
{
/*pwm_l=1;
pwm_r=1;
pwm_hl=0;
pwm_hr=0;*/
persent_l=0;
persent_r=9;
persent_hl=0;
persent_hr=0;
while(delay<=a);
delay=0;
}
void dun_r(uchar a)
{
/* pwm_l=1;
pwm_r=1;
pwm_hl=0;
pwm_hr=0;
*/ persent_l=9;
persent_r=0;
persent_hl=0;
persent_hr=0;
while(delay<=a);
delay=0;
}
void zhi_l(uchar a)
{
/* pwm_l=1;
pwm_r=1;
pwm_hl=0;
pwm_hr=0;
*/ persent_l=0;
persent_hl=4;
persent_r=8;
persent_hl=0;
while(delay<=a);
delay=0;
}
void zhi_r(uchar a)
{
/* pwm_l=1;
pwm_r=1;
pwm_hl=0;
pwm_hr=0;
*/ persent_l=8;
persent_hl=0;
persent_r=0;
persent_hr=4;
while(delay<=a);
delay=0;
}
void rui_l(uchar a)
{
/*pwm_l=0;
pwm_r=1;
pwm_hl=1;
pwm_hr=0;*/
persent_l=0;
persent_hl=0;
persent_r=8;
persent_hr=0;
while(delay<=a);
delay=0;
}
void rui_r(uchar a)
{
/* pwm_l=1;
pwm_r=0;
pwm_hl=0;
pwm_hr=1;
*/ persent_l=8;
persent_hl=0;
persent_r=0;
persent_hr=3;
while(delay<=a);
delay=0;
}
void back(uchar a)
{
/* pwm_l=0;
pwm_r=0;
pwm_hl=1;
pwm_hr=1;
*/ persent_l=0;
persent_r=0;
persent_hl=7;
persent_hr=7;
while(delay<=a);
delay=0;
}
//全白0000 0x0 全黑1111 0xf
//左钝角 0100 0x4 左直角 1100 0xc 左锐角1000 0x8
//右钝角 0010 0x2 右直角 0011 0x3 右锐角0001 0x1
//100是1s
void track()
{
// delay1(10);
// if(i==0)
signal=0xf;
signal&=(P2>>4);
// else signal=b;
switch(signal)
{
case 0x0: {forward(10);break;}
case 0xf: {forward(10);break;}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
循迹小车.zip
(100.77 KB, 下载次数: 38)
2017-7-2 22:49 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2017-7-3 02:57
测速程序:
#include<reg52.h>
//液晶及测速
#define uint unsigned int
#define uchar unsigned char
#define zhouchang 20 //20cm
unsigned int i=0;
sbit P36=P3^6;
sbit beep=P2^0;
unsigned char j;
unsigned int kop;
uchar code table[]="2013 (^_^) 4-17 ";
uchar table1[]=" -I- ";
uchar table2[3];
uchar code haode[16]=" WE ^_^ THE ";
uchar code haode1[16]=" CHAM ARE PION";
uchar code hao[16]= " p_q ^_^ ";
uchar code hao1[16]=" -I- -- -I- ";
uchar flag=1;
uchar time1=0;
//液晶端口
sbit rs = P3^1;//Pin4
//sbit rw= P3^5; //Pin5
sbit lcden = P3^0;//Pin6
uchar time=1;
sbit dula=P2^6; //锁存器控制端定义
sbit wela=P2^7;
uchar num;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
// rw=0;
rs=0;
P1=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
// rw=0;
rs=1;
P1=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_sfm(uchar add,uchar date)
{
write_com(0x80+0x40+add);
write_data(0x30+date);
}
void init()
{
dula=0;
wela=0;
lcden=0;
/*write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x10);
*/
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
void zhongduan_init()
{
EA = 1;
TH0=0x00;
TL0=0x00;
ET0=1;
ET1=1;
TMOD = 0x15;// 打开定时器和计数器T0,因此矩形脉冲输入端接P3.4
TH1=0x3C; //50ms
TL1=0xB0;
TR0 = 1;
TR1 = 1;
}
void main()
{
P2=0xff;
init();
// flag=0;
zhongduan_init();
while(1)
{
if(flag==0)
{
EA=0; //关闭中断
write_com(0x80);
for(num=0;num<15;num++)
{
write_data(table[num]);
delay(20);
}
//速度
write_sfm(1,table1[0]);
write_sfm(2,table1[1]);
write_sfm(3,table1[2]);
//时间
write_sfm(10,table2[0]);
write_sfm(11,table2[1]);
write_sfm(12,table2[2]);
// write_sfm(8,0x73);
flag=1;
EA=1;
// while(1); //开启中断
}
}
}
timer3() interrupt 3 //定时器中断时间到,就读取计数器值 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断
{
TH1=0X3C;
TL1=0XB0;
i++;
if(i==20) //1s才进行技术脉冲值显示,即每秒更新一次速度 这里一会儿要给!!!!!!!!!1
{
time++; //记时间
time1++;
kop=TH0;//计数器计入脉冲,每来一个矩形脉冲计数值加1
kop=kop<<8;
kop=kop+TL0; //kp单位是cm,周长20cm,20个空隙,一个空隙1cm
beep=1;
if(kop>45)
{
beep=0;
}
table1[0]=kop/100; //显示计数器的值即实际测得速度
table1[1]=kop%100/10;
table1[2]=kop%100%10;
table2[0]=time/100; //显示计数器的值即实际测得速度
table2[1]=time%100/10;
table2[2]=time%100%10;
i=0;
TH0=0;//计数器速度获取后清零,进行下次获取
TL0=0;
flag=0;
if(time1==20)
{
write_com(01);
write_com(0x80);
for(num=0;num<15;num++)
{
write_data(haode[num]);
delay(20);
}
write_com(0x80+0x53);
for(num=0;num<15;num++)
{
write_data(haode1[num]);
delay(20);
}
delay(300);
}
if(time1==10)
{
write_com(01);
write_com(0x80);
for(num=0;num<15;num++)
{
write_data(hao[num]);
delay(20);
}
write_com(0x80+0x53);
for(num=0;num<15;num++)
{
write_data(hao1[num]);
delay(20);
}
delay(400);
}
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1