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

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

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

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

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

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

P2=cmd;

delayNOP();

LCD_EN=1;

写显示数据到LCD

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

voidlcd_wdat(uchardat)

LCD_RS=1;

P2=dat;

LCD初始化设定

voidlcd_init()

{

delay1(15);

lcd_wcmd(0x38);

//16*2显示,5*7点阵,8位数据

delay1(5);

lcd_wcmd(0x0c);

//显示开,关光标

lcd_wcmd(0x06);

//移动光标

lcd_wcmd(0x01);

//清除LCD的显示内容

设定显示位置

voidlcd_pos(ucharpos)

lcd_wcmd(pos|0x80);

//数据指针=80+地址变量

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

voiddisplay_sym(void)

{

lcd_pos(0x00);

lcd_wdat('

v'

);

='

/*显示速度数值*/

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

r'

/'

m'

i'

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高电平时长

{

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;

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]>

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

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;

//串口发送01

case0x18:

m=2;

n=2;

//串口发送02

case0x55:

m=3;

t--;

if(t<

=0)t=0;

//串口发送03

case0x08:

m=4;

n=4;

//串口发送04

case0x13:

m=5;

n=5;

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

当前位置:首页 > 法律文书 > 判决书

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

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