这次的院里的电子设计竞赛我们做的是遥控小车。其实两个礼拜前就做完了,工作量加起来其实也就2天的功夫,之后由于懒,所以大家就没有往里面加入东西发挥。今晚答辩被老师说了一顿,还好老师都是认识的,我们有多少实力都清楚。无所谓了,呵呵,又要开始做其他的东西了。这个课题本身就是很简单的。还是不废话了上图吧。
这是遥控器,当然焊工不错(关键是看背面,阿康的技术绝对OK)【实物图】
这个是遥控器的【原理图】,上一幅图的绿色的PCB板子就是原理图上的2262,这个模块是老师发的包括有接收的2272,因为地址码已经做好了,所以只要发数据码就可以了,联系到接收,因为接收有悬空、0、1的三种状况,为了避免误发信息所以将悬空的功能隐去,只在按键按下的时候发送高信号。
车【实物图】,底座、轮胎、齿轮是买的其他均为手工制作
以上是小车的【原理图】,截图截了两次
这一部分是小车的驱动和控制模块,是最主要的模块。分别是2272的接收模块,单片机,L298的驱动芯片。2272是M型的也就是非锁存模式的,检测到信号的时候会在相应的地址位输出高,当没有检测到的时候是为低,虽然2272是CMOS工艺2.5到15V均可以工作,但是兼容TTL电平,所以,单片机完全可以读取电平信号。L298电机驱动芯片的功能强大,因为本身自带逻辑电压输入端,所以只要电压控制在7V以下,单片机即可直接驱动这块芯片。电机启动时候的电压电流会高一点,但是L298可以输出电流达2A这个是比较大的了,驱动小电机完全不在话下。
以上是L298的【封装】以及引脚图
下面贴一下程序吧,呵呵。[page]
//////////////////////////////////////////////////////////***C51程序*******////////////////////////////////////////
#include
#define TH0C 0xff
#define TL0C 0xf6
unsigned int dr_l,dr_r,times; //duty ratio 是占空比的意思。
unsigned char flag;
sbit leftv=P1^0;
sbit leftg=P1^1;
sbit rightv =P1^2;
sbit rightg =P1^3;
sbit ena=P1^4;
sbit enb=P1^5;
sbit key0=P2^5;
sbit key_a=P2^0;
sbit key_r=P2^1;
sbit key_l=P2^2;
sbit key_b=P2^3;
void beforeint(void);
void main()
{
while(1)
{
P2=0xff;
if(key0)
{
ena=1;
enb=1;
if(key_a)
{
flag=1;
dr_l=50;
dr_r=50;
leftv=1;
rightv=1;
beforeint();
}
if(key_r)
{
flag=2;
dr_l=99;
dr_r=1;
leftv=1;
rightg=1;
beforeint();
}
if(key_l)
{
flag=3;
dr_l=1;
dr_r=99;
leftg=1;
rightv=1;
beforeint();
}
if(key_b)
{
flag=4;
dr_l=50;
dr_r=50;
leftg=1;
rightg=1;
beforeint();
}
}
else
{
ena=0;
enb=0;
flag=0;
P1=0xff;
continue;
}
}
}
void beforeint(void)
{
TMOD=0x01;
TH0=TH0C;
TL0=TL0C;
TR0=1;
ET0=1;
EA=1;
}
void time0(void) interrupt 1 using 2
{
times=0;
TH0=TH0C;
TL0=TL0C;
times+=1;
if(times>99)
{
times=0;
}
if(flag==1)
{
if(times<=dr_l)
{
leftg=0;
}
else
{
leftg=1;
}
if(times<=dr_r)
{
rightg=0;
}
else
{
rightg=1;
}
}
else if(flag==2)
{
if(times<=dr_l)
{
leftg=0;
}
else
{
leftg=1;
}
if(times<=dr_r)
{
rightv=0;
}
else
{
rightv=1;
}
}
else if(flag==3)
{
if(times<=dr_l)
{
leftv=0;
}
else
{
leftv=1;
}
if(times<=dr_r)
{
rightg=0;
}
else
{
rightg=1;
}
}
else if(flag==4)
{
if(times<=dr_l)
{
leftv=0;
}
else
{
leftv=1;
}
if(times<=dr_r)
{
rightv=0;
}
else
{
rightv=1;
}
}
}
////////////////////////////////////////////////////******************************///////////////////////////////////
完整的程序代码从这里下:http://www.51hei.com/ziliao/file/xiaoch.rar
小车的演示视频:http://v.youku.com/v_show/id_XMTM3MDkyMDA4.html
程序是根据2272接收到的型号判断该左转右转还是前进后退,这个是四个基本功能,我们的小车也就实现这些功能,对于电源我们处理的不是很好,只是简单的将小车共地。并且把L298的逻辑电压单独接出来,这个小车以后还是会改进的,呵呵。
后记:该说的都说的差不多了,程序很简单,我只用了几个钟头包括仿真(Proteus仿真图就不贴出来了),主要是控制,然后就是产生PWM来进行对小车的调速,不过调试的时候 一次通过,虽然转的比较快,但是不影响转弯。有问题请随意,呵呵。
关键字:51单片机 无线遥控小车
引用地址:
基于51单片机的无线遥控小车设计
推荐阅读最新更新时间:2024-03-16 13:08
51单片机位及位操作指令
我们已经习惯了“位”一位就是一盏灯的亮和灭,而我们学的指令却全都是用“字节”来介绍的:字节的移动、加法、减法、逻辑运算、移位等等。用字节来处理一些数学问题,比如说:控制冰箱的温度、电视的音量等等很直观,可以直接用数值来表在。可是如果用它来控制一些开关的打开和合上,灯的亮和灭,就有些不直接了?我们知道送往P1口的数值后并不能马上知道哪个灯亮和来灭,而是要化成二进制才知道。工业中有很多场合需要处理这类开关输出,继电器吸合,用字节来处理就显示有些麻烦,所以在8051单片机中特意引入一个位处理机制。 位寻址区 在8051中,有一部份RAM和一部份SFR是具有位寻址功能的,也就是说这些RAM的每一个位都有自已的地址,可以直接用这个地址来
[单片机]
基于51单片机的出租车计价器的设计
引言 在科学技术和经济水平快速发展的21世纪,乘坐出租车和网约车出行已经成为一种非常重要的交通出行方式。行业的转型发展让出租车行业迎来了一场新纪元。但是在出租车行业迅速发展的同时,也出现了很多问题。经营管理不善,司机服务不规范,随意定价收款的现象也是层出不穷。为了根治这种现象,出租车计价器孕育而生。出租车计价器的问世不仅减少了行业的乱象,而且让管理者和经营者更加诚信的服务乘客,在很大程度上改善了行业风气。 但是目前国内广泛使用的出租车计价器功能单一,不能满足人们的需求,人们更致力于一种功能齐全,生产成本低的出租车计价器。伴随着科技水平的提高,出租车计价器也迎来了新的变革,这时第二代出租车计价器问世了。 设计选用宏晶公司生产的STC
[单片机]
51单片机----sbit
sbit: 定义特殊功能寄存器的位变量。 典型应用:sbit P0_0=P0^0;//即定义P0_0为P0口的第1位,以便进行位操作。 用法: 在C语言里,如果直接写P1.0,C编译器并不能识别,而且P1.0也不是一个合法的C语言变量名,所以得给它另起一个名字,这里起的名为P1_0,可是P1_0是不是就是P1.0呢?你这么认为,C编译器可不这么认为,所以必须给它们建立联系,这里使用了Keil C的关键字sbit来定义,sbit的用法有三种: 第一种方法:sbit 位变量名=地址值 第二种方法:sbit 位变量名=SFR名称^变量位地址值 第三种方法:sbit 位变量名=SFR地址值^变量位地址值 如定义PSW中的O
[单片机]
51单片机-74HC595移位寄存器
1.74HC595芯片介绍 74HC595芯片是一个串行输入,并行输出设备。其内部包括一个8位移位寄存器、一个存储器以及三态输出门电路,其中移位寄存器和存储器都有相互独立的时钟,每当移位寄存器输入时钟SHCP上升沿来临之时,数据被移出。 1.1.引脚定义 引脚定义,怎么命名,并没有个统一的规则,所以每个人在绘制芯片引脚图时,根据个人习惯命名可能都不一样(如:14号引脚(DS/SER),10号引脚(MR/SCLR),11号引脚(SHCP/SCK),12号引脚(STCP/RCK)等);虽然命名可能不一样,但引脚的功能确是一样; 1.2.工作原理 工作方式1:将DS的数据,通过SHCP产生上升沿,一位位的移入移
[单片机]
51单片机串口控制继电器
实验室有个项目,用到报警功能。比如当温度或应力过高或者过低的时候启动报警器,通过给串口发送一个命令来控制继电器。不巧去年被我正负极接反烧了,最近开始搞单片机,哥苦心经营,利用实验室单片机学习板给搞定了,程序如下: #include reg52.h #define uchar unsigned char sbit JDQ=P3^7; //继电器接P3.7 sbit FMQ=P3^6; sbit LED=P0^0; sbit LEDra=P0^1; sbit LEDar=P0^2; uchar dat ; int i=0; void Delay(unsigned int ii) //1mS
[单片机]
基于MCS-51单片机的三个存储空间及划分解析
1.前言 MCS-51的存储器有片内RAM、片外RAM 和 ROM 三个空间。 MCS-51单片机在物理结构上有四个存储空间 1、片内程序存储器(片内ROM) 2、片外程序存储器(片外ROM) 3、片内数据存储器(片内RAM) 4、片外数据存储器(片外RAM) 在逻辑上(即从用户的角度上)MCS-51单片机有三个存储空间 1、片内外统一编址的64K的程序存储器(ROM)地址空间(MOVC) 2、256B的片内数据存储器(片内RAM)的地址空间(MOV) 3、以及64K片外数据存储器(片外RAM)的地址空间(MOVX) 注:在访问三个不同的逻辑空间时,应采用不同形式的指令以产生不同的存储器空间的选通信号。 2.存储空间划分
[单片机]
Atmega16单片机和51单片机有何区别?从软硬件两方面分析
1. Atmega16单片机简介 今天我们的主题是单片机,说道单片机你可能最先想到的是51单片机,然后通过外接的数字电路和模拟电路来控制外围的硬件,比如PWM,ADC,I2C等等。那么今天我们所说的是什么那?其实你把Atmega16单片机当成51单片机来使用即可,只不过是Atmega16单片机的外围接口更丰富,那么它都有什么外设资源那? ATmega16是基于增强的AVR RISC结构的低功耗8 位CMOS微控制器,由于其先进的指令集以及单时钟周期指令执行时间,ATmega16 的数据吞吐率高达1 MIPS/MHz。ATmega16常用片上资源有定时器、PWM、外部中断、SPI总线、两线串行接口TWI、EEPROM、USART
[单片机]
51单片机IO口模拟串口通讯6
/*************************************************************** *模拟接收程序,这个程序的作用从模拟串口接收数据,然后将这些数据发送到实际串口 *在单片机上模拟了一个串口,使用P3.2作为发送和接收端 *以P3.2模拟串口接收端,从模拟串口接收数据发至串口 *本程序来源于《单片机IO口模拟串口程序(发送+接收)》 *硬件环境:11.0592MHz, RXD P3.2 ***************************************************************/ #include reg51.h #include stdio.h
[单片机]