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

上传人:b****3 文档编号:2590224 上传时间:2022-11-02 格式:DOC 页数:7 大小:138.55KB
下载 相关 举报
基于51单片机的红外遥控智能小车源程序(C语言).doc_第1页
第1页 / 共7页
基于51单片机的红外遥控智能小车源程序(C语言).doc_第2页
第2页 / 共7页
基于51单片机的红外遥控智能小车源程序(C语言).doc_第3页
第3页 / 共7页
基于51单片机的红外遥控智能小车源程序(C语言).doc_第4页
第4页 / 共7页
基于51单片机的红外遥控智能小车源程序(C语言).doc_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

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

《基于51单片机的红外遥控智能小车源程序(C语言).doc》由会员分享,可在线阅读,更多相关《基于51单片机的红外遥控智能小车源程序(C语言).doc(7页珍藏版)》请在冰豆网上搜索。

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

/*预处理命令*/

#include//包含单片机寄存器的头文件

#include//包含_nop_()函数定义的头文件

#defineucharunsignedchar

#defineuintunsignedint

#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};

sbitIRIN=P3^2;//红外接收器数据线

sbitLCD_RS=P0^7;

sbitLCD_RW=P0^6;

sbitLCD_EN=P0^5;

ucharbegin[]={"Mycar!

"};

ucharcdis1[]={"jiansu!

"};

ucharcdis2[]={"qianjin!

"};

ucharcdis3[]={"jiasu!

"};

ucharcdis4[]={"zuozhuang!

"};

ucharcdis5[]={"STOP!

"};

ucharcdis6[]={"youzhuan!

"};

ucharcdis8[]={"daoche!

"};

sbitM1=P1^0;

sbitM2=P1^1;

sbitM3=P1^2;

sbitM4=P1^3;

sbitEN12=P1^4;

sbitEN34=P1^5;

ucharIRCOM[7];

ucharm,n;

uchart=2;

ucharg;

ucharcodedigit[]={"0123456789"};

uintv;

ucharcount;

bitflag;

voiddelayxms(uchart);

voiddelay(unsignedcharx);

voiddelay1(intms);

voidmotor();

voidlcd_display();

/*

检查LCD忙状态

lcd_busy为1时,忙,等待。

lcd-busy为0时,闲,可写指令与数据

*/

bitlcd_busy()

{

bitresult;

LCD_RS=0;

LCD_RW=1;

LCD_EN=1;

delayNOP();

result=(bit)(P0&0x80);

LCD_EN=0;

return(result);

}

/*

写指令数据到LCD

RS=L,RW=L,E=高脉冲,D0-D7=指令码

*/

voidlcd_wcmd(ucharcmd)

{

while(lcd_busy());

LCD_RS=0;

LCD_RW=0;

LCD_EN=0;

_nop_();

_nop_();

P2=cmd;

delayNOP();

LCD_EN=1;

delayNOP();

LCD_EN=0;

}

/*

写显示数据到LCD

RS=H,RW=L,E=高脉冲,D0-D7=数据

*/

voidlcd_wdat(uchardat)

{

while(lcd_busy());

LCD_RS=1;

LCD_RW=0;

LCD_EN=0;

P2=dat;

delayNOP();

LCD_EN=1;

delayNOP();

LCD_EN=0;

}

/*

LCD初始化设定

*/

voidlcd_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);

}

/*

设定显示位置

*/

voidlcd_pos(ucharpos)

{

lcd_wcmd(pos|0x80);//数据指针=80+地址变量

}

/*x显示速度提示符*/

voiddisplay_sym(void)

{

lcd_pos(0x00);

lcd_wdat('v');

lcd_wdat('=');

}

/*显示速度数值*/

voiddisplay_vel(uintx)

{

uchari,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]);

}

/*显示速度单位*/

voiddisplay_unit(void)

{

lcd_pos(0x06);

lcd_wdat('r');

lcd_wdat('/');

lcd_wdat('m');

lcd_wdat('i');

lcd_wdat('n');

}

/*

主函数

*/

/*******************************************************************/

voidmain()

{

uinta;

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);

motor();

}

}

/**********************************************************/

voidIR_IN()interrupt0using0

{

unsignedcharj,k,N=0;

unsignedcharq=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;

}

else

IRCOM[5]=IRCOM[5]+0x30;

if(IRCOM[6]>9)

{

IRCOM[6]=IRCOM[6]+0x37;

}

else

IRCOM[6]=IRCOM[6]+0x30;

q=(((IRCOM[6]&0x0f)<<4)+(IRCOM[5]&0x0f));

switch(q)//判断按键键码值

{

case0x16:

m=0;break;//串口发送0

case0x03:

m=1;t++;if(t>=5)t=4;break;//串口发送01

case0x18:

m=2;n=2;break;//串口发送02

case0x55:

m=3;t--;if(t<=0)t=0;break;//串口发送03

case0x08:

m=4;n=4;break;//串口发送04

case0x13:

m=5;n=5;break;

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

当前位置:首页 > 经管营销 > 财务管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1