基于51单片机的红外遥控智能小车源程序(C语言)

合集下载

智能小车循迹、避障、红外遥控C语言代码

智能小车循迹、避障、红外遥控C语言代码

智能小车循迹、避障、红外遥控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 的前导低电平信号。

基于51单片机红外无线遥控智能小车控制设计

基于51单片机红外无线遥控智能小车控制设计

基于51单片机红外无线遥控智能小车控制设计摘要:本文利用51单片机设计了一款具有红外无线遥控功能的智能小车控制系统。

该系统基于红外技术,实现了对智能小车的远程控制。

通过建立遥控信号传输模型和小车控制模块,实现了智能小车的实时运动控制,包括前进、后退、左转、右转等操作。

本文详细介绍了系统设计方案、硬件设计和软件设计,通过实验验证,证明该系统能够稳定地实现智能小车的远程控制,具有一定的应用价值和推广前景。

关键词:51单片机;红外无线遥控;智能小车控制;遥控信号传输模型Abstract:In this paper, a smart car control system with infrared wireless remote control function based on 51 single-chip microcomputer is designed. The system is based on infrared technology, which realizes the remote control of the smart car. By establishing the remote control signal transmission model and the car control module, real-time motion control of the smart car, including forward, backward, turning left and turning right, is realized. This paper introduces the system design scheme, hardware design and software design in detail. Through experiments, it is proved that the system can stably realize the remote control of the smart car, and has certain application value and promotion prospects.Keywords:51 single-chip microcomputer; infrared wireless remote control; smart car control; remote control signaltransmission model1. 引言智能小车控制系统是一种目前比较受关注的智能化系统,在智能出行和智慧交通中有着广泛的应用。

基于51单片机的红外遥控智能小车源程序(C语言)

基于51单片机的红外遥控智能小车源程序(C语言)

/*预处理命令*/#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时,忙,等待。

自动避障红外电动小车C51程序

自动避障红外电动小车C51程序
#define LCD_Data P0
#define Busy 0x80 //用于检测LCD状态字中的Busy标识
sbit c=P1^2; //转向灯使能端
uchar code talk1[]={"backward"};
uchar code talk2[]={"forward"};
uchar code talk3[]={"Turnleft"};
****************************/
void infrared_ray()interrupt 0 using 3
{ uchar i=90;
flage=0x01; //接受标志位
while(i--); //减小灵敏度
EX0=0; //关掉中断,等到发射方波后才开启,处于别动
}
//延时子程序
LCD_Data = WCLCD;
LCD_RS= 0;
LCD_RW= 0;
LCD_E = 0; //延时,为了安全
LCD_E = 0;
LCD_E = 0; //延时
LCD_E = 1;
}
void LCDInit(void) //LCD初始化
{
Delay400Ms();
LCD_Data = 0;
WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号
//右边有障碍物,左转
else if(temp==0x02) {control(2,dj_state3,right_light ); temp =0x00;}
//两个方向都有障碍物,后退,右转
else if(temp==0x03) {control(10,dj_state4,back_light );

51单片机声控智能小车C语言程序设计代码

51单片机声控智能小车C语言程序设计代码
51单片机声控智能小车C语言程序设计代码
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char code LEDShowData[]={0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x19,0x03};
m=0;
z=0;
ET0=1;
ET1=1;
TR0=1; //启动T0定时器
break;//跳出switch
}
default://对周期时间T之内无效m清零
{
m=0;
z++;
if(z==5)
{
ET0=0;
ET1=0;
LED=1;
P1=0x00;
x=0;
z=0;
P2=LEDShowData[2];
m1a=0;
ET0=1;
ET1=1;
TR0=1;//启动T0定时器
break;//跳出switch
}
case 2://高速挡,占空比99.6%
{
P2=LEDShowData[1];//七段数码管显示2
TH0=1;
TL0=1; //对T0定时器赋初值
TH1=255;
TL1=255; //对T1定时器赋初值
x=m+1;
if(n==250)//n控制查询周期时间
{
n=0;
switch(m)
{
case 1://低速挡,占空比77.8%
{
P2=LEDShowData[0];//七段数码管显示1
TH0=210;
TL0=210;//对T0定时器赋初值

基于51单片机的红外遥控小车设计和制作

基于51单片机的红外遥控小车设计和制作

基于51单片机的红外遥控小车设计和制作本文介绍一款红外线遥控小车,以AT89S51单片机为核心控制器,用L289驱动直流电机工作,控制小车的运行。

本款小车具有红外线遥控手动驾驶、自动驾驶、寻迹前进等功能。

本系统采用模块化设计,软件用C语言编写。

一、设计任务和要求以AT98C51单片机为核心,制作一款红外遥控小车,小车具有自动驾驶,手动驾驶和循迹前进等功能。

自动驾驶时,前进过程中可以避障。

手动驾驶时,遥控控制小车前进、后退、左转、右转、加速等操作。

寻迹前进时小车还可以按照预先设计好的轨迹前进。

二、系统组成及工作原理本系统由硬件和软件两部分组成。

硬件部分主要完成红外编码信号的发射和接受、障碍物检测、轨迹检测、直流电机运行的发生等功能。

软件主要完成信号的检测和处理、设备的驱动及控制等功能。

AT89S51单片机查询红外信号并解码,查询各个检测部分输入的信号,并进行相应处理,包括电机的正反转,判断是否遇到障碍物,判断是否小车其那金中有出轨等。

系统结构框图如图1所示。

图1 系统结构框图三、主要硬件电路1、遥控发射器电路该电路的主要控制器件为遥控器芯片HT6221,如图2所示。

HT6221将红外码调制成38KHZ的脉冲信号通过红外发射二极管发出红外编码。

图2中D1是红外发射二极管,D2是按键指示灯,当有按键按下时D2点亮。

HT6221的编码规则是:当一个键按下超过36ms,振荡器使芯片激活,如果这个按键按下且延迟大约108ms,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9~18ms),8位数据码(9~18ms)和这8位数据码的反码(9~18ms)组成,如果按键按下超过108ms仍未松开,接下来发射的代码将仅由起始码(9ms)和结束码(2.5ms)组成。

按照上图的接法,K1~K8的数据码分别为:0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07。

单片机红外遥控小车源程序

单片机红外遥控小车源程序

单片机红外遥控小车源程序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)) //计算高电平的时间长度。

基于单片机的红外遥控智能小车设计

基于单片机的红外遥控智能小车设计

基于单片机的红外遥控智能小车设计引言:随着科技的不断发展,智能物联网已经走进了我们的生活。

智能小车作为一种智能化的产品,能够实现远程遥控、自动避障等功能,受到了广大消费者的青睐。

本文就基于单片机的红外遥控智能小车设计进行详细介绍。

一、设计目标本设计的目标是通过红外遥控,实现对智能小车的远程控制,小车能够根据收到的指令进行行驶、避障等操作。

二、设计原理1.主控芯片:本设计使用单片机作为主控芯片,常用的单片机有51系列、AVR系列等,可根据实际需求选择合适的芯片型号。

2.红外遥控模块:红外遥控模块是实现红外通信的设备,可以将遥控器发出的红外信号解码成数据,实现遥控操作。

3.电机驱动模块:电机驱动模块可将单片机的PWM信号转化为电机的动力驱动信号,控制小车的行驶方向和速度。

4.超声波传感器:超声波传感器可以感知到小车前方的障碍物距离,根据测得的距离,进行相应的避障操作。

5.电源模块:小车需要使用适当的电源,通常是锂电池或者直流电源供应。

三、系统设计1.硬件设计:(1)搭建小车底盘:根据所选择的底盘,搭建小车结构,并安装好电机驱动模块、电源模块等硬件设备。

(2)连接电路:将红外遥控模块、超声波传感器等硬件设备与主控芯片进行连接,确保每个模块正常工作。

2.软件设计:(1)红外遥控程序设计:通过红外遥控模块接收红外信号,并解码成相应的指令。

根据指令控制电机驱动模块,实现小车的行驶方向和速度控制。

(2)超声波避障程序设计:根据超声波传感器测得的距离,判断是否有障碍物,如果有障碍物就停止或者转向。

四、实验结果和讨论经过实验验证,本设计的红外遥控智能小车能够准确接收红外信号,并根据指令控制小车的行驶方向和速度。

同时,超声波传感器能够及时感知到前方的障碍物,并进行相应的避障操作。

然而,该设计仍然存在一些不足之处,比如超声波传感器的测距范围有限,可能无法感知到较小的障碍物。

此外,红外遥控信号的传输距离也有一定限制,需要保持遥控器与小车之间的距离不过远。

51单片机声控智能小车C语言程序设计代码

51单片机声控智能小车C语言程序设计代码
51单片机声控智能小车c语言程序设计代码单片机c语言单片机c语言教程单片机c语言应用100例宁波单片机c语言培训南通单片机c语言培训单片机c语言编程单片机c语言入门单片机c语言延时程序单片机c语言程序设计
51单片机声控智能小车C语言程序设计代码
#include<reg52.h>
#define uint unsigned int
sbit m2a=P0^2;
sbit m2b=P0^3;
sbit B1=P0^4;
uint m,n,x,y,z;
void delayB1()
{
unsigned int delaytime=500;
while(delaytime--);
return;
}
void delayLED(uint ms)
{
uint a,b;
{
P1=0xff;//全灭
delayLED(y);
P1=0x00;
delayLED(y);//灯全亮
}
else
{
P1=0x00;
delayLED(1);
}
}
}
{
m=0;
z++;
if(z==5)
{
ET0=0;
ET1=0;
LED=1;
P1=0x00;
x=0;
z=0;
P2=LEDShowData[2];
m1a=0;
m2a=0;
break;
}
}
}
}
}
void main(void)
{
P1=0x00;//初始化主板LED,全亮
n=m=x=y=z=0;
m1a=0;
m2a=0;

红外遥控小车的c程序

红外遥控小车的c程序

#include<reg52.h>#include<math.h>#include<intrins.h>#define uchar unsigned char //数据类型#define uint unsigned intsbit hwx=P3^3;uchar key;uchar l_lhj[66];//定义66位数组变量来存储接收的时间参数uchar ledmap[10]={0x3f, 0x06 , 0x5b, 0x4f, 0x66, 0x6d,0x7d};//*********************************************sbit ENa=P2^4; //* L298的Enable Asbit ENb=P2^7; //* L298的Enable Bsbit IN1=P2^2; //* L298的Input 1sbit IN2=P2^3; //* L298的Input 2sbit IN3=P2^5; //* L298的Input 3sbit IN4=P2^6; //* L298的Input 4uchar 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_Ri( ) ; // 小车向右运动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<250;i++){}}}void Delay1(void)//空5个指令{unsigned char i=13;while(i)i--;}//******************************************************* //单片机初始化//******************************************************* void Init8952(){TMOD = 0x02; //定时器0工作与方式2EX1=1; //开启外部中断1IT1=1; // 设置成下降沿触发方式TH0=0x9B; // 装入定时器0的初值TL0=0x9B;ET0=1; // 定时器0允许中断TR0=1; // 启动定时器0EA = 1 ;// 开总中断}//******************************************************** //电机控制函数index-电机号(1,2); speed-电机速度(-100到+100) //******************************************************** void motor(uchar index, char speed){if(speed>=-100 && speed<=100){if(index==1) // 电机1的处理{m1=abs(speed); // 取速度的绝对值if(speed<0) // 速度值为负则反转{IN1=0;IN2=1;}else // 不为负数则正转{IN1=1;IN2=0;}}if(index==2) // 电机2的处理{m2 = abs(speed); // 电机2的速度控制if(speed<0) // 电机2的方向控制{IN3 = 0;IN4 = 1;}else{IN3 = 1;IN4 = 0;}}}}//***************************************void Move_Fo( ) // 小车向前运动{P1 = ledmap[1];Motor(1,40);Delay(250) ;}void Move_Ba( ) // 小车向后运动{P1 = ledmap[2];Motor(1,-40) ;Delay(250) ;}void Move_Le( ) // 小车向左运动{P1 = ledmap[3];//Motor(1,40);Motor(2,90);Delay(30) ;Motor(1,80);Delay(50) ;}void Move_Ri( ) // 小车向右运动{P1 = ledmap[4];Motor(2,-90);Delay(30) ;//Delay(250) ;Motor(1,80);Delay(50) ;}void Move_Qi( )//加速{uchar i;P1 = ledmap[5];for(i=40;i<100;i+=15){Motor(1,i);// Motor(2,i-3);Delay(250) ;Delay(250) ;}}void Move_Sl()//减速{uchar j;P1 = ledmap[6];for(j=80;j>0;j-=8){Motor(1,j);Delay(250) ;Delay(250) ;}}void Stop( ) //小车停止{P1 = ledmap[0];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://快速运行Move_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(t<tmp1)ENa = 1 ;elseENa = 0 ; // 产生电机1的PWM信号if(t<tmp2)ENb = 1 ;elseENb = 0 ; // 产生电机2的PWM信号t++;if(t>=100) // 1个PWM信号由100次中断产生t = 0 ;}//********************************************************void hongwai(void) interrupt 2 //外部中断1 ,INT1(P3^3)连接红外线接收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;}{//循环接收33位数据,为何我们用到66位数组,我们可以不接收高电平时间常数,只接低电平常数就//可以判断1或0了,在这里我们都接收,为串口调试软件接收计算波形//还有一点要知道,接收波形是反向,在没有接收时端口为高电平tmp=0;l_lhj[i]=1;//时间量从1开始while(!hwx){//检测高低电平的变化l_lhj[i]++;//没变继续加1Delay1();//加入延时,是因为我们采用8位二进来存储,如果不加延时,时间量将计满tmp++;//此变量为防止干扰带来的死循环if(tmp==250)break;}i++;tmp=0;l_lhj[i]=1;//时间量从1开始while(hwx){//检测高低电平的变化l_lhj[i]++;//没变继续加1Delay1();//同上tmp++;if(tmp==250)break;}i++;j--;}i=255;//加入循环延时,抗干扰while(i){tmp=255;while(tmp){tmp--;}i--;}tmp=0;for(i=3;i<19;i++,i++){//处理地址位,对低电平时间数据的数理,这里我们只处理地址码和指令码,引导码和反码我们就忽略tmp>>=1;//右移一位,接收低电平在前if(l_lhj[i]>30)//检测低电平时间超过30就确认为1tmp+=0x80;}for(i=35;i<51;i++,i++){//同上,这里处理指令位tmp>>=1;if(l_lhj[i]>30)tmp+=0x80;}key=tmp;EX1=1;}。

基于51单片机的红外智能遥控小车李秋玉李敏

基于51单片机的红外智能遥控小车李秋玉李敏

基于51单片机的红外智能遥控小车李秋玉李敏发布时间:2022-07-08T14:50:18.544Z 来源:《创新人才教育》2021年12月作者:李秋玉李敏[导读] 随着人工智能的快速发展,智能化小车在现实生活中应用越来越广。

湖南省衡阳市职业中等专业学校李秋玉湖南财经工业职业技术学院李敏 421002摘要:随着人工智能的快速发展,智能化小车在现实生活中应用越来越广。

采用51单片机为控制核心,应用红外遥控技术,数码显示技术,电机驱动技术等,实现了小车的无线运行控制、速度调节等功能,增强了小车的智能化程度。

关键词:51单片机;红外遥控;电机驱动;智能化;引言随着生活水平的不断提高,人们对于工作环境的要求也越来越高。

一些工作环境恶劣,或者危险系数比较高的岗位,人们越来越不想参与[1]。

然而,智能化的发展,很好的弥补了这方面的不足。

智能移动小车,能代替人们穿越一些危险、复杂的工作环境,装载各类智能化设备去完成工作任务,如灭火、环境监测和检修等[2,3,4]。

因此,智能车的研究在相关行业的电子设计竞赛,或者创新竞赛中都比较重视,同时也是各高校师生的热点研究方向[5]。

本文设计了一款基于51单片机的红外遥控智能小车,重点讲述了小车的硬件电路和软件程序。

设计测试结果表明,其智能化程度高,成本低廉,具有较大的应用前景和研究意义。

1、总体框架图本设计采用51单片机为控制核心,应用红外遥控技术和电机驱动技术实现对小车无线控制,同时采用数码显示技术,实现小车速度档位的显示。

其总体框架图如图1所示,主要包括单片机、红外接收模块、数码显示模块、电机驱动模块,以及电源模块。

红外接收模块接收红外信号,发送给单片机进行解码,单片机根据解码的信息,实现小车的智能控制和速度档位的显示,电源模块给其它模块提供电源。

2、硬件电路硬件电路主要包括单片机最小系统、红外收发电路、电机驱动电路、数码显示电路和电源电路。

单片机最小系统为硬件电路核心部分,是整个设计的数据处理中心;红外收发电路为信号来源与初处理电路;电机驱动电路为小车的运行控制电路;数码显示电路为小车速度档位显示电路;电源电路为整个智能小车提供合适的电源。

红外循迹小车c程序(舵机小车)

红外循迹小车c程序(舵机小车)

#include<reg52.h>sbit servo=P2^5;uint control=12;uint jishu;uint pianchu;sbit zuo11=P3^4; //为0为左边正转sbit zuo12=P3^5; //为1为左边正转sbit you21=P3^6; //为1为右边正转sbit you22=P3^7; //为0为右边正转uint sp,speed=3;uint ji=1,guang,bi; //判断循迹寻光变量uint stop1,stop2,stop3;void delay(uint a){uint b,c;for(b=a;b>0;b--)for(c=115;c>0;c--);}void qianjin() //可以当做延时函数来用{// P3=0x0f;// delay(speed);P3=0xf9;}void initial_T0(){TMOD=0x21;TH1=0x8c;TL1=0x8c;EA=1;ET1=1;TR1=1;}void xunji(){if(P1==0x00){qianjin();}// if(P1==0x20)// {// //加速// qianjin();// speed=2;// qianjin();// qianjin();// }if(P1==0x10){//左转qianjin();control+=1;qianjin();while(P1!=0x20){if(P1==0x08){//大角度左转qianjin();qianjin();control+=1;while(P1!=0x10){// if(P1==0x00) //偏出跑道,小车停止// {// speed=10000;// }pianchu++;if(pianchu>=20000){break;}}control-=1;qianjin();qianjin();}pianchu++;if(pianchu>=20000){break;}}pianchu=0;control-=1;qianjin();qianjin();}if(P1==0x40){//右转qianjin();control-=1;qianjin();while(P1!=0x20){if(P1==0x80){//大角度右转qianjin();control-=1;qianjin();while(P1!=0x40){// if(P1==0x00) //偏出跑道,小车停止// {// speed=10000;// }pianchu++;if(pianchu>=20000){break;}}qianjin();control+=1;qianjin();}pianchu++;if(pianchu>=20000){break;}}pianchu=0;qianjin();control+=1;qianjin();}}void main(){initial_T0();P1=0xf8;while(1){stop1=P1;if(stop1==stop2){stop3++;}else{stop3=0;}xunji();if(P1==0x80||P1==0x08||stop3>10000){P3=0x00;while(1);}stop2=P1;}}void T0_waytwo() interrupt 3 {if(jishu<control)servo=1;elseservo=0;jishu++;jishu=jishu%160;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*预处理命令*/#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时,忙,等待。

lcd-busy为0时,闲,可写指令与数据*/bit lcd_busy(){bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOP();result = (bit)(P0&0x80);LCD_EN = 0;return(result);}/*写指令数据到LCDRS=L,RW=L,E=高脉冲,D0-D7=指令码*/void lcd_wcmd(uchar cmd){while(lcd_busy());LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;_nop_();_nop_();P2 = cmd;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;}/*写显示数据到LCDRS=H,RW=L,E=高脉冲,D0-D7=数据*/void lcd_wdat(uchar dat){while(lcd_busy());LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;P2 = dat;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;}/*LCD初始化设定*/void lcd_init(){delay1(15);lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据delay1(5);lcd_wcmd(0x38);delay1(5);lcd_wcmd(0x38);delay1(5);lcd_wcmd(0x0c); //显示开,关光标delay1(5);lcd_wcmd(0x06); //移动光标delay1(5);lcd_wcmd(0x01); //清除LCD的显示内容delay1(5);}/*设定显示位置*/void lcd_pos(uchar pos){lcd_wcmd(pos | 0x80); //数据指针=80+地址变量}/*x显示速度提示符*/void display_sym(void){lcd_wdat('=');}/*显示速度数值*/void display_vel(uint x){uchar i,j,k,l;i=x/1000; //取千位j=(x%1000)/100; //取百位k=(x%100)/10; //取十位l=x%10; //取个位lcd_pos(0x02);lcd_wdat(digit[i]);lcd_wdat(digit[j]);lcd_wdat(digit[k]);lcd_wdat(digit[l]);}/*显示速度单位*/void display_unit(void){lcd_pos(0x06);lcd_wdat('r');lcd_wdat('/');lcd_wdat('m');lcd_wdat('i');lcd_wdat('n');}/*主函数*//*******************************************************************/ void main(){uint a;IRIN=1; //I/O口初始化IE=0x83; //允许总中断中断,使能INT0 外部中断TCON=TCON|0x01; //触发方式为脉冲负边沿触发lcd_init();TMOD=0x51;TH0=(65536-50000)/256;TL0=(65536-50000)/256;TR0=1;count=0;display_sym();display_vel(0);display_unit();lcd_pos(0x40);g=0;while(begin[g]!='\0'){lcd_wdat(begin[g]);g++;}while(1){TR1=1;TH1=0;TL1=0;flag=0;display_sym();display_unit();while(flag==0);v=(TH1*256+TL1)*60/20;display_vel(v);}/**********************************************************/void IR_IN() interrupt 0 using 0{unsigned char j,k,N=0;unsigned char q=0;EX0 = 0;delay(15);if (IRIN==1){EX0 =1;return;}//确认IR信号出现while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。

delay(1);for (j=0;j<4;j++) //收集四组数据{for (k=0;k<8;k++) //每组数据有8位{while (IRIN) //等IR 变为低电平,跳过4.5ms的前导高电平信号。

{delay(1);}while (!IRIN) //等IR 变为高电平delay(1);while (IRIN) //计算IR高电平时长{delay(1);N++;if (N>=30){EX0=1;return;} //0.14ms计数过长自动离开。

} //高电平计数完毕IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”if(N>=8){IRCOM[j] = IRCOM[j] | 0x80; //数据最高位补“1”}N=0;}}if(IRCOM[2]!=~IRCOM[3]){EX0=1;return;}IRCOM[5]=IRCOM[2] & 0x0F; //取键码的低四位IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位变为低四位if(IRCOM[5]>9){IRCOM[5]=IRCOM[5]+0x37;}elseIRCOM[5]=IRCOM[5]+0x30;if(IRCOM[6]>9){IRCOM[6]=IRCOM[6]+0x37;}elseIRCOM[6]=IRCOM[6]+0x30;q= (((IRCOM[6]&0x0f)<<4) + (IRCOM[5]&0x0f));switch(q) //判断按键键码值{case 0x16:m=0;break; //串口发送0case 0x03:m=1;t++;if(t>=5)t=4;break; //串口发送01case 0x18:m=2;n=2;break; //串口发送02case 0x55:m=3;t--;if(t<=0)t=0;break; //串口发送03case 0x08:m=4;n=4;break; //串口发送04case 0x13:m=5;n=5;break; //串口发送05case 0x51:m=6;n=6;break; //串口发送06case 0x42:m=7;break; //串口发送07case 0x52:m=8;n=8;break; //串口发送08case 0x41:m=9;break; //串口发送09default :break;}lcd_display();EX0 = 1;}/***************延时函数*****************************/ void delay(unsigned char x) //x*0.14MS{unsigned char i;while(x--){for (i = 0; i<13; i++) {}}}void lcd_display(){g=0;switch( m){case 1: lcd_init();lcd_pos(0x40);while(cdis1[g]!='\0') //减速{lcd_wdat(cdis1[g]);g++;}break;case 2: lcd_init();lcd_pos(0x40); //前进while(cdis2[g]!='\0'){lcd_wdat(cdis2[g]);g++;}break;case 3: lcd_init();lcd_pos(0x40); //加速while(cdis3[g]!='\0'){lcd_wdat(cdis3[g]);g++;}break;case 4: lcd_init();lcd_pos(0x40); //左转while(cdis4[g]!='\0'){lcd_wdat(cdis4[g]);g++;}break;case 5: lcd_init();lcd_pos(0x40); //停车while(cdis5[g]!='\0'){lcd_wdat(cdis5[g]);g++;}break;case 6: lcd_init();lcd_pos(0x40); //右转while(cdis6[g]!='\0'){lcd_wdat(cdis6[g]);g++;} break;case 8: lcd_init();lcd_pos(0x40); //倒车while(cdis8[g]!='\0'){lcd_wdat(cdis8[g]);g++;}break;default :break;}}void motor(){EN12=1;EN34=1;switch( n){ case 2: //前进M1=1;M2=0;M3=1;M4=0;/* delayxms(5-t);M1=0;M3=0;elayxms(t); */break;case 4: //左转M1=0;M2=0;M3=1;M4=0;/*delayxms(5-t);M1=0;M3=0;layxms(t+1); */break;case 6: //右转M1=1;M2=0;M3=0;M4=0;/*delayxms(5-t);M1=0;M3=0;layxms(t+1); */break;case 8: //后退M1=0;M2=1;M3=0;M4=1;/*delayxms(5-t);M2=0;M4=0;layxms(t); */break;case 5:EN12=0;EN34=0;break;default :break;}}/*******************************************************函数功能:定时器T0的中断服务函数********************************************************/void Time0(void ) interrupt 1 using 1 //定时器T0的中断编号为1,使用第1组工作寄存器{count++; //T0每中断1次,count加1if(count==20) //若累计满20次,即计满1秒钟{flag=1; //计满1秒钟标志位置1count=0; //清0,重新统计中断次数}TH0=(65536-46083)/256; //定时器T0高8位重新赋初值TL0=(65536-46083)%256; //定时器T0低8位重新赋初值}void delay1(int ms){unsigned char y;while(ms--){for(y = 0; y<250; y++){_nop_();_nop_();_nop_();_nop_();}}}//************************************************************void delayxms(uchar t){uint i;uchar j;for(j=t;j>0;j--)for(i=80;i>0;i--); //延时124*8+10=1002us}。

相关文档
最新文档