遥控玩具汽车(附源码)
- 格式:doc
- 大小:135.00 KB
- 文档页数:2
智能小车循迹、避障、红外遥控C语言代码//智能小车避障、循迹、红外遥控 C 语言代码// 实现功能有超声波避障,红外遥控智能小车,红外传感器实现小车自动循迹, 1602 显示小车的工作状态,另有三个独立按键分别控制三种状态的转换// 注:每个小车的引脚配置都不一样,要注意引脚的配置,但是我的代码注释比较多,看起来比较容易一点#include <> #include <> #include"" #include <> #define uchar unsigned char #define uint unsigned int uchar ENCHAR_PuZh1[8]=" uchar ENCHAR_PuZh2[8]=" uchar ENCHAR_PuZh3[8]=" uchar ENCHAR_PuZh4[8]=" uchar ENCHAR_PuZh5[8]=" run back stop left right "; ";//1602 显示数组H. H. H. uchar ENCHAR_PuZh6[8]=" xunji "; uchar ENCHAR_PuZh7[8]=" bizhang"; uchar ENCHAR_PuZh8[8]=" yaokong"; #define HW P2 #define PWM /****************************** P1 //红外传感器引脚配置P2k 口/* L298N 管脚定义*/ 超声波引脚控制******************************/ sbit ECHO=P3A2; sbit TRIG=P3A3;///// 红外控制引脚配置 sbit sbituchar KEY2=P3A7; KEY 仁 P3M;state_total=3,state_2=0;// 2 为红外遥控 ucharuchar time_1 uchar 局变量 // 超声波接收引脚定义 // 超声波发送引脚定义// 红外接收器数据线 // 独立按键控制总状态控制全局变量 state_1,DAT; // 红外扫描标志位time_1=0,time_2=0;// 定时器1 中断全局变量控制转弯延时计数也做延时一次time,timeH,timeL,state=0;// 超声波测量缓冲变量count=0;//1602 显示计数兼红外遥控按键state_total =2 兼循迹按键state_total= 0 自动避障 state_total=10 为自动循迹模块 1 为自动避障模块 time_ 2 控制 PWM 脉冲计数state 为超声波状态检测控制全uint /**************************/ unsigned char IRC0M[7]; // 红外接收头接收数据缓存unsigned char Number,distance[4],date_data[8]={0,0,0,0,0,0,0,0}; /********* voidvoid voidIRC0M[2 ]存放的为数据 // 红外接收缓存变量 **/ IRdelay(char x); //x* 红外头专用 delay run(); back();void stop(); void left_90(); void left_180(); void right_90(); void delay(uint dat); //void init_test();void delay_100ms(uint ms) ;void display(uchar temp); void bizhang_test(); void xunji_test(); void hongwai_test();void Delay10ms(void);void init_test()// 定时器 0{ 1 外部中断 // 超声波显示驱动 0 1 延时初始化 TMOD=0x11; TH1=0Xfe; TL1=0x0c; TF0=0; TF1=0; ET0=1; ET1=1; EA=1;// 设置定时器 0 1 // 装入初值定时一次为工作方式 1 16 位初值定时器2000hz// 定时器 // 定时器 // 允许定时器// 允许定时器 0 方式 1 计数溢出标志 1 方式 1 计数溢出标志 0 中断溢出 1 中断溢出//开总中断 if(state_total==1)// 为超声波模块时初始化 {TRIG=0; ECHO=0; EX0=0; IT0=1;}if(state_total==2)// 发射引脚低电平 // 接收引脚低电平 // 关闭外部中断// 由高电平变低电平,触发外部中断 0// 红外遥控初始化{ IT1=1; EX1=1;TRIG=1;}del ay(60);} void main(){ uint i; delay(50); init_test(); TR1=1; LCD1602_Init() ; delay(50); while(state_2==0)// 外部中断 1 为负跳变触发 // 允许外部中断 1 // 为高电平 I/O 口初始化// 等待硬件操作// 开启定时器 1{if(KEY1==0){Delay10ms(); // 消除抖动 if(KEY1==0) {state_total=0; // 总状态定义 0 为自动循迹模块 1 为自动避障模块2 为红外遥控while((i<30)&&(KEY1==0))// 检测按键是否松开{Delay10ms(); i++;}i=0;}}if(TRIG==0){while((i<30)&&(TRIG==0))// 检测按键是否松开{Delay10ms(); i++;}i=0;}if(KEY2==0){while((i<30)&&(KEY2==0))// 检测按键是否松开{Delay10ms(); i++; }i=0;// 检测按键 s1 是否按下//检测按键s2是否按下障模块Delay10ms(); // 消除抖动 if(TRIG==0) { state_total=1; 2 为红外遥控//总状态定义 0 为自动循迹模块 1 为自动避// 检测按键 s3 是否按下障模块Delay10ms(); // 消除抖动 if(KEY2==0) { state_total=2; 2 为红外遥控// 总状态定义 0 为自动循迹模块1 为自动避}}} init_test();delay(50); // 等待硬件操作50us TR1=0; // 关闭定时器 1 if(state_total==1) {//SPEED=90; bizhang_test();} if(state_total==0) {// SPEED=98; 电平// 自动循迹速度控制// 自动循迹速度控制高电平持续次数占空比为10 的低电平高电平持续次数占空比为40 的低xunji_test(); }if(state_total== 2){//SPEED=98; // 自动循迹速度控制高电平持续次数占空比为40 的低电平hongwai_test(); }void 断号init0_suspend(void)2 外部中断0 4 串口中断外部中断 1timeH=TH0;timeL=TL0;state=1;EX0=0;}void 断号0{if(state_total==1) { TH0=0X00;TL0=0x00;}if(state_total==0) { TH0=0Xec;TL0=0x78;time_1++;interrupt 0 //3 为定时器 1 的中断号 1 定时器0 的中// 记录高电平次数//// 标志状态为// 关闭外部中断1,表示已接收到返回信号//3 为定时器 1 的中断号2 外部中断0 4 串口中断time0_suspend0(void) interrupt 1外部中断 1// 自动避障初值装入// 装入初值// 自动循迹初值装入// 装入初值定时一次200hz// 控制转弯延时计数1 定时器0 的中}}void IR_IN(void){unsigned char j,k,N=0;EX1 = 0; IRdelay(5); if (TRIG==1) { EX1 =1; return;}//确认IR 信号出现//等IR 变为高电平,跳过 9ms 的前导低电平信号。
上次成功实现了通过笔记本电脑蓝牙来控制智能小车机器人的运动,但是通过电脑控制毕竟不方便,于是乎~本人打算将控制程序移植到手机上。
目前主流的手机操作系统有塞班、安卓(Android)、Windows Mobile,对比了一下,首先,塞班是用C++写的,这么多门语言我唯独看到C++就头大···,放弃了···,Windows Moblie 其实和之前发的电脑端程序基本是一样的,也就没什么意思了,最后决定选择目前正火的Android手机作为控制平台。
Android是个开源的应用,使用Java语言对其编程。
于是这次的开发我选用Eclipse作为开发工具,用Java语言开发手机端的控制程序,由于之前对Android的蓝牙通信这块涉及不多,一开始感觉有点小茫然,而网上也少有这方面的例程,有少数人做出了类似的东西,但是只传了个视频装X!雪特····经过几天的研究,最终确定了手机蓝牙通信其实就是Socket编程,再经过一番编写和调试,昨晚终于大功告成!这是视频:下面开始介绍Android手机端控制程序的编写:首先打开Eclipse,当然之前的Java开发环境和安卓开发工具自己得先配置好,这里就不多说了,网上教程一大摞。
然后新建一个Android项目,修改布局文件main.xml,代码如下:<?xml version="1.0" encoding="utf-8"?><AbsoluteLayoutandroid:id="@+id/widget0"android:layout_width="fill_parent"android:layout_height="fill_parent"xmlns:android="/apk/res/android"><Buttonandroid:id="@+id/btnF"android:layout_width="100px"android:layout_height="60px"android:text="前进"android:layout_x="130px"android:layout_y="62px"></Button><Buttonandroid:id="@+id/btnL"android:layout_width="100px"android:layout_height="60px"android:text="左转"android:layout_x="20px"android:layout_y="152px"></Button><Buttonandroid:id="@+id/btnR"android:layout_width="100px"android:layout_height="60px"android:text="右转"android:layout_x="240px"android:layout_y="152px"></Button><Buttonandroid:id="@+id/btnB"android:layout_width="100px"android:layout_height="60px"android:text="后退"android:layout_x="130px"android:layout_y="242px"></Button><Buttonandroid:id="@+id/btnS"android:layout_width="100px"android:layout_height="60px"android:text="停止"android:layout_x="130px"android:layout_y="152px"></Button></AbsoluteLayout>这个布局文件的效果就是如视频中所示的手机操作界面。
多功能电动智能小车学院:电子科学与工程学院一引言1.作品设计的目的:本次设计智能小车的目的是为了实践电路设计的方法和技巧,将书本中的理论知识运用到实践中去,做到活学活用,深入了解电子元器件及其他元器件的基本用途和使用方法,并且能够灵活快速的判断电路中出现的故障,学会独立设计电路,积累更多的设计经验,加强并掌握焊接的能力和技巧,完成预期的要求。
2.作品设计的意义:智能小车实质上是众所周知的简易机器人雏形。
机器人设计是一个极富挑战性的高技术密集型项目,融小车机械、机器人学、机电一体化、单片机、数据融合、精密仪器、实时数字信号处理、图象处理与图象识别、知识工程与专家系统、决策、轨迹规划、自组织与自学习理论、多智能体协调、以及无线通讯等理论和技术于一体,既是典型的智能机器人系统,又为研究发展多智能体系统、多机器人之间的合作与对抗提供了生动的研究模型。
机器人设计通过提供标准任务,使研究人员利用各种技术来获得最佳解决方案。
机器人设计所采用的理论与技术可应用于工业生产、自动化流水线、救援、教育等领域,从而有效推动国家科学技术等其他高、精、尖领域的发展本小组本次研制的多功能智能小车具有寻迹、避障、消防和转向指示功能,可用与探测火源以及到某些人类不便接近的地点执行特殊任务,同时也是在机器人研究领域做一次大胆尝试。
3简易智能小车的原理:以单片机为电路的中央处理器来处理传感器采集到的数据,处理完毕后通过电机驱动电路来驱动电机。
电源部分为整个电路模块提供动力。
整体电路共分为七个部分:MCU控制电路、电机驱动电路、电源供电电路、寻迹检测电路、避障检测电路、LED显示部分,探测火源与灭火部分。
二总体方案设计(1)电动车车体的选择方案一:自制小车。
可在车模店选购配件组装,或者自行加工。
优点:这种方法能够制作出完全符合自身设计意图的车体。
缺点:需要较多时间和高水平的加工工艺。
方案二:配置成品的玩具电动小汽车。
优点:较方便。
缺点:不完全符合使用要求,需要做大量修改。
基于51单片机的四驱无线遥控小车(附电路图,源代码)遥控小车大家都玩过,网上也有各种DIY小车的制作详解,本文介绍的这个遥控小车和其他的作品大同小异,但作为单片机设计,这次设计主要强调单片机控制,就是说,这个小车是由单片机控制的,把单片机按键发送程序、无线模块使用、电机驱动是本教程的核心内容。
一硬件组装1 小车运动部分所需工件:直流电机4个,L293D电机驱动模块,蓄电池一块,车身底盘说明:车身底盘大家根据自己的购买力自行购买,蓄电池也是,至于L293D模块,淘宝上卖的比较贵,不过我用的就是成品模块,效果非常好,钱不多的同学可以自己买芯片,自制模块,原理很简单,官方资料是很详细的;或者改为继电器控制都可以,具体看自己的实际购买力。
用模块的好处是,模块可以输出5V 电源给系统供电,详细请参考淘宝网。
如果你买的是现成的底盘,那就和我的一样了,组装实在是没啥可说的,把电机固定上去就是,不行?别开玩笑了,小学生都会的!至于想自己做底盘的,我想说,要搞结实点,咱这次的小车马力是很足的,因为有电机驱动,速度比较快(不带减速齿轮的底盘一定要小心,速度非常的快),后劲也足,不小心撞墙很正常,所以不好的底盘就得小心了!组装好后,就是电机和驱动模块的接线了,下面我就详细的说一下L293D模块的使用:L293D是专门的电机驱动芯片,工作电压5V,驱动电压输入可达36V,输出电流正负600ma,4个控制端,4个输出端,原理如图:其中A为输出控制端,Y为输出控制端,1A即控制1Y,以此类推。
1,2EN 3,4EN需要短接,芯片最大工作电压不得超过7V。
封装图:Vcc1接工作电压,5V,Vcc2接电机的驱动电源,一般来说,这个电压要比5V 高,我用的是12V蓄电池,就把12v的正极接到VCC2,要记住的是,芯片、单片机、蓄电池电源是需要共地的,不要觉得你电机是12V,单片机控制部分是5V就把电源完全独立开来,正极是完全独立的没错,但是GND(负极)都必须是接在一起的。
/*预处理命令*/#include<reg52.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件#define uchar unsigned char#define uint unsigned int#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};sbit IRIN=P3^2; //红外接收器数据线sbit LCD_RS = P0^7;sbit LCD_RW = P0^6;sbit LCD_EN = P0^5;uchar begin[]={"My car!"};uchar cdis1[]={"jiansu!"};uchar cdis2[]={"qianjin!"};uchar cdis3[]={"jiasu!"};uchar cdis4[]={"zuozhuang!"};uchar cdis5[]={"STOP!"};uchar cdis6[]={"youzhuan!"};uchar cdis8[]={"daoche!"};sbit M1 = P1^0;sbit M2 = P1^1;sbit M3 = P1^2;sbit M4 = P1^3;sbit EN12 = P1^4;sbit EN34 = P1^5;uchar IRCOM[7];uchar m,n;uchar t=2;uchar g;uchar code digit[]={"0123456789"};uint v;uchar count;bit flag;void delayxms(uchar t);void delay(unsigned char x) ;void delay1(int ms);void motor();void lcd_display();/*检查LCD忙状态lcd_busy为1时,忙,等待。
资料范本本资料为word版本,可以直接编辑和打印,感谢您的下载智能小车源代码地点:__________________时间:__________________说明:本资料适用于约定双方经过谈判,协商而共同承认,共同遵守的责任与义务,仅供参考,文档可直接下载或修改,不需要的部分可直接删除,使用时请详细阅读内容#include<reg51.H>#include <intrins.h>//#include"lcd.h"sbit TX=P2^7;sbit RX=P2^6;sbit PWM=P1^4;sbit Beep=P3^7;sbit led1=P3^3;sbit led2=P3^4;sbit led3=P3^5;/***********蓝牙切换按键**********/sbit k1=P3^6;/***自定义一些数据,注意这些数据对应“51智能车蓝牙无线遥控.exe”软件上的数据设置**/#define leftdata 0x11#define rightdata 0x22#define forwarddata 0x33#define backdata 0x44#define stopdata 0x55#define uchar unsigned char#define uint unsigned intunsigned char receiveData,high_velosity,low_velosity;void UsartConfiguration();/***********电机端口定义************************/sbit IN1=P1^0; //为高电平时,左电机后转sbit IN2=P1^1; //为高电平时,左电机正转sbit IN3=P1^2; //为高电平时,右电机正转sbit IN4=P1^3; //为高电平时,右电机后转/**************无线遥控模块定义****************/sbit Key_A = P2^0; //B键信号端对应D0 sbit Key_B = P2^1; //D键信号端对应D1 sbit Key_C = P2^2; //C键信号端对应D2 sbit Key_D = P2^3; //C键信号端void delay0(int a);void delay15us(void);void delay1ms(int z);void di(); //蜂鸣器函数声明unsigned int time;//用于存放定时器时间值unsigned int S; //用于存放距离的值char flag =0; //量程溢出标志位char f1,f2,f3,f4,n0;int a;int n;//运行次数判断标志int s_left,s_right;void Delay10us(unsigned char i){unsigned char j;do{j = 10;do{_nop_();}while(--j);}while(--i);}/**************************************************************** *****************************//*****************电机程序********************//**************************************************************** ****************************/void loop(){IN1=1; //左电机IN2=0;IN3=1; //右电机IN4=0;}void runfront(){IN1=1; //左电机IN2=0;IN3=0; //右电机IN4=1;}//小车后退函数void runback(){IN1=0; //左电机IN2=1;IN3=1; //右电机IN4=0;}//小车左转void runleft(){IN1=0; //左电机IN2=0;IN3=0; //右电机IN4=1;}//小车右转void runright(){IN1=1; //左电机IN2=0;IN3=0; //右电机IN4=0;}////小车左后转//void runbackleft()//{// IN1=0; //左电机// IN2=0;// IN3=0; //右电机// IN4=1;//}////小车右后转//void runbackright()//{// IN1=1; //左电机// IN2=0;// IN3=0; //右电机// IN4=0;//}//小车停止函数void stop(){IN1=0; //左电机IN2=0;IN3=0; //右电机IN4=0;}/**************************************************************** *****************************//***********蓝牙程序************//**************************************************************** ****************************/void delay(unsigned int a){unsigned int b;for(;a>0;a--)for(b=3;b>0;b--);}//左电机转void left_motor_runfront(unsigned int a){IN1=1; //左电机IN2=0;delay(a);IN1=0;IN2=0;delay(100-a);}void right_motor_runfront(unsigned int a){IN3=0; //右电机IN4=1;delay(a);IN3=0;IN4=0;delay(100-a);}void left_motor_back(unsigned int a) {IN1=0; //左电机IN2=1;delay(a);IN1=0;IN2=0;delay(100-a);}void right_motor_back(unsigned int a) {IN3=1; //右电机IN4=0;delay(a);IN3=0;IN4=0;delay(100-a);}void left_motor_stop(){IN1=0; //左电机IN2=0;}void right_motor_stop(){IN3=0; //左电机IN4=0;}//PWM调速void PWM_RUNFRONT(unsigned int a,unsigned int b) //a 属于0~100{left_motor_runfront(a);right_motor_runfront(b);}void PWM_RUNBACK(unsigned int a,unsigned int b) //a 属于0~100{left_motor_back(a);right_motor_back(b);}void PWM_RUNLEFT(unsigned int a) //a属于0~100 {right_motor_runfront(a);left_motor_stop();}void PWM_RUNRIGHT(unsigned int a) //a属于0~100 {right_motor_stop();left_motor_runfront(a);}void bluestop(){left_motor_stop() ;right_motor_stop() ;}void UsartConfiguration(){SCON=0X50; //设置为工作方式1TMOD=TMOD|0x21; //设置计数器工作方式2PCON=0X80; //波特率加倍TH1=0XFA; //计数器初始值设置,注意波特率是4800的TL1=0XFA;ES=1; //打开接收中断EA=1; //打开总中断TR1=1;TH0=0;TL0=0;ET0=1; //打开计数器}/**************************************************************** **************** 函数名 :Delay(unsigned int i)* 函数功能 : 延时函数* 输入 : 无* 输出 : 无***************************************************************** **************/void Usart() interrupt 4{receiveData=SBUF;//出去接收到的数据RI = 0;//清除接收中断标志位if(receiveData==0x66){low_velosity=1;high_velosity=0;// write_com(0x80);}if(receiveData==0x77){low_velosity=0;high_velosity=1;}}/**************************************************************** *****************************//***********舵机程序************//**************************************************************** ****************************/void delayx(int t){char j;for(;t>0;t--)for(j=19;j>0;j--);}void degree0(){int i;for(i=0;i<10;i++){PWM=1;delayx(10);//1msPWM=0;delayx(390);//19ms}}void degree90(){int i;for(i=0;i<10;i++){PWM=1;delayx(24);//50PWM=0;delayx(376);//18.5ms}}void degree180(){int i;for(i=0;i<15;i++){PWM=1;delayx(40);//1.5msPWM=0;delayx(360);//18.5ms}}/**************************************************************** *****************************//**************超声波程序**************//**************************************************************** *****************************//****A键被按下后,前进*****/void Count1(void){time=TH1*256+TL1;TH1=0;TL1=0;S=(time*1.7)/100; n++;if(S<=30&&n==1) {led1=0;stop();degree0();di(); }if(S>30&&n==1) {led1=1;runfront();n=0;}if(n==2){s_left=S;degree180();di(); }if(n==3){s_right=S; degree90();di();n=0; //标志位清零if(s_left>s_right){led2=1;delay1ms(50);led2=0;delay1ms(50);runright();delayx(1250);}else{led3=1;delay(800);led3=0;delay(500);runleft();delayx(1250);}}}/********超声波高电平脉冲宽度计算程序***************/void Timer_Count(void){TR1=1; //开启计数while(RX); //当RX为1计数并等待TR1=0; //关闭计数//Count1(); //计算}/********************************************************/ void StartModule() //启动模块{TX=1; //启动一次模块Delay10us(2);TX=0;}/**************************************************************** *****************************//********************主程序*******************//**************************************************************** *****************************/void main(void){UsartConfiguration();while(1){if(k1==0&&n0==0){delay1ms(20);if(k1==0){n0++;}}else if(k1==0&&n0==1){delay1ms(20);if(k1==0){n0--;}}if(n0==0){if(Key_B==0&&Key_D==0&&Key_C==0&&Key_A==1) //A键被按下{f1=1;f2=0;f3=0;f4=0;di();}else if(Key_A==0&&Key_D==0&&Key_B==1&&Key_C==0) //B键被按下{f1=0;f2=1;f3=0;f4=0;di();}else if(Key_B==0&&Key_D==0&&Key_A==0&&Key_C==1) //C键被按下{f1=0;f2=0;f3=1;f4=0;di();}else if(Key_D==1&&Key_B==0&&Key_A==0&&Key_C==0) //D键被按下{f1=0;f2=0;f3=0;f4=1;di();}if(f1)StartModule();for(a=951;a>0;a--) {if(RX==1){Timer_Count(); Count1();}}}if(f2){runback();}if(f3){loop();}if(f4){stop();}}if(n0==1)if(low_velosity){switch(receiveData){case leftdata: PWM_RUNLEFT(30); break; case rightdata: PWM_RUNRIGHT(30); break; case forwarddata: PWM_RUNFRONT(64,70); break; case backdata: PWM_RUNBACK(64,70); break; case stopdata: bluestop(); break; }}if(high_velosity){switch(receiveData){case leftdata: PWM_RUNLEFT(50); break; case rightdata: PWM_RUNRIGHT(50); break; case forwarddata: PWM_RUNFRONT(94,100); break; case backdata: PWM_RUNBACK(94,100); break; case stopdata: stop(); break;}}}}/*****************蜂鸣器*********************/ void di(){int i;for(i=0;i<150;i++){Beep= 1;delay0(20);}Beep=0;}void delay0(int a){char j;int i;for(i=a; i > 0; i--)for(j = 200; j > 0; j--);}void delay1ms(int z) //延时1ms{int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}。
#include< reg51.h >#define uchar unsigned char#define uint unsigned int#define MOTOR_C P1 //P1口作为电机的控制口。
//#define SIGNAL P3 //P3口的低两位为循迹传感器输入口。
#define SHELVES 10 //速度总档数。
#define BACK 0xfa //后退。
#define FORWARD 0xf5 //前进。
#define WXYK P2 //无线遥控sbit senserr = P3^2; //(右)循迹。
sbit senserl = P3^3; //(左)循迹。
sbit hwr = P3^0; //(前)红外壁障传感器入口。
sbit hwl = P3^1; //(后)红外壁障传感器入口。
sbit PWM_R = P1^0; //右电机PWM输入口。
sbit PWM_L = P1^2; //左电机PWM输入口。
sbit PWM_HR = P1^1; //(后退)右电机。
sbit PWM_HL = P1^3; //(后退)左电机。
sbit wxr_a = P2^4; //无线遥控接收端D0sbit wxb_b = P2^5; //无线遥控接收端D1sbit wxl_c = P2^6; //无线遥控接收端D2sbit wxs_d = P2^7; //无线遥控接收端D3void timer0_init( void ); //定时器0初始化函数。
void timer1_init( void ); //定时器1初始化函数。
void right( void ); //前进右转弯函数。
void left( void ); //前进左转弯函数。
void forward( void ); //前进函数。
void hright(void); //后退右转函数。
void hleft(void); //后退左转函数。
随着科技的发展,单片机作为一种常用的微控制器,已经在各个领域得到了广泛应用。
在玩具领域,特别是玩具小车的设计中,单片机的运用也越来越普遍,可以实现各种有趣的功能。
本文将介绍一种基于单片机的多功能玩具小车的设计与实现。
二、设计目标1. 实现无线遥控功能,通过遥控器实现对小车的控制。
2. 设置超声波避障模块,让小车能够自动避开障碍物。
3. 小车可通过蓝牙模块与手机进行连接,实现手机APP控制。
4. 为小车设计多种灯光效果,增添趣味性。
5. 使用音乐模块,使小车产生丰富的声音效果。
三、硬件设计1. 主控芯片选择了常用的Arduino单片机。
2. 驱动模块选用了直流电机驱动模块,实现小车的前进、后退和转向。
3. 采用了超声波传感器模块,用于检测障碍物并实现避障功能。
4. 蓝牙模块选用了蓝牙串口模块,实现与手机的数据传输和控制。
5. 设计了多种灯光效果,包括LED灯和彩色灯带。
6. 音乐模块选用了声音传感器模块,可以发出不同的声音效果。
四、软件设计1. 编写了小车的控制程序,包括前进、后退、左转、右转等基本控制2. 通过编写遥控器程序,实现了对小车的无线遥控功能。
3. 编写了避障算法,使小车能够自动避开障碍物。
4. 开发了手机APP,通过蓝牙模块与小车进行连接和控制。
5. 设计了多种灯光效果的控制程序,可以实现闪烁、变色等效果。
6. 编写了音乐模块的程序,可以根据指令发出不同的声音效果。
五、实现效果1. 小车可以通过遥控器实现前进、后退、左转、右转的基本功能。
2. 超声波传感器可以准确检测到障碍物,并成功避开。
3. 通过手机APP可以实现对小车的遥控和控制各种功能。
4. 多种灯光效果可以有效增加小车的趣味性。
5. 音乐模块发出的声音效果丰富多彩,增加了小车的趣味性。
六、总结与展望本文介绍了一种基于单片机的多功能玩具小车的设计与实现,通过结合硬件设计和软件设计,实现了多种有趣的功能。
未来,可以进一步优化设计,增加更多的传感器模块和功能模块,使小车的功能更加丰富多样。
单片机红外遥控小车源程序The document was finally revised on 202151单片机红外遥控小车源程序单片机源程序如下:1./*******************************************************************************2.--------------------------------------------------------------------------------3.* 实验名 : 红外线试验4.* 实验说明 : 数码管显示红外线发送过来的键值。
5.* 连接方式 : 见连接图6.* 注意 :7.*******************************************************************************/8.9.//#include<>10.#include<>11.//--定义使用的IO--//12.13.14.sbit IRIN = P3^2;15.sbit PWM1?= P0^1;16.sbit PWM2?= P0^2;17.18.//--定义一个全局变量--//19.unsigned char timer1;20.unsigned char IrValue[6]; //用来存放读取到的红外值21.unsigned char Time;22.23.//--声明全局函数--//24.void IrInit();25.void DelayMs(unsigned int );26.void Time1Config();27.void speedup();28.void Slowdown();29.void go();30.void left();31.void right();32.void pwm_left(int x);33.void pwm_right(int x);34./*******************************************************************************35.* 函数名 : main36.* 函数功能 : 主函数37.* 输入 : 无38.* 输出 : 无39.*******************************************************************************/40.41.void main()42.{43. PWM1=0;44. PWM2=0;45. IrInit();46. Time1Config();47. while(1)48. {49.50. IrValue[4]=IrValue[2]>>4; //高位51. IrValue[5]=IrValue[2]&0x0f; //低位52. if(IrValue[4]==0x0e&&IrValue[5]==0x08)53. {54.55. pwm_left(37);56. pwm_right(40);57.58. }59.60.61. if(IrValue[4]==0x0d&&IrValue[5]==0x04)62. {63.64. pwm_left(0);65. pwm_right(0);66.67. }68.69.//70. if(IrValue[4]==0x0e&&IrValue[5]==0x02)71. {72.73. pwm_left(35);74. pwm_right(22);75.76.77. }78.79. if(IrValue[4]==0x0e&&IrValue[5]==0x00)80. {81.82. pwm_left(22);83. pwm_right(35);84.85.86. }87.88. }89.90.}91.92.93.94.95.96.void pwm_left(int x)97.{98. if(timer1>100)//PWM周期为100*99. {100.101. timer1=0;102. }103.104. if(timer1 < x) //改变30这个值可以改变直流电机的速度105. {106.107. PWM1=1;108. }109.110. else111. {112.113. PWM1=0;114. }115.116.}117.118.void pwm_right(int y)119.{120. if(timer1>100)//PWM周期为100*121. {122.123. timer1=0;124. }125.126. if(timer1 < y) //改变30这个值可以改变直流电机的速度127. {128.129. PWM2=1;130. }131.132. else133. {134.135. PWM2=0;136. }137.138.}139./***************************************************************** **************140.* 函数名 : DelayMs()141.* 函数功能 : 延时142.* 输入 : x143.* 输出 : 无144.****************************************************************** *************/145.146.void DelayMs(unsigned int x) //误差 0us147.{148. unsigned char i;149. while(x--)150. {151.152. for (i = 0; i<13; i++)153. {}154. }155.156.}157./***************************************************************** **************158.* 函数名 : IrInit()159.* 函数功能 : 初始化红外线接收160.* 输入 : 无161.* 输出 : 无162.****************************************************************** *************/163.164.void IrInit()165.{166. IT0=1;//下降沿触发167. EX0=1;//打开中断0允许168. EA=1; //打开总中断169.170. IRIN=1;//初始化端口171. PWM1=0;172.173. PWM2=0;174.}175./***************************************************************** **************176.* 函数名 : ReadIr()177.* 函数功能 : 读取红外数值的中断函数178.* 输入 : 无179.* 输出 : 无180.****************************************************************** *************/181.182.void ReadIr() interrupt 0183.{184. unsigned char j,k;185. unsigned int err;186. Time=0;187. DelayMs(70);188.189. if(IRIN==0) //确认是否真的接收到正确的信号190. {191.192.193. err=1000; //1000*10us=10ms,超过说明接收到错误的信号194. /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时195.侯,程序死在这里*/196. while((IRIN==0)&&(err>0)) //等待前面9ms的低电平过去197. {198.199. DelayMs(1);200. err--;201. }202.203. if(IRIN==1) //如果正确等到9ms低电平204. {205.206. err=500;207. while((IRIN==1)&&(err>0)) //等待的起始高电平过去208. {209.210. DelayMs(1);211. err--;212. }213.214. for(k=0;k<4;k++) //共有4组数据215. {216.217. for(j=0;j<8;j++) //接收一组数据218. {219.220.221. err=60;222. while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去223. {224.225. DelayMs(1);226. err--;227. }228.229. err=500;230. while((IRIN==1)&&(err>0)) //计算高电平的时间长度。
以下是一个简单的Python赛车代码示例,使用turtle库来绘制赛车和赛道:
```python
import turtle
# 创建画布和赛车
canvas = turtle.Screen()
car = turtle.Turtle()
car.shape("turtle")
car.speed(10)
# 绘制赛道
for i in range(200):
if i % 2 == 0:
car.pencolor("white")
else:
car.pencolor("black")
car.forward(100)
car.right(90)
# 控制赛车移动
while True:
car.forward(100)
car.right(90)
car.forward(100)
car.right(90)
if car.xcor() < -200:
car.goto(-200, car.ycor())
if car.ycor() > 200:
car.goto(car.xcor(), 200)
```
该代码使用turtle库创建了一个画布和一辆赛车,然后使用循环绘制了一个简单的赛道。
在主循环中,赛车会不断向前移动并转向,如果赛车超出画布边界,就会将其移动回画布中心。
你可以根据需要修改赛车的形状、颜色、速度和赛道的形状和颜色等参数,以创建你自己的赛车游戏。
程序源代码、电路原理图、电路器件表当按下APP界面上的相关按键时(前进、左转、右转、后退、停止、左旋(当选择红外循迹用)、右旋(当选择红外跟随用)),手机会通过蓝牙发出相关的指令。
这些指令会被安装在智能小车上的蓝牙模块(HC-05)接收到,并通过串口转发给智能小车的处理器。
智能小车的处理器通过解析这些命令后,再根据这些命令的内容,控制智能小车前进、前进、左转、右转、后退、停止、红外循迹功能、红外跟随功能。
51单片机智能小车蓝牙遥控+红外循迹+红外跟随程序流程图如下:51单片机智能小车蓝牙遥控+红外循迹+红外跟随控制协议如下:前:$1,0,0,0,0,0,0,0,0,0#(文本)0x24 0x31 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x23(十六进制)左:$3,0,0,0,0,0,0,0,0,0#(文本)0x24 0x33 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x23(十六进制)后:$2,0,0,0,0,0,0,0,0,0#(文本)0x24 0x32 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x23(十六进制)右:$4,0,0,0,0,0,0,0,0,0#(文本)0x24 0x34 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x23(十六进制)停:$0,0,0,0,0,0,0,0,0,0#(文本)0x24 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x23(十六进制)左旋(当选择红外循迹用):$0,1,0,0,0,0,0,0,0,0#(文本)0x24 0x30 0x2C 0x31 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x23(十六进制)右旋(当选择红外跟随用):$0,2,0,0,0,0,0,0,0,0#(文本)0x24 0x30 0x2C 0x32 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x2C 0x30 0x23(十六进制)下文主要提供了51单片机智能小车蓝牙遥控+红外循迹+红外跟随完整程序源代码、电路原理图以及电路器件表。
遥控智能⼩车程序遥控智能⼩车控制程序:#include#define uint unsigned int#define uchar unsigned charuchar flag_la=0,flag_lb=0;uchar flag_ra=0,flag_rb=0;sbit left_a=P0^0;sbit left_b=P0^1;sbit right_a=P0^2;sbit right_b=P0^3;//sbit P2_0= P2^3;uchar rcvdata; //⽤来存放从串⼝接收到的数据uchar flag=0; //表⽰有没有接收到数据//uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80}; void delay(uchar x){uint i;while(x--)for(i=0;i<120;i++);}void Timer0_Init(void){TMOD |= 0x01; //定时器⼯作在⽅式1(16⾃加定时器)TH0 = (65535-10000)/256; //重新装填定时器数据,10ms后触发中断TL0 = (65535-10000)%256; //TH0 = (65536 - x)%256EA = 1; //打开总中断ET0 = 1; //打开定时器0中断TR0 = 1; //定时器0中断标志位,设置为1即马上进⼊中断函数//Timer0Interrupt(void)}void jin(){ // 第1种left_a= 1;right_b=0;flag_la=0;flag_ra=0;flag_lb=0;flag_rb=0;}void tui() //第2种{left_a= 0;left_b= 1;right_a=0;right_b=1;flag_la=0;flag_ra=0;flag_lb=0;flag_rb=0;}void zuoqian(){ //第5种// left_a=1; left_b=0;right_a=1;right_b=0;flag_la=1;flag_ra=0;flag_lb=0;flag_rb=0;}void youqian(){ //第6种left_a=1;left_b=0;//right_a=1;right_b=0;flag_la=0;flag_ra=1;}void ting(){ //第0种left_a=0; left_b=0;right_a=0;right_b=0;flag_la=0;flag_ra=0;flag_lb=0;flag_rb=0;}void zuotui(){ //第7种left_a=0; // left_b=1;right_a=0;right_b=1;flag_la=0;flag_ra=0;flag_lb=1;flag_rb=0;}void youtui(){ //第8种left_a=0; left_b=1;right_a=0;// right_b=1;flag_la=0;flag_ra=0;flag_lb=0;flag_rb=1;}void zuo(){ //第3种left_a=0; left_b=1;right_a=1;right_b=0;flag_lb=0;flag_ra=0;}void you(){ //第4种left_a=1;left_b=0;right_a=0;right_b=1;flag_la=0;flag_ra=0;flag_lb=0;flag_rb=0;}void main(){SM0=0;SM1=1;REN=1;TMOD=0x20;TH1=0xfd;TL1=0xfd;EA=1;ES=1;TR1=1;Timer0_Init();left_a=0;left_b= 0;right_a=0;right_b=0;while(1){if(flag==1){switch(rcvdata) {case '0': {ting();/*P0=table[0];P2_0 = 0;delay(200);P2_0 = 1;*/};break; case '1': {jin();/*P0=table[1];P2_0 = 0;delay(200);P2_0 = 1;*/};break;case '4': {you();/*P0=table[4];P2_0 = 0;delay(200);P2_0 = 1;*/};break; case '5': {zuoqian();/*P0=table[5];P2_0 = 0;delay(200);P2_0 = 1;*/};break; case '6': {youqian();/*P0=table[6];P2_0 = 0;delay(200);P2_0 = 1;*/};break; case '7': {zuotui();/*P0=table[7];P2_0 = 0;delay(200);P2_0 = 1;*/};break; case '8': {youtui();/*P0=table[8];P2_0 = 0;delay(200);P2_0 = 1;*/};break; }}}}void Timer0Interrupt(void) interrupt 1{TH0 = (65535-10000)/256;TL0 = (65535-10000)%256;if(flag_la==1){left_a=~left_a;}if(flag_lb==1){left_b=~left_b;}if(flag_ra==1){right_a=~right_a;}if(flag_rb==1){right_b=~right_b;}}void comint() interrupt 4{RI=0;flag=1;rcvdata=SBUF; }。
制作遥控汽车方法遥控汽车是一种很受欢迎的DIY项目,它结合了机械、电子和编程等多种技能。
本文将介绍一种简单的制作遥控汽车的方法,你可以按照以下步骤来完成。
材料准备首先,你需要准备以下材料:1.电动车底盘:可以购买现成的电动车底盘,也可以使用废旧的遥控汽车部件;2.控制模块:用来接收遥控信号并控制电动车底盘的运动,常见的控制模块有Arduino和Raspberry Pi等;3.电源:一块锂电池或者多节干电池;4.遥控器:用来发送信号给控制模块的遥控器。
组件连接接下来,将各个组件连接在一起。
首先,将控制模块连接到电动车底盘上。
根据电动车底盘的接口和控制模块的引脚定义,连接电机和电调等部件。
一般来说,电机的电线需要焊接到电调上,而电调则需要连接到控制模块上。
接着,将电源连接到控制模块上。
如果你使用的是锂电池,可以通过电源插座或者引线连接到控制模块的电源接口上。
如果你使用的是干电池,需要用电池盒将多个干电池连接起来,并将电源引线连接到控制模块上。
最后,将遥控器与控制模块进行配对。
根据遥控器的说明书,按照相应的步骤将遥控器与控制模块进行绑定。
编程设置接下来,我们需要编写代码来控制遥控汽车的运动。
如果你使用的是Arduino控制模块,你可以使用Arduino IDE来编写代码。
如果你使用的是Raspberry Pi控制模块,你可以使用Python语言来编写代码。
首先,在编程环境中导入所需的库和模块。
根据你使用的控制模块和传感器,导入相应的库和模块。
接着,定义好电机和控制模块的引脚以及初始状态。
然后,编写函数来控制遥控汽车的运动。
根据遥控器的信号和按键的不同,调整电机的速度和方向。
你可以设置前进、后退、左转和右转等不同的功能。
在函数中,你可以使用控制模块的库函数来控制电机的转动。
最后,编写主程序,不断监听遥控器的信号,并调用相应的函数来控制遥控汽车的运动。
在主程序中,你可以设置循环,不断读取遥控器的信号并根据信号调用相应的函数。
#include<reg51.H>#include <intrins.h>//#include"lcd.h"sbit TX=P2^7;sbit RX=P2^6;sbit PWM=P1^4;sbit Beep=P3^7;sbit led1=P3^3;sbit led2=P3^4;sbit led3=P3^5;/***********蓝牙切换按键**********/sbit k1=P3^6;/***自定义一些数据,注意这些数据对应“51智能车蓝牙无线遥控.exe”软件上的数据设置**/#define leftdata 0x11#define rightdata 0x22#define forwarddata 0x33#define backdata 0x44#define stopdata 0x55#define uchar unsigned char#define uint unsigned intunsigned char receiveData,high_velosity,low_velosity; void UsartConfiguration();/***********电机端口定义************************/sbit IN1=P1^0; //为高电平时,左电机后转sbit IN2=P1^1; //为高电平时,左电机正转sbit IN3=P1^2; //为高电平时,右电机正转sbit IN4=P1^3; //为高电平时,右电机后转/**************无线遥控模块定义****************/sbit Key_A = P2^0; //B键信号端对应D0sbit Key_B = P2^1; //D键信号端对应D1sbit Key_C = P2^2; //C键信号端对应D2sbit Key_D = P2^3; //C键信号端void delay0(int a);void delay15us(void);void delay1ms(int z);void di(); //蜂鸣器函数声明unsigned int time;//用于存放定时器时间值unsigned int S; //用于存放距离的值char flag =0; //量程溢出标志位char f1,f2,f3,f4,n0;int a;int n;//运行次数判断标志int s_left,s_right;void Delay10us(unsigned char i){unsigned char j;do{j = 10;do{_nop_();}while(--j);}while(--i);}/********************************************************* ************************************//*****************电机程序********************//********************************************************* ***********************************/void loop(){IN1=1; //左电机IN2=0;IN3=1; //右电机IN4=0;}void runfront(){IN1=1; //左电机IN2=0;IN3=0; //右电机IN4=1;}//小车后退函数void runback(){IN1=0; //左电机IN2=1;IN3=1; //右电机IN4=0;}//小车左转void runleft(){IN1=0; //左电机IN2=0;IN3=0; //右电机IN4=1;}//小车右转void runright(){IN1=1; //左电机IN2=0;IN3=0; //右电机IN4=0;}////小车左后转//void runbackleft() //{// IN1=0; //左电机// IN2=0;// IN3=0; //右电机// IN4=1;//}////小车右后转//void runbackright()//{// IN1=1; //左电机// IN2=0;// IN3=0; //右电机// IN4=0;//}//小车停止函数void stop(){IN1=0; //左电机IN2=0;IN3=0; //右电机IN4=0;}/********************************************************* ************************************//***********蓝牙程序************//********************************************************* ***********************************/void delay(unsigned int a){unsigned int b;for(;a>0;a--)for(b=3;b>0;b--);}//左电机转void left_motor_runfront(unsigned int a) {IN1=1; //左电机IN2=0;delay(a);IN1=0;IN2=0;delay(100-a);}void right_motor_runfront(unsigned int a) {IN3=0; //右电机IN4=1;delay(a);IN3=0;IN4=0;delay(100-a);}void left_motor_back(unsigned int a) {IN1=0; //左电机IN2=1;delay(a);IN1=0;IN2=0;delay(100-a);}void right_motor_back(unsigned int a) {IN3=1; //右电机IN4=0;delay(a);IN3=0;IN4=0;delay(100-a);}void left_motor_stop(){IN1=0; //左电机IN2=0;}void right_motor_stop(){IN3=0; //左电机IN4=0;}//PWM调速void PWM_RUNFRONT(unsigned int a,unsigned int b) //a属于0~100{left_motor_runfront(a);right_motor_runfront(b);}void PWM_RUNBACK(unsigned int a,unsigned int b) //a属于0~100{left_motor_back(a);right_motor_back(b);}void PWM_RUNLEFT(unsigned int a) //a属于0~100{right_motor_runfront(a);left_motor_stop();}void PWM_RUNRIGHT(unsigned int a) //a属于0~100 {right_motor_stop();left_motor_runfront(a);}void bluestop(){left_motor_stop() ;right_motor_stop() ;}void UsartConfiguration(){SCON=0X50; //设置为工作方式1TMOD=TMOD|0x21; //设置计数器工作方式2PCON=0X80; //波特率加倍TH1=0XFA; //计数器初始值设置,注意波特率是4800的TL1=0XFA;ES=1; //打开接收中断EA=1; //打开总中断TR1=1;TH0=0;TL0=0;ET0=1; //打开计数器}/********************************************************* *********************** 函数名:Delay(unsigned int i)* 函数功能: 延时函数* 输入: 无* 输出: 无********************************************************** *********************/void Usart() interrupt 4{receiveData=SBUF;//出去接收到的数据RI = 0;//清除接收中断标志位if(receiveData==0x66){low_velosity=1;high_velosity=0;// write_com(0x80);if(receiveData==0x77){low_velosity=0;high_velosity=1;}}/********************************************************* ************************************//***********舵机程序************//********************************************************* ***********************************/void delayx(int t){char j;for(;t>0;t--)for(j=19;j>0;j--);}void degree0(){int i;for(i=0;i<10;i++)PWM=1;delayx(10);//1msPWM=0;delayx(390);//19ms}}void degree90(){int i;for(i=0;i<10;i++){PWM=1;delayx(24);//50PWM=0;delayx(376);//18.5ms}}void degree180(){int i;for(i=0;i<15;i++)PWM=1;delayx(40);//1.5msPWM=0;delayx(360);//18.5ms}}/********************************************************* ************************************//**************超声波程序**************//********************************************************* ************************************//****A键被按下后,前进*****/void Count1(void){time=TH1*256+TL1;TH1=0;TL1=0;S=(time*1.7)/100;n++;if(S<=30&&n==1)led1=0;stop();degree0();di();}if(S>30&&n==1){led1=1;runfront();n=0;}if(n==2){s_left=S;degree180();di();}if(n==3){s_right=S;degree90();di();n=0; //标志位清零if(s_left>s_right)led2=1;delay1ms(50);led2=0;delay1ms(50);runright();delayx(1250);}else{led3=1;delay(800);led3=0;delay(500);runleft();delayx(1250);}}}/********超声波高电平脉冲宽度计算程序***************/ void Timer_Count(void){TR1=1; //开启计数while(RX); //当RX为1计数并等待TR1=0; //关闭计数//Count1(); //计算}/********************************************************/void StartModule() //启动模块{TX=1; //启动一次模块Delay10us(2);TX=0;}/********************************************************* ************************************//********************主程序*******************//********************************************************* ************************************/void main(void){UsartConfiguration();while(1){if(k1==0&&n0==0){delay1ms(20);if(k1==0){n0++;}}else if(k1==0&&n0==1){delay1ms(20);if(k1==0){n0--;}}if(n0==0){if(Key_B==0&&Key_D==0&&Key_C==0&&Key_A= =1) //A键被按下{f1=1;f2=0;f3=0;f4=0;di();}elseif(Key_A==0&&Key_D==0&&Key_B==1&&Key_C==0) //B键被按下{f1=0;f2=1;f3=0;f4=0;di();}elseif(Key_B==0&&Key_D==0&&Key_A==0&&Key_C==1) //C键被按下{f1=0;f2=0;f3=1;f4=0;di();}elseif(Key_D==1&&Key_B==0&&Key_A==0&&Key_C==0) //D键被按下{f1=0;f2=0;f3=0;f4=1;di();}if(f1){StartModule();for(a=951;a>0;a--){if(RX==1){Timer_Count();Count1();}}}if(f2){runback();}if(f3){loop();}if(f4){stop();}}if(n0==1){if(low_velosity){switch(receiveData){case leftdata: PWM_RUNLEFT(30); break;case rightdata: PWM_RUNRIGHT(30); break;case forwarddata: PWM_RUNFRONT(64,70); break;case backdata: PWM_RUNBACK(64,70); break;case stopdata: bluestop(); break;}}if(high_velosity){switch(receiveData){case leftdata: PWM_RUNLEFT(50); break;case rightdata: PWM_RUNRIGHT(50); break;case forwarddata: PWM_RUNFRONT(94,100); break;case backdata: PWM_RUNBACK(94,100); break;case stopdata: stop(); break;}}}}}/*****************蜂鸣器*********************/void di(){int i;for(i=0;i<150;i++){Beep= 1;delay0(20);}Beep=0;}void delay0(int a){char j;int i;for(i=a; i > 0; i--)for(j = 200; j > 0; j--);}void delay1ms(int z) //延时1ms {int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}。
线遥控玩具汽车(附源码)
来源:网友投稿作者:伟翔电子徐增钟字号:[大中小]
声明:本文为徐增钟原创作品,如需转载请通过本站联系作者
笔者从事无线遥控玩具开发工作多年,开发了很多种类的无线遥控玩具产品。
总结了很多工作经验。
用的绝大部分IC是TX2C(遥控)和RX2C(接收),其功能分别是:前进,后退,左转,右转。
笔者利用工作的空闲时间用AT89C2051单片机编出了跟TX2C和RX2C一样的编解码程序,并成功进行了实际制作。
编解码与TX2C和RX2C兼容。
现将制作原理图和源程序公开给读者参考学习与制作,相信对初学者有极大的帮助,这也是笔者的心愿!其原理图如下:图2为接收部分,图3为发射部分。
源程序和仿真文件见附件。
(源程序下载仿真文件下载)读者如果想仿制的话,建议RF接收和RF发射部使用市面上成品的315MHz 模块,应用起来很方便,这样可以免去调试高频部分。
下面图1是遥控前进部分编码波形:
从编码图1中看出有四个周期一样的同步脉冲,各个功能是按数据脉冲个数的不同实现功能不同的。
这样编码有很强的搞干扰能力,也可以应用到其它领域遥控上面去,可以做成遥控飞机,也可以做成遥控船……这要看读者的需要应用了。
具体功能相应编码以下:
前进:同步脉冲+10个数据脉冲
后退:同步脉冲+40个数据脉冲
左转:同步脉冲+64个数据脉冲
右转:同步脉冲+58个数据脉冲
前进+左转:同步脉冲+34个数据脉冲
前进+右转:同步脉冲+28个数据脉冲
后退+左转:同步脉冲+46个数据脉冲
后退+右转:同步脉冲+52个数据脉冲
按键松开时发送2帧停止位:同步脉冲+4个数据脉冲。
接收部分收到的是反相的信号,读者在制作时要注意。
图二(点击放大)
徐增钟 2008.05.18于深圳。