基于单片机的红外遥控小车系统设计.doc
《基于单片机的红外遥控小车系统设计.doc》由会员分享,可在线阅读,更多相关《基于单片机的红外遥控小车系统设计.doc(30页珍藏版)》请在冰点文库上搜索。
红外接收与控件电路原理图:
141
红外遥控器原理图:
红外遥控器实物图:
红外接收与控制实物图:
程序:
接收控制主程序:
#include
#include"hongwai.c"
#include"5110.c"
sbithy=P0^0;//LED指示灯
sbithz=P2^0;
sbitqy=P1^4;
sbitqz=P3^7;
sbitdjf1=P1^0;//电机1的方向控制
sbitdjd1=P1^1;//电机1的动力控制
sbitdjf2=P1^2;//电机2的方向控制
sbitdjd2=P1^3;//电机2的动力控制
unsignedcharflag,flag1,PW;
bitfan,fan1,tf=0;
unsignedcharfafg=0;
unsignedchartime_flag;
unsignedchardatatime[2];
//=====================================
//ms延时
voiddelayms(unsignedintms)
{
unsignedchari;
while(ms--)
for(i=0;i<120;i++);
}
//LED灯闪烁
voidLED(unsignedcharms)
for(i=0;i { delayms(200); qz=~qz; qy=~qy; hz=~hz; hy=~hy; }}//======================================//控制//=====================================voidkongzi(void){ switch(shu[2]) { case0x20:{//前进 fafg=1; qz=qy=0; hz=hy=1; TR1=ET1=1; djd1=djd2=1; djf1=djf2=0; fan=0; break; } case0x30:{//后退 fafg=2; qz=qy=1; hz=hy=0; TR1=ET1=1; djd1=djd2=1; djf1=djf2=1; fan=1; break; } case0x40:{//前左转弯 fafg=3; djf1=djf2=0; qz=0; qy=hz=hy=1; djd1=1; djd2=0; fan1=0; TR1=ET1=1; break; } case0x60: {//后左转弯 fafg=4; djf1=djf2=1; hz=0; hy=qz=qy=1; djd1=1; djd2=0; fan1=0; TR1=ET1=1; break; } case0x50:{//前右转弯 fafg=5; djf1=djf2=0; qy=0; qz=hy=hz=1; djd1=0; djd2=1; fan1=1; TR1=ET1=1; break; } case0x70: {//后退 fafg=6; djf1=djf2=1; hy=0; hz=qz=qy=1; djd1=0; djd2=1; fan1=1; TR1=ET1=1; break; } case0x80:{ if(tf==1) { qy=qz=hy=hz=1; TR1=ET1=0; djd1=djd2=0; NOKIA5110_clear(); //清屏 W_LCD_chinese(20,0,21);//停 W_LCD_chinese(40,0,22);//止 W_LCD_zifu(15,3,time[1]/10);// W_LCD_zifu(23,3,time[1]%10);// W_LCD_zifu(33,3,11);//: W_LCD_zifu(42,3,time[0]/10);// W_LCD_zifu(50,3,time[0]%10);// time[0]=time[1]=0; tf=0; } break; } }}//***********************************************//显示//************************************************voidLCD_display(void){ NOKIA5110_clear(); //清屏 W_LCD_zifu(15,3,time[1]/10);// W_LCD_zifu(23,3,time[1]%10);// W_LCD_zifu(33,3,11);//: W_LCD_zifu(42,3,time[0]/10);// W_LCD_zifu(50,3,time[0]%10);// if(fafg==1) { W_LCD_chinese(20,0,0);//前 W_LCD_chinese(40,0,1);//进 } if(fafg==2) { W_LCD_chinese(20,0,2);//后 W_LCD_chinese(40,0,3);//退 } if(fafg==3) { W_LCD_chinese(5,0,0);//前 W_LCD_chinese(25,0,4);//左 W_LCD_chinese(45,0,5);//转 W_LCD_chinese(65,0,6);//弯 } if(fafg==4) { W_LCD_chinese(5,0,2);//后 W_LCD_chinese(25,0,4);//左 W_LCD_chinese(45,0,5);//转 W_LCD_chinese(65,0,6);//弯 } if(fafg==5) { W_LCD_chinese(5,0,0);//前 W_LCD_chinese(25,0,7);//右 W_LCD_chinese(45,0,5);//转 W_LCD_chinese(65,0,6);//弯 } if(fafg==6) { W_LCD_chinese(5,0,2);//后 W_LCD_chinese(25,0,7);//右 W_LCD_chinese(45,0,5);//转 W_LCD_chinese(65,0,6);//弯 }}//=====================================//定时器T1//=====================================voidwan_T1(void)interrupt3{ time_flag++; tf=1; TH1=(65536-50000)/256; TL1=(65536-50000)%256; if(time_flag>15) { time[0]++; time_flag=0; if(time[0]>59) { time[0]=0; time[1]++; if(time[1]>59)time[1]=0; } }}//=====================================//主函数//=====================================voidmain(void){ djd1=djd2=0; NOKIA5110_init(); NOKIA5110_clear(); //清屏 W_LCD_chinese(0,0,8);//正 delayms(100); W_LCD_chinese(15,0,9);//在 delayms(100); W_LCD_chinese(30,0,10);//初 delayms(100); W_LCD_chinese(45,0,11);//始 delayms(100); W_LCD_chinese(60,0,12);//化 delayms(100); W_LCD_chinese(10,3,13);//请 delayms(100); W_LCD_chinese(25,3,14);//稍 delayms(100); W_LCD_chinese(40,3,2);//后 delayms(100); W_LCD_zifu(60,3,10);//... PW=20; TH1=(65536-50000)/256; TL1=(65536-50000)%256; IP=0x09;//设置中断优先级 IPH=0x08; open_interrupt(); TR1=ET1=0; LED(10); qy=qz=hy=hz=1; NOKIA5110_clear(); //清屏 W_LCD_chinese(1,0,10);//初 delayms(100); W_LCD_chinese(16,0,11);//始 delayms(100); W_LCD_chinese(31,0,12);//化 delayms(100); W_LCD_chinese(46,0,15);//完 delayms(100); W_LCD_chinese(61,0,16);//成 delayms(100); W_LCD_chinese(0,3,17);//等 delayms(100); W_LCD_chinese(15,3,18);//待 delayms(100); W_LCD_chinese(30,3,19);//信 delayms(100); W_LCD_chinese(45,3,20);//号 delayms(100); W_LCD_zifu(65,3,10);//... while(1) { kongzi(); if(tf==1&&time_flag==7)LCD_display(); }} 红外解码: /*************************************************************************//**** 红外解码/*** 晶振:11.0592MHZ/*** 数据口:外中断0/*** 计数器:定时器T0/************************************************************************/#includesbitDat=P3^2; //数据口bittru;unsignedcharshu[4];/****************开中断************************/voidopen_interrupt(void){ TMOD=0x11; //定时器T0工作在方式1 IT0=1; //中断0在下降沿触发 TR0=1; EX0=1; //开外部中断0 EA=1; //开中断}/**************接收数据**********************/voidR_Dat(void)interrupt0{ unsignedchari,j; unsignedintdtime=0; unsignedchartemp;//P1=0xff; TH0=TL0=0; while(!Dat) { if(TH0*256+TL0>20000) return; } while(Dat) if(TH0*256+TL0>20000) return; dtime=TH0*256+TL0; TH0=TL0=0; if(8000 { for(i=0;i<4;i++) { temp=0; for(j=0;j<8;j++) { while(!Dat) { if(TH0*256+TL0>20000)return; } while(Dat) { if(TH0*256+TL0>20000)return; } dtime=TH0*256+TL0; TH0=TL0=0; if(1450>1)|0x80;}//是否为1 elseif(700>1)|0x00;}//是否为0 } shu[i]=temp; } if(shu[0]==~shu[1]&&shu[2]==~shu[3])tru=1;//查错 } }LCD5110驱动程序: #include#include"ziku.C"//-----------------管脚定义-------------------------sbit LCD_sce=P2^7; //片选,低最平有效sbit LCD_rst=P2^6; //复位,0复位sbit LCD_dc =P2^5; //1写数据,0写指令sbit LCD_sdin=P2^4; //数据sbit LCD_sclk=P2^3; //时钟 //**********************************************************************//NOKIA5110_w_byte :使用SPI接口写数据到LCD//输入参数:data :写入的数据;// command:写数据/命令选择;//**********************************************************************voidNOKIA5110_w_byte(unsignedchardat,unsignedcharcommand){ unsignedchari; LCD_sce=0; //LCD使能 LCD_dc=command;// for(i=0;i<8;i++) //传输8位数据(1个字节) { if(dat&0x80)LCD_sdin=1; else LCD_sdin=0; dat=dat<<1; LCD_sclk=0; LCD_sclk=1; } LCD_sce=1; //LCD不使能}//********************************************************************** //NOKIA5110_init:LCD初始化 //**********************************************************************voidNOKIA5110_init(void){ unsignedchark; LCD_rst=0; for(k=0;k<250;k++); LCD_rst=1; //------------------------------------------------------------- NOKIA5110_w_byte(0x21,0); //使用扩展命令设置LCD模式 NOKIA5110_w_byte(0xd0,0); //设置偏置电压 NOKIA5110_w_byte(0x06,0); //温度校正 NOKIA5110_w_byte(0x13,0); //1:48 NOKIA5110_w_byte(0x20,0); //使用基本命令 NOKIA5110_w_byte(0x0c,0); //设定显示模式,正常显示}//**********************************************************************//NOKIA5110_set_XY:设置LCD坐标函数//输入参数:X:0-83// Y:0-5//**********************************************************************voidNOKIA5110_set_XY(unsignedcharx,unsignedchary){ NOKIA5110_w_byte(0x40|y,0); //列(竖) NOKIA5110_w_byte(0x80|x,0); //行(横)}//*********************************************************************//写汉字到LCD//*********************************************************************voidW_LCD_chinese(unsignedcharX,unsignedcharY,unsignedchardat){ unsignedchari; NOKIA5110_set_XY(X,Y); for(i=0;i<16;i++)NOKIA5110_w_byte(hanzi[dat][i],1); NOKIA5110_set_XY(X,Y+1); for(i=16;i<32;i++)NOKIA5110_w_byte(hanzi[dat][i],1);}//***********************************************************
delayms(200);
qz=~qz;
qy=~qy;
hz=~hz;
hy=~hy;
//======================================
//控制
voidkongzi(void)
switch(shu[2])
case0x20:
{//前进
fafg=1;
qz=qy=0;
hz=hy=1;
TR1=ET1=1;
djd1=djd2=1;
djf1=djf2=0;
fan=0;
break;
case0x30:
{//后退
fafg=2;
qz=qy=1;
hz=hy=0;
djf1=djf2=1;
fan=1;
case0x40:
{//前左转弯
fafg=3;
qz=0;
qy=hz=hy=1;
djd1=1;
djd2=0;
fan1=0;
case0x60:
{//后左转弯
fafg=4;
hz=0;
hy=qz=qy=1;
case0x50:
{//前右转弯
fafg=5;
qy=0;
qz=hy=hz=1;
djd1=0;
djd2=1;
fan1=1;
case0x70:
fafg=6;
hy=0;
hz=qz=qy=1;
case0x80:
if(tf==1)
qy=qz=hy=hz=1;
TR1=ET1=0;
djd1=djd2=0;
NOKIA5110_clear(); //清屏
W_LCD_chinese(20,0,21);//停
W_LCD_chinese(40,0,22);//止
W_LCD_zifu(15,3,time[1]/10);//
W_LCD_zifu(23,3,time[1]%10);//
W_LCD_zifu(33,3,11);//:
W_LCD_zifu(42,3,time[0]/10);//
W_LCD_zifu(50,3,time[0]%10);//
time[0]=time[1]=0;
tf=0;
//***********************************************
//显示
//************************************************
voidLCD_display(void)
if(fafg==1)
W_LCD_chinese(20,0,0);//前
W_LCD_chinese(40,0,1);//进
if(fafg==2)
W_LCD_chinese(20,0,2);//后
W_LCD_chinese(40,0,3);//退
if(fafg==3)
W_LCD_chinese(5,0,0);//前
W_LCD_chinese(25,0,4);//左
W_LCD_chinese(45,0,5);//转
W_LCD_chinese(65,0,6);//弯
if(fafg==4)
W_LCD_chinese(5,0,2);//后
if(fafg==5)
W_LCD_chinese(25,0,7);//右
if(fafg==6)
//定时器T1
voidwan_T1(void)interrupt3
time_flag++;
tf=1;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(time_flag>15)
time[0]++;
time_flag=0;
if(time[0]>59)
time[0]=0;
time[1]++;
if(time[1]>59)time[1]=0;
//主函数
voidmain(void)
NOKIA5110_init();
W_LCD_chinese(0,0,8);//正
delayms(100);
W_LCD_chinese(15,0,9);//在
W_LCD_chinese(30,0,10);//初
W_LCD_chinese(45,0,11);//始
W_LCD_chinese(60,0,12);//化
W_LCD_chinese(10,3,13);//请
W_LCD_chinese(25,3,14);//稍
W_LCD_chinese(40,3,2);//后
W_LCD_zifu(60,3,10);//...
PW=20;
IP=0x09;//设置中断优先级
IPH=0x08;
open_interrupt();
LED(10);
W_LCD_chinese(1,0,10);//初
W_LCD_chinese(16,0,11);//始
W_LCD_chinese(31,0,12);//化
W_LCD_chinese(46,0,15);//完
W_LCD_chinese(61,0,16);//成
W_LCD_chinese(0,3,17);//等
W_LCD_chinese(15,3,18);//待
W_LCD_chinese(30,3,19);//信
W_LCD_chinese(45,3,20);//号
W_LCD_zifu(65,3,10);//...
while
(1)
kongzi();
if(tf==1&&time_flag==7)LCD_display();
红外解码:
/*************************************************************************/
/**** 红外解码
/*** 晶振:
11.0592MHZ
/*** 数据口:
外中断0
/*** 计数器:
定时器T0
/************************************************************************/
sbitDat=P3^2; //数据口
bittru;
unsignedcharshu[4];
/****************开中断************************/
voidopen_interrupt(void)
TMOD=0x11; //定时器T0工作在方式1
IT0=1; //中断0在下降沿触发
TR0=1;
EX0=1; //开外部中断0
EA=1; //开中断
/**************接收数据**********************/
voidR_Dat(void)interrupt0
unsignedchari,j;
unsignedintdtime=0;
unsignedchartemp;
//P1=0xff;
TH0=TL0=0;
while(!
Dat)
if(TH0*256+TL0>20000) return;
while(Dat)
dtime=TH0*256+TL0;
if(8000 { for(i=0;i<4;i++) { temp=0; for(j=0;j<8;j++) { while(!Dat) { if(TH0*256+TL0>20000)return; } while(Dat) { if(TH0*256+TL0>20000)return; } dtime=TH0*256+TL0; TH0=TL0=0; if(1450>1)|0x80;}//是否为1 elseif(700>1)|0x00;}//是否为0 } shu[i]=temp; } if(shu[0]==~shu[1]&&shu[2]==~shu[3])tru=1;//查错 } }LCD5110驱动程序: #include#include"ziku.C"//-----------------管脚定义-------------------------sbit LCD_sce=P2^7; //片选,低最平有效sbit LCD_rst=P2^6; //复位,0复位sbit LCD_dc =P2^5; //1写数据,0写指令sbit LCD_sdin=P2^4; //数据sbit LCD_sclk=P2^3; //时钟 //**********************************************************************//NOKIA5110_w_byte :使用SPI接口写数据到LCD//输入参数:data :写入的数据;// command:写数据/命令选择;//**********************************************************************voidNOKIA5110_w_byte(unsignedchardat,unsignedcharcommand){ unsignedchari; LCD_sce=0; //LCD使能 LCD_dc=command;// for(i=0;i<8;i++) //传输8位数据(1个字节) { if(dat&0x80)LCD_sdin=1; else LCD_sdin=0; dat=dat<<1; LCD_sclk=0; LCD_sclk=1; } LCD_sce=1; //LCD不使能}//********************************************************************** //NOKIA5110_init:LCD初始化 //**********************************************************************voidNOKIA5110_init(void){ unsignedchark; LCD_rst=0; for(k=0;k<250;k++); LCD_rst=1; //------------------------------------------------------------- NOKIA5110_w_byte(0x21,0); //使用扩展命令设置LCD模式 NOKIA5110_w_byte(0xd0,0); //设置偏置电压 NOKIA5110_w_byte(0x06,0); //温度校正 NOKIA5110_w_byte(0x13,0); //1:48 NOKIA5110_w_byte(0x20,0); //使用基本命令 NOKIA5110_w_byte(0x0c,0); //设定显示模式,正常显示}//**********************************************************************//NOKIA5110_set_XY:设置LCD坐标函数//输入参数:X:0-83// Y:0-5//**********************************************************************voidNOKIA5110_set_XY(unsignedcharx,unsignedchary){ NOKIA5110_w_byte(0x40|y,0); //列(竖) NOKIA5110_w_byte(0x80|x,0); //行(横)}//*********************************************************************//写汉字到LCD//*********************************************************************voidW_LCD_chinese(unsignedcharX,unsignedcharY,unsignedchardat){ unsignedchari; NOKIA5110_set_XY(X,Y); for(i=0;i<16;i++)NOKIA5110_w_byte(hanzi[dat][i],1); NOKIA5110_set_XY(X,Y+1); for(i=16;i<32;i++)NOKIA5110_w_byte(hanzi[dat][i],1);}//***********************************************************
for(i=0;i<4;i++)
temp=0;
for(j=0;j<8;j++)
if(TH0*256+TL0>20000)return;
if(1450>1)|0x80;}//是否为1
elseif(700>1)|0x00;}//是否为0
shu[i]=temp;
if(shu[0]==~shu[1]&&shu[2]==~shu[3])tru=1;//查错
LCD5110驱动程序:
#include"ziku.C"
//-----------------管脚定义-------------------------
sbit LCD_sce=P2^7; //片选,低最平有效
sbit LCD_rst=P2^6; //复位,0复位
sbit LCD_dc =P2^5; //1写数据,0写指令
sbit LCD_sdin=P2^4; //数据
sbit LCD_sclk=P2^3; //时钟
//**********************************************************************
//NOKIA5110_w_byte :
使用SPI接口写数据到LCD
//输入参数:
data :
写入的数据;
// command:
写数据/命令选择;
voidNOKIA5110_w_byte(unsignedchardat,unsignedcharcommand)
LCD_sce=0; //LCD使能
LCD_dc=command;//
for(i=0;i<8;i++) //传输8位数据(1个字节)
if(dat&0x80)LCD_sdin=1;
else LCD_sdin=0;
dat=dat<<1;
LCD_sclk=0;
LCD_sclk=1;
LCD_sce=1; //LCD不使能
//NOKIA5110_init:
LCD初始化
voidNOKIA5110_init(void)
unsignedchark;
LCD_rst=0;
for(k=0;k<250;k++);
LCD_rst=1;
//-------------------------------------------------------------
NOKIA5110_w_byte(0x21,0); //使用扩展命令设置LCD模式
NOKIA5110_w_byte(0xd0,0); //设置偏置电压
NOKIA5110_w_byte(0x06,0); //温度校正
NOKIA5110_w_byte(0x13,0); //1:
48
NOKIA5110_w_byte(0x20,0); //使用基本命令
NOKIA5110_w_byte(0x0c,0); //设定显示模式,正常显示
//NOKIA5110_set_XY:
设置LCD坐标函数
X:
0-83
// Y:
0-5
voidNOKIA5110_set_XY(unsignedcharx,unsignedchary)
NOKIA5110_w_byte(0x40|y,0); //列(竖)
NOKIA5110_w_byte(0x80|x,0); //行(横)
//*********************************************************************
//写汉字到LCD
voidW_LCD_chinese(unsignedcharX,unsignedcharY,unsignedchardat)
NOKIA5110_set_XY(X,Y);
for(i=0;i<16;i++)NOKIA5110_w_byte(hanzi[dat][i],1);
NOKIA5110_set_XY(X,Y+1);
for(i=16;i<32;i++)NOKIA5110_w_byte(hanzi[dat][i],1);
//***********************************************************
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2