智能小车程序(循迹、数瓶子(正放、倒放)测硬币计算路程_第1页
智能小车程序(循迹、数瓶子(正放、倒放)测硬币计算路程_第2页
智能小车程序(循迹、数瓶子(正放、倒放)测硬币计算路程_第3页
智能小车程序(循迹、数瓶子(正放、倒放)测硬币计算路程_第4页
智能小车程序(循迹、数瓶子(正放、倒放)测硬币计算路程_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit h1=P30;/左使能端 sbit h2=P31;/右使能端 sbit sg=P36;/蜂鸣器sbit s2=P33;/第2红外接近开关sbit s1=P05;/第1红外接近开关sbit d1=P37;/电机的驱动口/sbit yb=P15;/硬币检查,已经接到中断口P32sbit g1=P06;/左对管sbit g2=P07;/右光电管 sbit g3=P04;/中间右对管sbit g4=P03;/中间左对管sbit rs=P00;s

2、bit rw=P01;sbit e=P02;uchar table=0x11,0x99,0x88,0xcc,0x44,0x66,0x22,0x33;/数组怎么写就看你的步进电机怎么接,步进电机是有2根线两两相通的0x18,0x42,0x24,0x81uchar table1=0x11,0x19,0x18,0x1c,0x14,0x16,0x12,0x13;/右转uchar table2=0x11,0x91,0x81,0xc1,0x41,0x61,0x21,0x31;/左转uchar code table3="全程时间: 秒"/每个汉字2个字节uchar code table4

3、="所走路程: CM"/每个汉字2个字节uchar code table5="硬币个数: 个"/每个汉字2个字节uchar code table6="饮水瓶数: 个"/每个汉字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 count=0,shi,ge,shi1,ge1,bai,ge2,shi2,shi3,ge3; /uchar yi="0123456789"void display1(void);void display2(void);

4、void display3(void);void display4(void);void write_12864com(uchar com);/写指令void write_12864dat(uchar dat);/写数据void initinal(void);/初始化void jishi(void);void lucheng(void);void zhizou();void yingbi(); void yingbi();void shuiping(); /*/延时函数,在12MHz的晶振频率下/大约50us的延时/*void delay_50us(uint z)uint x,y;for(x=

5、z;x>0;x-)for(y=110;y>0;y-);void delay_50ms(uint t)/延时函数 uint j; for(;t>0;t-) for(j=6245;j>0;j-); /*主函数*/ void main() initinal(); /LCM初始化 display1(); display2(); display3(); display4(); lucheng(); yingbi(); shuiping(); jishi(); TMOD=0x01;/选择定时模式,方式1,16为定时/计数,最大计数65536TH0=(65536-10000)/256

6、;TL0=(65536-10000)%256;/给定时器0付初值10ms EA=1;/打开总中断开关PT0=1;/设计to为最高级中断 EX0=1;/允许外部中断 IT0=1;/等于1时候是地电平跳变时触发,等于0时候是低电平EX1=1;/允许外部中断 IT1=1;/等于1时候是地电平跳变时触发,等于0时候是低电平ET0=1;/开启定时/计数0中断TR0=1;/启动定时/计 while(1) EX0=1;/开启中断0,为下次中断做准备 d1=1;/关掉继电器 sg=1;/关掉蜂鸣器 zhizou();for(f=0;f<8;f+) P1=tablef; n+;/每给一个脉冲n自加一,轮子

7、转一圈要给24x8=192个脉冲 q+;/计算路程变量 delay_50us(g);/15 if(s>=6)/当转过9个直角,就到检测瓶子这时候减慢速度 g=30; /*计时函数*/ void jishi(void) shi=m/10; ge=m%10; write_12864com(0x85);/写地址、 write_12864dat(0x30+shi); write_12864dat(0x30+ge); delay_50ms(1);/*计算路程函数*/ void lucheng(void) l=q/9.6;/每执行主程序一次就得到8个脉冲,循环24次就有8*24=192个脉冲,刚好是

8、一圈20cm,192/20=9.6,即一厘米要9.6个脉冲 bai=l/100; shi1=l%100/10; ge1=l%100%10; write_12864com(0x95);/写地址、 write_12864dat(0x30+bai); write_12864dat(0x30+shi1); write_12864dat(0x30+ge1); delay_50ms(1); /*计算硬币函数*/ void yingbi()shi2=w/10;ge2=w%10; write_12864com(0x8d);/写地址、 write_12864dat(0x30+shi2); write_12864

9、dat(0x30+ge2); delay_50ms(1); /*计算水瓶函数*/ void shuiping() shi3=p/10;ge3=p%10; write_12864com(0x9d);/写地址、 write_12864dat(0x30+shi3); write_12864dat(0x30+ge3); delay_50ms(1); /*循迹函数*/ void zhizou() uint a=30;/给21给脉冲刚好转一圈少一点,刚好能转 if(g1=0&&g2=0)/没有偏离,前进 h1=1; h2=1; if(g1=1&&g2=0)/偏右,向左开 h

10、1=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三极管给基集给低电平导通 while(a-) for(i=0;i<8;i+)/只让一个轮子转 P1=table2i; delay_50us(20); if(g1=1) a=0; s+;/转一个直角自变量自加一 sg=1;/关闭蜂鸣器 if(g4=0)/左对管遇到黑线,输出低电平,左转 h1=1; h2=1; sg=0; while(a-) for(i=0;i&l

11、t;8;i+) P1=table1i; delay_50us(20);/转弯时适当延时有利于光电传感器反应, if(g2=1) a=0; s+; sg=1; /*中断0函数(测硬币)*/ void int0() interrupt 0/外部中断0,用检测硬币来触发,每当金属接近快关遇到金属就输出低电平 h1=0; h2=0; w+; /计算硬币自变量 sg=0; /启动蜂鸣器 delay_50ms(10); sg=1; /关闭蜂鸣器 yingbi();/显示硬币个数 jishi();/显示时间 lucheng(); /显示路程 h1=1;/开始走动 h2=1; EX0=0; /跳出中断0 /*

12、中断1函数(测水瓶)*/ void int1() interrupt 2/外部中断0,第二个红外对管,水瓶计算 EX1=0; /重新打开准备下次中断 h1=0; h2=0; sg=0; /启动蜂鸣器 delay_50ms(20);/延时1s sg=1;/关闭蜂鸣器 if(s1=0&&s2=0) h1=1; h2=1;p+; if(s1=1&&s2=0) d1=0; /while(s2=0); delay_50ms(20); /sg=1;/关闭蜂鸣器 d1=1; delay_50ms(20); p+; /delay_50ms(10); lucheng(); jis

13、hi(); shuiping(); h1=1; h2=1; /delay_50ms(10); EX1=1; /*定时器中断0函数(测时间)*/ void timer1() interrupt 1 /定时/计数器中断0重新给计数器赋值 TH0=(65536-10000)/256;TL0=(65536-10000)%256;/定时10mscount+;r+; if(count=100)/如果超出90s小车则停车 m+; count=0; if(r=9000|n>3700) h1=0; h2=0; lucheng(); jishi(); shuiping(); void write_12864

14、com(uchar com)/写指令 rw=0; rs=0;/rs=0时是写指令; delay_50us(1); P2=com; e=1; delay_50us(10); e=0; delay_50us(2); /* * 液晶函数 */void write_12864dat(uchar dat)/写数据 rw=0; rs=1;/rs=1时是写指令shu ju; delay_50us(1); P2=dat; e=1; delay_50us(10); e=0; delay_50us(2);void initinal(void)/液晶初始化 delay_50ms(2); write_12864com

15、(0x38); delay_50us(4); write_12864com(0x0c); delay_50us(4); / write_12864com(0x0f);/显示开关 /delay_50us(4); write_12864com(0x01);/清除显示 delay_50us(240); write_12864com(0x06);/模式设计 delay_50us(10); write_12864com(0x80);/整板显示 delay_50us(10);/* 显示函数*/void display1(void)/显示1 uchar i; write_12864com(0x80);delay_50us(1);for(i=0;table3i!='0'i+) write_12864dat(table3i);delay_50us(1); void display2(void)/显示2 uchar b; write_12864com(0x90); delay_50us(1); for(b=0;table4b!='0'b+) write_12864dat(table4b);delay_50us(1); void display3(void) /显示3 uchar h;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论