资源描述
广东职业技术学院
毕业综合实践报告
题 目: 单片机智能小车设计
类 型:
专 业:
班 级:
学生姓名:
指导教师:
完成时间: 2016
摘要
智能作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。智能小车就是其中的一个体现。智能小车,也称为轮式机器人,是一种以汽车电子为背景,涵盖智能控制、模式识别、传感技术、计算机、机械等多学科的科技创意性设计。一般主要由路径识别、速度采集以及车速控制等模块组成。
本次设计的简易智能小车,采用STC89C51单片机作为小车的检测和主控芯片,充分利用了自动检测技术、单片机最小系统、液晶显示模块电路、串口无线通信,以及声光信号的控制、电机的驱动电路。通过keil C软件编程,不断调试,最终实现小车的无线控制,壁障等功能。
关键词:智能小车 单片机 无线控制 壁障
引言
随着自动化的发展,自动化开始向复杂的系统控制和高级的智能控制系统发展,并广泛的应用到各个领域中,实现更大规模的自动化。
智能小车,也称为轮式机器人,是一种以汽车电子为背景,涵盖智能控制、模式识别、传感技术、计算机、机械等多学科的科技创意性设计。一般主要由路径识别、速度采集以及车速控制等模块组成。智能小车最适合在那些人类无法工作的环境中工作,该技术可以应用于无人驾驶机动车,无人生产线,服务等领域。尤其是危险和未知的环境下,智能小车的优势更为明显。
本文所研究的智能小车主要有无线控制,壁障等多种功能,初步实现智能化,可作为智能化研究的模型,具有较大的研究空间,适合于多种领域的智能化研究及开发。
目录
第一章 主控系统及驱动系统 5
1.1 主控芯片的选择 5
1.2 驱动系统 5
1.2.1 电机及驱动芯片的选择 5
1.2.2 电机驱动模块 6
第二章 无线控制系统 7
2.1 无线模块设计 7
2.2 通讯模块 8
2.2.1 蓝牙模块 8
2.2.1 接受数据子程序 8
2.2.2 发送数据子程序 8
第三章 壁障系统 9
3.1 壁障模块 9
3.1.1 超声波模块 9
3.1.2 红外传感器 9
3.1.3 壁障实现过程 10
第四章 温度传感系统 11
4.1 温度传感器简介 11
4.2 读温度子程序 12
第五章 LCD 液晶显示系统..........................................................................................................14
5.1 LCD1602液晶显示屏简介 14
5.1.1 LCD1602引脚说明 14
5.2 LCD1602操作 15
5.3 LCD1602显示子程序 16
第六章 小车速度控制系统............................................................................................................17
6.1 车速控制原理 17
6.2 车速控制子程序 17
7.1 流程图 18
附录 19
第一章 主控系统及驱动系统
1.1 主控芯片的选择
单片机是智能小车的核心部件,一方面它要接收各种传感器送来的信号和PC机发送的数据;另一方面要对接受到的信号进行处理,显示其信息,同时控制电机进行相应动作。在单片机实现的功能中,使用查询方式获取传感器返回的信息,即读取传感器返回信号,需要单片机有较快的处理速度,使小车对信息的获取及处理是实时准确的,实现小车的快速反应与及时避障。同时在能够满足小车设计的速度及接口数的要求的同类型单片机中,要考虑选择价格低廉的机型,在保证了控制准确性及实时性的基础上,能够不提高成本。
如今比较普遍的单片机有51系列。
8051单片机应用普遍、工具多、易上手、片源广、价格低,但是速度慢、功耗大,适合民用,商用。能够满足智能小车对I/O口的需求,对信息的处理速度快,微秒级别的反应。采用keil软件进行编程,单片机的C语言编程与标准C语言语法是几乎一样的,简单易学。
因此AT89C51成为主控芯片。
1.2 驱动系统
1.2.1 电机及驱动芯片的选择
小车采用四轮驱动,在多沙或者较滑的环境中驱动能力较为强,直线行驶能力强。
电机采用普通直流电机。直流电动机具有优良的调速特性,调速平滑、方便,调整范围广;过载能力强,能承受频繁的冲击负载,可实现频繁的无级快速启动、制动和反转;能满足各种不同的特殊运行要求。
L298N是一种高电压、大电流电机驱动芯片。该芯片采用15脚封装。主要特点是:工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作,有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用L298N芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机,通过5、7脚和10、12脚控制两台直流电机的正反转。表1-1为L298N的各个引脚说明。
图1-1
引脚
名称
功能
1;15
SENSING A
SENSING B
电源检测端,不用时可以接地
2;3
OUT 1;OUT2
1Y1和1Y2输出端
4
VS
功率电源电压,此引脚与地必须连接100nF的电容器
5;7
Input 1;
Input 2
1A1和1A2输入端,TTL电平兼容
6;11
ENABLE 1;
ENABLE 2
输入使能端,TTL电平兼容输入,低电平禁止输出
8
GND
GND接地
9
VSS
逻辑电源电压,此引脚与地必须连接100nF的电容器
10;12
Input 3;
Input 4
2A1和2A2输入端,TTL电平兼容
13;14
OUT 3;OUT4
2Y1和2Y2输出端
表1-1
1.2.2 电机驱动模块
电机驱动模块如图1-2所示,由于L298N第9脚为TTL逻辑电平输入,同时单片机工作电压也为5V,所以利用LM7805三端稳压器件,将输入端的VCC(7V~36V)转为5V输出。通过控制输入端IN1~4可以控制电机的正反转,通过控制使能端高低电平可以控制输出的允许和禁止,同时可以用来做PWM调制,从而达到改变小车的车速。右边的8个二极管有保护芯片的作用,当电机正常运作到关闭时,在关闭的瞬间会产生与正常工作时相反的自感电流,此时便需要通过二极管来释放电流到芯片供电端或者接地端。
此驱动模块只能驱动两个电机,由于本文是采用四轮驱动,所以需要两个模块合并,但其中工作原理一致。
图2-2
第二章 无线控制系统
2.1 无线模块设计
无线控制是为了能够实现对智能车的远程遥控,使小车可以在遥控状态下代替人类完成一些危险项目。进过整理得出得出如表2-1所示三种短距离无线通讯技术。
通讯距离
通讯速率
控制难易
模块成本
红外技术
<10 m
<16 Mb/s
易
极低
蓝牙技术
<100 m
<10 Mb/s
一般
高
WIFI技术
<300 m
<11 Mb/s
难
低
表 2-1
通过比较筛选,红外技术成本低,速率最快,但是容易受环境影响,且在智能车快速行驶中不易操控,需要遥控器几乎正对着红外接收器;WIFI技术虽然传输距离远,成本低,但是控制难,且需要一对一模块进行传输;蓝牙技术则可以在PC机或者智能终端进行控制,控制一般,环境影响不大。因此最终采用蓝牙技术,使用HC-05主从一体蓝牙串口模块,实物图如图2-1所示,原理图如图2-2所示。
图 2-1
图2-1
2.2 通讯模块
2.2.1 蓝牙模块
HC05模块是一款高性能的蓝牙串口模块。可用于各种带蓝牙功能的电脑、蓝牙主机、手机、PDA、PSP等智能终端配对。波特率范围4800~1382400,并且模块兼容单片机系统。
HC-05的各个引脚功能如表2-2所示。初次使用蓝牙模块前应先进入AT模式,查看和设置好蓝牙模块的各种工作状态,如波特率,蓝牙名称,主从角色等;进入AT模式的方法为:先将蓝牙模块和单片机连接好,然后按住蓝牙模块上的按键,然后打开单片机的电源开关,此时LED指示灯为快闪状态(1秒2次)。
引脚名称
说明
VCC
电源,兼容3.3V~5V
GND
接地端
TXD
模块串口发送引脚(TTL电平)
RXD
模块串口发送引脚(TTL电平)
EN
高电平进入AT状态,低电平或者悬空就入正常状态
STATE
配对成功输出高电平,不成功输出低电平
表 2-2
2.2.1 接受数据子程序
void serial() interrupt 4
{
send=1;
RI=0;
receive=SBUF;
}
2.2.2 发送数据子程序
void send_byte(uchar tr)
{
SBUF=tr;
while(!TI);
TI=0;
}
第三章 壁障系统
3.1 壁障模块
壁障模块是小车智能化的一个标识,小车行驶过程中能够检测到前方,或者左右方的障碍物并且做出相应的动作,实现壁障功能,以下对实现壁障功能需要的超声波模块和红外传感器和实现的过程进行描述。
3.1.1 超声波模块
HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能,测 距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路,实物图如图3-1所示。
基本工作原理:
(1)采用 IO 口 TRIG 触发测距,给最少 10us 的高电平信呈。
(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声 波从发射到返回的时间。测试距离:uS/58=厘米或者uS/148=英寸或是:距离= 高电平时间*声速(340M/S)/2。
图 3-1
3.1.2 红外传感器
该传感器模块对环境光线适应能力强,其具有一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收,经过比较器电路处理之后,绿色指示灯会亮起,同时信号输出接口输出数字信号(一个低电平信号),可通过电位器旋钮调节检测距离,有效距离范围 2~30cm,工作电压为3.3V-5V。该传感器的探测距离可以通过电位器调节、具有干扰小、便于装配、使用方便等特点。实物图如图3-2所示。
图 3-2
3.1.3 壁障实现过程
超声波传感器直接安装在小车的正前方,由于超声波的检测角度只有30°左右,所以在小车的左前方安装红外传感器。当超声波的回波时间小于设定的时间时,说明在检测范围内有障碍物,小车向右转,若检测不到便继续直行,若红外传感器检测到障碍物,小车也向右转,若检测不到便继续直行,两个传感器共同作用,就实现了躲避障碍物的功能。流程图如图3-3所示。
小车直行
超声波或者红外检测到障碍物?
小车直行
小车右转
Y
N
图3-3
第四章 温度传感系统
4.1 温度传感器简介
DS18B20数字温度计提供9-12位摄氏温度测量而且有一个由高低电平触发的可编程的不因电源消失而改变的报警功能。DS18B20通过一个单线接口发送或接受信息,因此在中央处理器和DS18B20之间仅需一条连接线(加上地线)。它的测温范围为-55~+125℃,并且在-10~+85℃精度为±5℃。除此之外,DS18B20能直接从单线通讯线上汲取能量,除去了对外部电源的需求,实物图如图4-1所示。
图 4-1
DS18B20的核心功能是它的直接读数字的温度传感器。温度传感器的精度为用户可编程的9,10,11或12位,分别以0.5℃,0.25℃,0.125℃和0.0625℃增量递增。在上电状态下默认的精度为12位。DS18B20启动后保持低功耗等待状态;当需要执行温度测量和AD转换时,总线控制器必须发出[44h]命令。在那之后,产生的温度数据以两个字节的形式被存储到高速暂存器的温度寄存器中,DS18B20继续保持等待状态。当DS18B20由外部电源供电时,总线控制器在温度转换指令之后发起“读时序”(见单总线系统节),DS18B20正在温度转换中返回0,转换结束返回1。如果DS18B20由寄生电源供电,除非在进入温度转换时总线被一个强上拉拉高,否则将不会由返回值。
4.2 读温度子程序
/**********ds18b20初始化函数****************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; /
delay_18B20(8);
DQ = 0;
delay_18B20(80);
DQ = 1;
delay_18B20(4);
x=DQ;
delay_18B20(20);
}
/***********ds18b20读一个字节*************/
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat=0;
for (i=8;i>0;i--)
{
DQ = 0;
dat>>=1;
DQ = 1;
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/*************ds18b20写一个字节**************/
void WriteOneChar(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}
/**************读取ds18b20当前温度************/
void ReadTemperature(void)
{
int temp1,temp2;
uchar a=0,b=0;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
delay_18B20(100);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
delay_18B20(100);
a=ReadOneChar();
b=ReadOneChar();
temp1=b<<4;
temp1+=(a&0xf0)>>4;
temp1室温整数值
temp2=a&0x0f;
temp=((b*256+a)>>4);
xs=temp2*0.0625*10; }第五章 液晶显示系统
5.1 LCD1602液晶显示屏简介
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。本论文使用的模块为16*2液晶显示屏,实物图如图5-1所示。能够显示小车所采集到的各种数据:温度,车速档位,与前方障碍物的距离,小车行驶状态(前进,后退,左转,右转)。
图 5-1
lcd1602的各个引脚说明如表5-1所示
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
6
E
使能信号
2
VDD
电源正极
7~14
D0~D7
数据
3
VL
液晶显示偏压
15
BLA
背光源正极
4
RS
数据/命令选择
16
BLK
背光源负极
5
R/W
读/写选择
表5-1
5.1.1 LCD1602引脚说明
第1脚:VSS为地电源。
第2脚:VDD接5V正电源。
第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15脚:背光源正极。
第16脚:背光源负极。
5.2 LCD1602操作
1602液晶模块内部的控制器共有11条控制指令,如表5-2所示:
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
0
0
0
0
0
0
0
0
0
1
2
光标返回
0
0
0
0
0
0
0
0
1
*
3
输入模式
0
0
0
0
0
0
0
1
I/D
S
4
显示开/关控制
0
0
0
0
0
0
0
D
C
B
5
光标或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符发生存贮器地址
0
0
0
1
字符发生存贮器地址
8
置数据存贮器地址
0
0
1
显示数据存贮器地址
9
读忙标志或地址
0
1
BF
0
0
0
0
0
0
0
10
写数到CGRAM或DDRAM)
1
0
读出的数据内容
11
从CGRAM或DDRAM读数
1
1
读出的数据内容
表5-2 控制命令表
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)
指令1:清显示,指令码01H,光标复位到地址00H位置。
指令2:光标复位,光标返回到地址00H。
指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。
指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。
指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:字符发生器RAM地址设置。
指令8:DDRAM地址设置。
指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据。
指令11:读数据。
5.3 LCD1602显示子程序
void lcd_w_c(uint com)
{
lcdrs=0;
delay(3);
P0=com;
delay(3);
lcden=1;
delay(3);
lcden=0;
}
写命令子函数:向LCD1602写入各种控制命令
void lcd_w_d(uint dat)
{
lcdrs=1;
delay(3);
P0=dat;
delay(3);
lcden=1;
delay(3);
lcden=0;
}
写数据子函数:向LCD1602写入要显示的内容
void init()
{
lcden=0;
lcdrw=0;
lcd_w_c(0x38);
lcd_w_c(0x0c);
lcd_w_c(0x01);
lcd_w_c(0x06);
}
LCD1602设置初始化:设置两行显示、5*8点阵,光标不闪烁,数据指针自动加一,清屏
第六章 小车速度控制系统
6.1 车速控制原理
智能小车在不同的环境下对车速的要求是不一样的,例如在陡峭或光滑的环境中,或者在小车需要运载一些重要货物时,则需要小车行驶速度较为缓慢。
智能小车驱动芯片L292N芯片为方便车速控制,提供了两个输入使能端:ENABLE 1,ENABLE 2。为了控制小车移动的速度,本论文采用了PWM(Pulse Width Modulation):脉冲宽度调制,利用微处理器的数字输出来对模拟电路进行控制,改变使能端的导通时间,改变占空比,从而改变电源的输出电压,降低或者提升电机的转速。
利用51单片机的定时器功能可以改变占空比,将51定时器的工作模式设定在工作方式1,采用定时器0计时,每当计时溢出时则进入定时器0中断,经过判断是否改变导通状态,导通时间越长,小车的车速就越大,反之,导通时间越短,则小车的车速就越小。
6.2 车速控制子程序
void timer1() interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
if(count<=pwm)
{
en3=1;
en4=1;
en1=1;
en2=1;
}
else
{
en3=0;
en4=0;
en1=0;
en2=0;
}
count++;
if(count==cycle)
{
count=0;
}
}
第七章 智能小车流程图
7.1 流程图
智能小车流程图如图7-1所示
图 7-1
附录
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit trig=P3^7; //定义超声波模块的制动引脚
sbit echo=P3^6; //定义超声波模块的回响引脚
sbit lcdrs=P2^7;
sbit lcdrw=P2^6;
sbit lcden=P2^5;
sbit en1=P2^3;
sbit en2=P2^2;
sbit en3=P2^1;
sbit en4=P3^5;
sbit ir_left=P3^3;
sbit DQ=P2^0; //定义ds18b20通信端口
uchar flag,pwm=0,cycle=10,count,i,receive,qian,bai,shi,ge,send,send1,go,num;
uint k;
uchar code table[]={"0123456789"};
uchar code speed[]="Speed:";
uchar code move[]="MOVE ON";
uchar code back[]="BACK ";
uchar code left[]="TURN LEFT ";
uchar code right[]="TURN RIGHT";
uchar code stop[]="STOP ";
uchar code ult[]="Ultrasonic:";
uchar code temperature[]="Temperature:";
uchar code aut[]="Enter Auto Contorl";
int xs,temp; //定义整数和小数
//延时函数(100us左右)
void delay_ult()
{
uchar x;
for(x=0;x<100;x++);
}
void delay(uint k)
{
uchar i,j;
for(i=0;i<k;i++)
{
for(j=0;j<110;j++);
}
}
/***********ds18b20延迟子函数*******/
void delay_18B20(unsigned int i)
{
while(i--);
}
void lcd_w_c(uint com)
{
lcdrs=0;
delay(3);
P0=com;
delay(3);
lcden=1;
delay(3);
lcden=0;
}
void lcd_w_d(uint dat)
{
lcdrs=1;
delay(3);
P0=dat;
delay(3);
lcden=1;
delay(3);
lcden=0;
}
/**********************超声波测距函数***************************/
uint ultrasonic()
{
uint time;
trig=1; //给制动引脚一个高于60us的脉冲
delay_ult();
trig=0;
while(!echo); //等待回响引脚置高
while(echo)
time++;
time=time/1.5;
return time;
}
/***************自动壁障子程序****************/
void auto_control()
{
go=1;
send1=1;
// k=ultrasonic();
send1=1; //将send1置为1
if(k<=200||ir_left==0) //判断超声波检测距离和红外传感器的检测情况
{
send=1; //将send置为1
pwm=1; //改变速度档位为1档
P1=0x00; //改变移动方向为右转
}
else //如果判断条件为假,则改变速度档位为2档,移动方向为前进
{
pwm=2;
P1=0x55;
}
}
/***************************小车控制子程序********************************/
void control()
{
k=ultrasonic();
switch(receive) //判断从SBUF取出的值并改变移动方向或者速度档位
{
case 'q':auto_control();
break;
case 'w':P1=0x55;
break;
case 'a':P1=0x5a;
break;
case 's':P1=0xaa;
break;
case 'd':P1=0xa5;
break;
case '0':pwm=0;
break;
case '1':pwm=1;
break;
case '2':pwm=2;
break;
case '3':pwm=3;
break;
case '4':pwm=4;
break;
case '5':pwm=5;
break;
case '6':pwm=6;
break;
case '7':pwm=7;
break;
case '8':pwm=8;
break;
case '9':pwm=9;
break;
case ' ':P1=0;
break;
}
}
/**********ds18b20初始化函数**********************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位 ds18b20通信端口
delay_18B20(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay_18B20(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay_18B20(4);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay_18B20(20);
}
/***********ds18b20读一个字节**************/
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat=0;
for (i=8;i>0;i--)
{
DQ = 0; // 高电平拉成低电平时读周期开始
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/*************ds18b20写一个字节****************/
void WriteOneChar(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0; //从高电平拉至低电平时,写周期的开始
DQ = dat&0x01; //数据的最低位先写入
delay_18B20(5); //60us到120us延时
DQ = 1;
dat>>=1; //从最低位到最高位传入
}
}
/**************读取ds18b20当前温度************/
void ReadTemperature(void)
{
int temp1,temp2;
uchar a=0,b=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
delay_18B20(100); // this message is wery important
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
delay_18B20(100);
a=ReadOneChar(); //读取温度值低位
b=ReadOneChar(); //读取温度值高位
temp1=b<<4; //高8位中后三位数的值
temp1+=(a&0xf0)>>4; //低8位中的高4位值加上高8位中后三位数的值 temp1室温整数值
temp2=a&0x0f; //小数的值
temp=((b*256+a)>>4); //当前采集温度值除16得 实际温度值
xs=temp2*0.0625*10; //小数位,若为0.5则算为5来显示 xs小数
}
/****************初始化函数************************/
void init()
{
trig=0; //拉低制动引脚
echo=0; //拉低回响引脚
P1=0;
TMOD=0x21; //设置定时器T0工作方式2(16位定时器)
lcden=0;
lcdrw=0;
lcd_w_c(0x38); //工作方式
lcd_w_c(0x0c); //光标设置
lcd_w_c(0x01); //清屏
lcd_w_c(0x06); //输入方式设置
TH0=(65536-5000)/256; //定时器T0赋初值
TL0=(65536-5000)%256;
TH1=0xf3; //设置串口波特率为4800(12M晶振)
TL1=0xf3;
SM0=0; //设置串口工作方式2(10位异步通信)
SM1=1;
PCON=0x80;
REN=1; //串口接受允许标志位
EA=1; //开启总中断
ES=1; //开启串口中断
ET0=1; //打开定时器0中断
TR0=1; //启动定时器T0
TR1=1; //启动定时器T1
}
/***********************LCD1602显示子程序*********************************/
void display()
{
lcd_w_c(0x80);
for(i=0;i<6;i++)
{
lcd_w_d(speed[i]);
}
lcd_w_d(table[pwm]);
switch(P1)
{
case 0x55:lcd_w_c(0x80+0x40);for(i=0;i<7;i++)lcd_w_d(move[i]);lcd_w_d(' ');lcd_w_d(' ');
break;
case 0xaa:lcd_w_c(0x80+0x40);for(i=0;i<9;i++)lcd_w_d(back[i]);
break;
展开阅读全文