红外遥控小车的c程序.docx

上传人:啊飒飒 文档编号:10352323 上传时间:2021-05-11 格式:DOCX 页数:8 大小:18.23KB
返回 下载 相关 举报
红外遥控小车的c程序.docx_第1页
第1页 / 共8页
红外遥控小车的c程序.docx_第2页
第2页 / 共8页
红外遥控小车的c程序.docx_第3页
第3页 / 共8页
红外遥控小车的c程序.docx_第4页
第4页 / 共8页
红外遥控小车的c程序.docx_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《红外遥控小车的c程序.docx》由会员分享,可在线阅读,更多相关《红外遥控小车的c程序.docx(8页珍藏版)》请在三一文库上搜索。

1、#include#include#include#define uchar unsigned char /数据类型#define uint unsigned intsbit hwx=P33;uchar key;uchar l_lhj66;/定义66位数组变量来存储接收的时间参数uchar ledmap10=0x3f, 0x06 , 0x5b, 0x4f, 0x66, 0x6d,0x7d;/*sbit ENa=P24; /* L298的Enable A sbit ENb=P27; /* L298的Enable B sbit IN1=P22; /* L298的Input 1 sbit IN2=P2

2、3; /* L298的Input 2 sbit IN3=P25; /* L298的Input 3 sbit IN4=P26; /* L298的Input 4 uchar t=0; /* 中断计数器 uchar m1=0; /* 电机1速度值 uchar m2=0; /* 电机2速度值 uchar tmp1,tmp2; /* 电机当前速度值 /*/函数定义void Init8952( ) ; /初始化AT89C52单片机void Move_Fo( ) ; / 小车向前运动void Move_Ba( ) ; / 小车向后运动void Move_Le( ) ; / 小车向左运动void Move_R

3、i( ) ; / 小车向右运动 void Stop( ); / 小车停止void Move_Qi(); /小车加速运动void Move_Sl();/小车减速运动void Delay(uchar n) ;/ 延时n 毫秒void Delay1(void); /空5个指令void Motor(uchar index , char speed);/控制小车速度void Car_Action();/*/延时/*void Delay(uchar n) uchar i; while(n-) for (i=0;i=-100 & speed=100) if(index=1) / 电机1的处理 m1=abs(

4、speed); / 取速度的绝对值 if(speed0) / 速度值为负则反转 IN1=0; IN2=1; else / 不为负数则正转 IN1=1; IN2=0; if(index=2) / 电机2的处理 m2 = abs(speed); / 电机2的速度控制 if(speed0) / 电机2的方向控制 IN3 = 0; IN4 = 1; else IN3 = 1; IN4 = 0; /*void Move_Fo( ) / 小车向前运动P1 = ledmap1; Motor(1,40);Delay(250) ; void Move_Ba( ) / 小车向后运动P1 = ledmap2;Mot

5、or(1,-40) ; Delay(250) ;void Move_Le( ) / 小车向左运动 P1 = ledmap3; /Motor(1,40);Motor(2,90);Delay(30) ;Motor(1,80);Delay(50) ;void Move_Ri( ) / 小车向右运动 P1 = ledmap4;Motor(2,-90);Delay(30) ;/Delay(250) ;Motor(1,80); Delay(50) ;void Move_Qi( ) /加速uchar i;P1 = ledmap5;for(i=40;i0;j-=8)Motor(1,j);Delay(250)

6、;Delay(250) ; void Stop( ) /小车停止P1 = ledmap0;IN1 = IN2;IN3 = IN4;void Car_Action() /判断红外线信号小车响应运动 switch( key ) case 0x03: /暂停 Stop( ) ; break ; case 0x01: /前进 Move_Fo() ;break; case 0x02: / 后退 Move_Ba() ;break; case 0x04: / 左转 Move_Le() ;break; case 0x05: / 右转 Move_Ri() ;break; case 0x06: /快速运行 Mov

7、e_Qi( ) ; break ; case 0x07: Move_Sl( ) ;break ;/减速/*/主函数 void main( ) /Delay(100) ;Init8952( ); while(1) Car_Action();/Delay(10) ; /*/定时器0 中断函数void timer0( ) interrupt 1 / T0中断服务程序 if(t=0) / 1个PWM周期完成后才会接受新数值 tmp1 = m1 ; tmp2 = m2 ; if(ttmp1) ENa = 1 ; else ENa = 0 ; / 产生电机1的PWM信号 if(t=100) / 1个PWM

8、信号由100次中断产生 t = 0 ; /*void hongwai(void) interrupt 2 /外部中断 1 ,INT1(P33)连接红外线接收IC数据脚uchar i,j,tmp;EX1=0;j=33;/传送一组数包括引导码1位,地址码8位加反码8位,指令码8位加反码8位,总共33位i=0;/从第一维数组开始tmp=100;/加八延时,while(tmp)tmp-;if(hwx) /然后再检测红线接收脚是有数据招收,有继续,没有则退出EX1=1;return;while(j) /循环接收33位数据,为何我们用到66位数组,我们可以不接收高电平时间常数,只接低电平常数就 /可以判断

9、1或0了,在这里我们都接收,为串口调试软件接收计算波形 /还有一点要知道,接收波形是反向,在没有接收时端口为高电平tmp=0;l_lhji=1;/时间量从1开始while(!hwx)/检测高低电平的变化l_lhji+;/没变继续加1Delay1();/加入延时,是因为我们采用8位二进来存储,如果不加延时,时间量将计满tmp+;/此变量为防止干扰带来的死循环if(tmp=250)break;i+;tmp=0;l_lhji=1;/时间量从1开始while(hwx)/检测高低电平的变化l_lhji+;/没变继续加1Delay1();/同上tmp+;if(tmp=250)break;i+;j-;i=255;/加入循环延时,抗干扰while(i)tmp=255;while(tmp)tmp-;i-;tmp=0;for(i=3;i=1;/右移一位,接收低电平在前if(l_lhji30)/检测低电平时间超过30就确认为1tmp+=0x80;tmp=0;for(i=35;i=1;if(l_lhji30)tmp+=0x80;key=tmp;EX1=1;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1