智能小车程序(循迹、数瓶子(正放、倒放)测硬币计算路程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#inclu de<re g52.h>
#de fineuchar unsi gnedchar
#defi ne ui nt un signe d int
sbit h1=P3^0;//左使能端
sbi t h2=P3^1;//右使能端
sb it sg=P3^6;//蜂鸣器
sb it s2=P3^3;//第2红外接近开关
sbi t s1=P0^5;//第1红外接近开关
sbit d1=P3^7;//电机的驱动口
///sbit yb=P1^5;//硬币检查,已经接到中断口P3^2
sb it g1=P0^6;//左对管
sbi t g2=P0^7;//右光电管
sb it g3=P0^4;//中间右对管
s bit g4=P0^3;//中间左对管
sbitrs=P0^0;
s bit r w=P0^1;
sb it e=P0^2;
uch ar ta ble[]={0x11,0x99,0x88,0xc c,0x44,0x66,0x22,0x33};//数组怎么写就看你的步进电机怎么接,步进电机是有2根线两两相通的0x18,0x42,0x24,0x81
ucha r tab le1[]={0x11,0x19,0x18,0x1c,0x14,0x16,0x12,0x13};//右转
uc har t able2[]={0x11,0x91,0x81,0xc1,0x41,0x61,0x21,0x31};//左转
uchar code tabl e3[]="全程时间:秒";//每个汉字2个字节
u charcodetable4[]="所走路程:CM";//每个汉字2个字节
uchar code tabl e5[]="硬币个数: 个";//每个汉字2个字节
uchar code tabl e6[]="饮水瓶数: 个";//每个汉字2个字节
uint i,n,g=10,v=150,s=0,m=0,q=0,l=0,w=0,p=0,f,r=0,y=2;
uint coun t=0,s hi,ge,shi1,ge1,bai,g e2,sh i2,sh i3,ge3;
//uc har y i[]="0123456789"
voi d dis play1(void);
vo id di splay2(voi d);
v oid d ispla y3(vo id);
voiddispl ay4(v oid);
voi d wri te_12864co m(uch ar co m);//写指令
v oid w rite_12864dat(u chardat);//写数据
void init inal(void);//初始化
voi d jis hi(vo id);
voidluche ng(vo id);
voidzhizo u();
voidyingb i();
voi d yin gbi();
voi d shu iping();
//************************************************
//延时函数,在12MHz的晶振频率下
//大约50us的延时
//************************************************
voiddelay_50us(uint z)
{
uin t x,y;
fo r(x=z;x>0;x--)
for(y=110;y>0;y--);
}
v oid d elay_50ms(uintt)//延时函数
{
u int j;
f or(;t>0;t--)
for(j=6245;j>0;j--);
}
/************************主函数****************************/
voi d mai n()
{
in itina l(); //LCM初始化
displ ay1();
displ ay2();
displ ay3();
displ ay4();
luche ng();
y ingbi();
shu iping();
jis hi();
TMOD=0x01;//选择定时模式,方式1,16为定时/计数,最大计数65536 T H0=(65536-10000)/256;
TL0=(65536-10000)%256;//给定时器0付初值10ms
E A=1;//打开总中断开关
PT0=1;//设计to为最高级中断
EX0=1;//允许外部中断
IT0=1;//等于1时候是地电平跳变时触发,等于0时候是低电平
EX1=1;//允许外部中断
IT1=1;//等于1时候是地电平跳变时触发,等于0时候是低电平
E T0=1;//开启定时/计数0中断
TR0=1;//启动定时/计
whi le(1)
{
EX0=1;//开启中断0,为下次中断做准备
d1=1;//关掉继电器
s g=1;//关掉蜂鸣器
zhiz ou();
for(f=0;f<8;f++)
{
P1=t able[f];
n++;//每给一个脉冲n自加一,轮子转一圈要给24x8=192个脉冲 q++;//计算路程变量
d elay_50us(g);//15
}
if(s>=6)//当转过9个直角,就到检测瓶子这时候减慢速度
{
g=30;
}
}
}
/************************计时函数****************************/
voidjishi(void)
{
shi=m/10;
g e=m%10;
w rite_12864com(0x85);//写地
址、、、、、、、、、、、、、、、、、、、、、、、
write_12864dat(0x30+shi);
wri te_12864da t(0x30+ge);
del ay_50ms(1);
}
/************************计算路程函数****************************/
v oid l uchen g(voi d)
{
l=q/9.6;//每执行主程序一次就得到8个脉冲,循环24次就有8*24=192个脉冲,刚好是一圈20c m,192/20=9.6,即一厘米要9.6个脉冲
bai=l/100;
shi1=l%100/10;
ge1=l%100%10;
wr ite_12864c om(0x95);//写地
址、、、、、、、、、、、、、、、、、、、、、、、
w rite_12864dat(0x30+b ai);
writ e_12864dat(0x30+shi1);
w rite_12864dat(0x30+g e1);
dela y_50m s(1);
}
/************************计算硬币函数****************************/ v oid y ingbi()
{
shi2=w/10;
ge2=w%10;
writ e_12864com(0x8d);//写地
址、、、、、、、、、、、、、、、、、、、、、、、
wri te_12864da t(0x30+shi2);
write_12864dat(0x30+ge2);
de lay_50ms(1);
}
/************************计算水瓶函数****************************/ v oid s huipi ng()
{
shi3=p/10;
ge3=p%10;
write_12864com(0x9d);//写地
址、、、、、、、、、、、、、、、、、、、、、、、
writ e_12864dat(0x30+shi3);
w rite_12864dat(0x30+g e3);
del ay_50ms(1);
}
/************************循迹函数****************************/
voi d zhi zou()
{
uint a=30;//给21给脉冲刚好转一圈少一点,刚好能转
if(g1==0&&g2==0)//没有偏离,前进
{
h1=1;
h2=1;
}
if(g1==1&&g2==0)//偏右,向左开
{
h1=0;
h2=1;
}
if(g1==0&&g2==1)//偏zuo,向左you开
{
h1=1;
h2=0;
}
if(g3==0) //右对管遇到黑线,输出低电平,右转转90度{
h1=1;
h2=1;
sg=0; //蜂鸣器的9012三极管给基集给低电平导通
wh ile(a--)
{
f or(i=0;i<8;i++)//只让一个轮子转
{
P1=ta ble2[i];
de lay_50us(20);
}
if(g1==1)
{
a=0;
}
}
s++;//转一个直角自变量自加一
sg=1;//关闭蜂鸣器
}
i f(g4==0)//左对管遇到黑线,输出低电平,左转
{
h1=1;
h2=1;
sg=0;
whi le(a--)
{
f or(i=0;i<8;i++)
{
P1=t able1[i];
d elay_50us(20);//转弯时适当延时有利于光电传感器反应, }
i f(g2==1)
{a=0;
}
}
s++;
s g=1;
}
}
/************************中断0函数(测硬币)****************************/
void int0() in terru pt 0//外部中断0,用检测硬币来触发,每当金属接近快关遇到金属就输出低电平
{
h1=0;
h2=0;
w++; //计算硬币自变量
sg=0; //启动蜂鸣器
d elay_50ms(10);
sg=1; //关闭蜂鸣器
yingb i();//显示硬币个数
jish i();//显示时间
l uchen g();//显示路程
h1=1;//开始走动
h2=1;
EX0=0; //跳出中断0
}
/************************中断1函数(测水瓶)****************************/ vo id in t1()inter rupt2//外部中断0,第二个红外对管,水瓶计算
{
EX1=0;
//重新打开准备下次中断
h1=0;
h2=0;
sg=0;
//启动蜂鸣器
del ay_50ms(20);//延时1s
sg=1;//关闭蜂鸣器
if(s1==0&&s2==0)
{ h1=1;
h2=1;
p++;
}
i f(s1==1&&s2==0)
{
d1=0;
//whil e(s2==0);
del ay_50ms(20);
//sg=1;//关闭蜂鸣器
d1=1;
de lay_50ms(20);
p++;
//d elay_50ms(10);
}
luc heng();
jish i();
sh uipin g();
h1=1;
h2=1;
//d elay_50ms(10);
EX1=1;
}
/************************定时器中断0函数(测时
间)****************************/
v oid t imer1() in terru pt 1//定时/计数器中断0重新给计数器赋值{
TH0=(65536-10000)/256;
T L0=(65536-10000)%256;//定时10ms
coun t++;r++;
if(coun t==100)//如果超出90s小车则停车
{
m++;
c ount=0;
}
if(r==9000|n>3700)
{h1=0;
h2=0;
luche ng();
j ishi();
shui ping();
}
}
voi d wri te_12864co m(uch ar co m)//写指令
{
rw=0;
rs=0;//rs=0时是写指令;
delay_50us(1);
P2=com;
e=1;
d elay_50us(10);
e=0;
d elay_50us(2);
}
/* ***液晶函数**************/
voidwrite_12864dat(uchar dat)//写数据
{
rw=0;
rs=1;//rs=1时是写指令s hu ju;
d elay_50us(1);
P2=d at;
e=1;
de lay_50us(10);
e=0;
de lay_50us(2);
}
voidiniti nal(v oid)//液晶初始化
{
dela y_50m s(2);
wr ite_12864c om(0x38);
del ay_50us(4);
w rite_12864com(0x0c);
de lay_50us(4);
// wr ite_12864c om(0x0f);//显示开关
//de lay_50us(4);
writ e_12864com(0x01);//清除显示
del ay_50us(240);
wri te_12864co m(0x06);//模式设计
del ay_50us(10);
wr ite_12864c om(0x80);//整板显示 de lay_50us(10);
}
/********显示函数*********/
void disp lay1(void)//显示1
{
u chari;
wr ite_12864c om(0x80);
dela y_50u s(1);
for(i=0;table3[i]!='\0';i++)
{
wr ite_12864d at(ta ble3[i]);
del ay_50us(1);
}
}
void disp lay2(void)//显示2
{
uchar b;
write_12864com(0x90);
delay_50us(1);
f or(b=0;tab le4[b]!='\0';b++) { w rite_12864dat(t able4[b]);
delay_50us(1);
}
}
void disp lay3(void) //显示3
{
ucha r h;
writ e_12864com(0x88);
dela y_50u s(1);
for(h=0;ta ble5[h]!='\0';h++) {write_12864dat(table5[h]);
dela y_50u s(1);
}
}
vo id di splay4(voi d) //显示4
{
u charh;
w rite_12864com(0x98);
d elay_50us(1);
fo r(h=0;tabl e6[h]!='\0';h++) { wr ite_12864d at(ta ble6[h]);
d elay_50us(1);
}
}
。