智能小车资料及源程序Word格式文档下载.docx
《智能小车资料及源程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《智能小车资料及源程序Word格式文档下载.docx(26页珍藏版)》请在冰点文库上搜索。
1)
性价比高,LCD1602可以显示32个字符,而Nokia5110可以显示15个汉字,30个字符。
Nokia5110裸屏仅8.8元,LCD1602一般15元左右,LCD12864一般50~70元。
2)
接口简单,仅四根I/O线即可驱动,LCD1602需11根I/O线,LCD12864需12根。
3)
速度快,是LCD12864的20倍,是LCD1602的40倍。
4)
Nokia5110工作电压3.3V,正常显示时工作电流200uA以下,具有掉电模式,适合电池供电的便携式移动设备。
Nokia5110原理图:
商家把该引出的管脚都引出了,下面就可以连接C8051F的相应管脚,写程序驱动5110了。
Nokia5110和Nokia3110是兼容的,用的都是同一款驱动芯片PHILIPSPCD8544。
(1)
SPI接口时序写数据/命令
Nokia5110(PCD8544)的通信协议是一个没有MISO只有MOSI的SPI协议,如果单片机有富裕的SPI接口,也可以利用硬件SPI,但通常没有必要,只需要软件程序模拟即可。
智能避障小车原理图
一下是小车各个模块原理图逐一展示
1.12v及5v直流稳压电源
2.L298电机驱动模块
3.51单片机控制模块
4.。
声光信号产生模块
以下是
二、电机驱动模块,超声波测距避障,声光信号产生,PWM调速源程序
/*
用T0计时器中断进行对小车方向的调节
用INT0外部中断进行声光报警
用INT1外部中断进行超声避障
用T1计时器进行对时间的测量
*/
#include<
reg52.h>
stdio.h>
sbitP00=P1^0;
//循迹口
sbitP01=P1^1;
sbitP02=P1^2;
sbitP03=P0^3;
//声光信号P03接蜂鸣器,P04接LED
sbitP04=P0^4;
sbitP20=P2^0;
//电机1左轮
sbitP21=P2^1;
sbitP22=P2^2;
//电机2
sbitP23=P2^3;
voidzhuanxiang(char,char,char);
voiddelay1ms(void);
voiddelaynms(int);
unsignedinti=0,j=0;
//特殊情况旗标
voidkongzhi(void)interrupt1//PWM信号进行电机控制
{
if(P00==0&
&
P01==1&
P02==0)//小车直线快走定时0.02ms
{
TH0=0X1F;
TL0=0XEC;
P20=0;
//电机1左轮
P21=1;
P22=1;
//电机2右转
P23=0;
}
P01==0&
P02==1)//小车右转定时0.05ms
{
TL0=0XCE;
P20=1;
//电机1左轮
//电机2
i=1;
}
P02==0&
i==1)//特别
{
TH0=0X1F;
TL0=0XCE;
P22=1;
P23=0;
j=0;
}
if(P00==1&
P02==0)//小车左转定时0.05ms
{
TH0=0X1F;
//电机1
P21=1;
//电机2
P23=1;
j=1;
j==1)//特别
{
TH0=0X1F;
TL0=0XCE;
P23=1;
i=0;
}
P02==1)
{//全部检测到黑线时车停
}
voidshengguang(void)interrupt0//停车并产生声光2s
unsignedinti,j;
P20=1;
P21=1;
P22=1;
P23=1;
delaynms(500);
for(i=0;
i<
20;
i++)
P04=0;
for(j=0;
j<
100;
j++)
P03=0;
delay1ms();
P03=~P03;
}
P03=1;
//关闭声光
P04=1;
delaynms(500);
P20=0;
//继续行车
voidchaoshengbo(void)interrupt2//超声波测距避障程序
voidmain()
while
(1)
P21=1;
P22=1;
P23=1;
//小车停
P04=1;
PX0=1;
TMOD=0X10;
//T0用方式0,T1用方式1
EA=1;
//开启中断总开关
EX0=1;
//T0中断
EX1=1;
//T1中断
ET0=1;
//INT0中断
ET1=1;
//INT1中断
TR1=1;
//开启T1计时器
zhuanxiang(P00,P01,P02);
voidzhuanxiang(charP00,charP01,charP02)
if(P00==0&
P02==0)//小车直走
{//0.01ms
TL0=0XF6;
;
TR0=1;
}
P02==1)//小车右转定时0.05ms
{
TH0=0X1F;
TL0=0XCE;
}
if(P00==1&
P02==0)//小车左转定时0.05ms
{
}
if(P00==1&
P02==1)//全部检测到黑线时车停
TR0=1;
}
voiddelay1ms(void)
inti;
120;
i++);
voiddelaynms(intn)
inti,j;
n;
j++);
三、诺基亚5110液晶显示时间路程源程序
Nokia5110LCDtest
芯片型号:
AT89S52
by:
ysit1990@
data:
2012.06.20
描述:
基于网上参考例子修改测试于杭州电子科技大学集训期间
/***********************************************************************
pindescriptioni/o
VCC(3.3V)+3.3v供电电源
CLK:
LCD_CLKP2.0时钟
DA:
SDINP2.1数据输入
D/C:
LCD_DCP2.21写数据0写命令
SCE:
LCD_SCEP2.3片选信号
RSET:
LCD_RESTP2.4复位信号
GND--接地
LED+5v背光
***********************************************************************/
#include<
intrins.h>
//包含_nop_();
一机器周期延时空指令
#defineucharunsignedchar
#defineuintunsignedint
sbitLCD_CLK=P1^5;
//时钟
sbitSDIN=P1^4;
//数据
sbitLCD_DC=P1^3;
//1写数据,0写指令
sbitLCD_SCE=P1^2;
//片选
sbitLCD_REST=P1^1;
//复位,0复位
/*function
************************/
///////////SPI写操作
voidLCD_write_byte(unsignedchardat,unsignedcharcommand);
///////////5110初始化
voidLCD_init(void);
///////////清屏
voidLCD_clear(void);
//////////显示一个字符
voidLCD_write_char(unsignedcharc);
//////////显示字符串
voidLCD_write_String(unsignedcharX,unsignedcharY,unsignedchar*s);
//////////显示一个汉字
voidLCD_WRITE_ZH(unsignedcharX,unsignedcharY,unsignedcharZH[][32],unsignedcharindex);
///////////显示汉字串
voidLCD_WRITE_ZH_STRING(ucharX,ucharY,//起始坐标
ucharZHS[][32],//汉字字符串
ucharwidth,//每个字符边长
ucharindex,//起始索引号
ucharnum,//显示个数
ucharspace);
//间距
/////////////////////////画图
voidLCD_draw_bmp_pixel(ucharX,ucharY,uchar*map,ucharwidth,ucharheight);
//ASCII码的字库
ucharcodeASCII_6_8[][6]=
{
{0x00,0x3e,0x51,0x49,0x45,0x3e}//0
{0x00,0x00,0x42,0x7f,0x40,0x00}//1
{0x00,0x42,0x61,0x51,0x49,0x46}//2
{0x00,0x21,0x41,0x45,0x4b,0x31}//3
{0x00,0x18,0x14,0x12,0x7f,0x10}//4
{0x00,0x27,0x45,0x45,0x45,0x39}//5
{0x00,0x3c,0x4a,0x49,0x49,0x30}//6
{0x00,0x01,0x71,0x09,0x05,0x03}//7
{0x00,0x36,0x49,0x49,0x49,0x36}//8
{0x00,0x06,0x49,0x49,0x29,0x1e}//9
{0x00,0x00,0x36,0x36,0x00,0x00}//:
{0x00,0x38,0x44,0x44,0x44,0x20}//c
{0x00,0x7c,0x04,0x18,0x04,0x78}//m
{0x00,0x48,0x54,0x54,0x54,0x20}//s
};
/*///////////////////////////////////////////////////////////汉字字模参考*/
staticconstcharHanzi[][24]={
/*--文字:
支--*/
/*--宋体12;
此字体下对应的点阵为:
宽x高=16x16*/
{0xFE,0x22,0x22,0xFE,0x00,0x08,0x48,0x88,0x08,0xFF,0x08,0x00,
0x07,0x02,0x02,0x07,0x00,0x00,0x00,0x09,0x08,0x0F,0x00,0x00},//时0
{0x00,0xF9,0x02,0xF8,0x49,0x49,0x49,0x49,0xF9,0x01,0xFF,0x00,
0x00,0x0F,0x00,0x03,0x02,0x02,0x02,0x02,0x0B,0x08,0x0F,0x00},//间1
{0x9E,0x12,0xF2,0x9E,0x48,0xC4,0xAB,0x92,0xAA,0xC6,0x40,0x00,
0x0F,0x08,0x07,0x04,0x00,0x0F,0x04,0x04,0x04,0x0F,0x00,0x00},//路0
{0x12,0xD2,0xFE,0x51,0x80,0x2F,0x29,0xE9,0x29,0x2F,0x00,0x00,
0x01,0x00,0x0F,0x00,0x08,0x09,0x09,0x0F,0x09,0x09,0x08,0x00},//程1
持--*/
宽x高=16x16--
/***********************************************************
函数名称:
LCD_write_byte
函数功能:
模拟SPI接口时序写数据/命令LCD
入口参数:
data:
写入的数据;
command:
写数据/命令选择;
出口参数:
无
备注:
***********************************************************/
voidLCD_write_byte(unsignedchardat,unsignedcharcommand)
unsignedchari;
LCD_SCE=0;
//5110片选有效,允许输入数据
if(command==0)//写命令
LCD_DC=0;
elseLCD_DC=1;
//写数据
for(i=0;
8;
i++)//传送8bit数据
if(dat&
0x80)
SDIN=1;
else
SDIN=0;
dat=dat<
<
1;
LCD_CLK=0;
LCD_CLK=1;
//时钟上升沿写
LCD_SCE=1;
//禁止5110
LCD_init
5110初始化
无
voidLCD_init(void)
//片选LCD
LCD_REST=0;
//产生一个让LCD复位的低电平脉冲
_nop_();
LCD_REST=1;
LCD_write_byte(0x21,0);
//LCD模式设置:
芯片活动,水平寻址,使用扩展指令
LCD_write_byte(0xc8,0);
//设置液晶偏置电压
LCD_write_byte(0x06,0);
//温度校正
LCD_write_byte(0x13,0);
//1:
48
LCD_write_byte(0x20,0);
//使用基本命令,V=0,水平寻址
LCD_clear();
//清屏
LCD_write_byte(0x0c,0);
//设定显示模式,正常显示
//禁止LCD
LCD_set_XY
设置LCD坐标函数
X:
0-83横坐标
Y:
0-5纵坐标
voidLCD_set_XY(unsignedcharX,unsignedcharY)
LCD_write_byte(0x80|X,0);
//X行(横坐标)
LCD_write_byte(0x40|Y,0);
//column列(纵坐标)
/*------------------------------------------
LCD_clear:
LCD清屏函数
--------------------------------------------*/
voidLCD_clear(void)
unsignedchart;
unsignedchark;
LCD_set_XY(0,0);
for(t=0;
t<
6;
t++)
for(k=0;
k<
84;
k++)
LCD_write_byte(0x00,1);
LCD_write_char
显示英文字符
c:
显示的字符
voidLCD_write_char(unsignedcharc)
c-=0x20;
//ASCII码减去0x20
for(i=0;
i<
i++)
LCD_write_byte(ASCII_6_8[c][i],1);
/*-------------------------------------------
名称:
英文字符串显示函数
参数:
*s:
英文字符串指针
---------------------------------------------*/
voidLCD_write_String(unsignedcharX,unsignedcharY,unsignedchar*s)
LCD_set_XY(X,Y);
while(*s)//等效*s!
='
\0'
LCD_write_char(*s);
s++;
}
/*-------------------------------------------------