嵌入式系统实践报告
项目名称:自动跟踪汽车 专 业:自动化 班 级:183班 学 号:2420182344 姓 名:朱明
- 《嵌入式系统实践(2)试题目
类 别:专业选择 学 分:2 适用专业:自动化专业
一、考试方法 1.基于嵌入式系统的智能跟踪车分组设计制作。 二、二。考试的目的和要求 通过嵌入式系统实践,可以更好地理解理论知识,培养学生分析和解决工程实际问题的基础和专业知识和技能,掌握嵌入式系统设计的一般规律和方法,掌握模拟电子电路、数字电子电路和嵌入式系统设计方法。使学生熟悉系统设计过程,提高实际设计能力。 三、设计内容 主要内容和要求包括: ⑴能够按照指定的黑线自动行驶。 ⑵. 可显示行驶速度、时间、距离障碍物等信息。(选择) ⑶能自动行驶避障。(选择) 四、设计步骤和方法 ⑴.搭建循迹车硬件电路。 ⑵. 编制跟踪汽车的驱动程序。 ⑶.软硬件综合测试。 ⑷. 撰写设计报告。 五、设计说明书和图纸 该系统由硬件电路和软件程序组成。硬件电路包括:MCU、时钟电路、复位电路、电源电路、电机驱动电路、红外检测电路、超声波收发电路(选择)、显示电路(选择)。软件程序包括:主程序、路径检测程序、电机驱动程序、中断服务子程序、计算距离程序(选择)、LED动态显示程序(选择)等程序。 六、实践考核方法 嵌入式系统实践通过考试进行评估,教师根据学生在实践中的综合表现、实践作品和报告的质量进行评分。其中,平时表现占30%,作品占40%,实践报告占30%。
- 摘 要
本文提出了一个基础 STC89C52单片机智能跟踪避障四轮驱动汽车的设计方案和具体实现方法 STC89C52RC单片机是汽车检测和控制的核心L298N 电机控制模块驱动四轮两对直流电机,用红外反射光电传感器检测路面黑白线,识别路线,使用超声波测距模块 HC-SRO4 判断前方的障碍物。在跟踪模式下,汽车可以沿着道路上的黑线行驶,在避障模式下避开障碍物,并通过码盘计数速度传感器模块LCD1602 显示速度。本设计结构简单,易于实现,能在一定精度范围内稳定循环和避障,具有一定的实用价值。
关键词:STC89C52;L298N模块;红外光电传感器;超声波测距
目 录
第一章 课程总设计 1 1.1 小车的概括 1 1.2 跟踪汽车的基本原理 1 1.3 系统结构图 1 第二章 系统硬件设计 2 2.1 控制器的选择 2 2.2 概括 2 2.3 STC89C52功能 2 2.4 硬件电路设计 3 2.5 电机驱动模块 4 2.6 测速传感器模块 5 2.7 红外检测电路模块 6 2.8 超声波测距模块 7 2.9 LCD显示模块 8 第三章 系统软件设计 9 3.1 编译环境 9 3.2 红外传感器模块驱动 9 3.3 驱动电机模块 10 3.4 测速模块 16 3.5 超声波模块 17 总 结 22 致 谢 23 参考文献 24 附录图片 25
1. 第一章 课程总设计
1.1 小车的概括 汽车使用四轮车模型。为了简化,我将一侧的电机并联,根据四路跟踪模块和L298N模块控制摆动。这种模型控制很简单。汽车可以通过 控制电机转速,控制左右电机转速,控制车辆转速,实现车辆的前进和转弯操作。 1.2 跟踪汽车的基本原理 探测路面黑线的基本原理:光照射到路面并反射。由于黑线和白纸对光的反射系数不同,可以根据接收到的反射光强度来判断是否为黑线。利用这一原理,你可以控制汽车的行走路径。这里的跟踪是指汽车在白色地板上行走,通常采用红外检测方法。 红外探测方法:利用红外线在不同颜色物体表面具有不同反射性能的特点,在汽车行驶过程中不断向地面发射红外线,当红外线遇到白纸地板时,反射光被安装在汽车上的接收管接收;如果遇到黑线,红外线被吸收,汽车上的接收管不能接收红外线。处理器根据是否收到反射的红外光来确定黑线的位置和汽车的行走路线。红外探测器的探测距离有限,一般最大不得超过 3cm。 智能汽车系统以处理器为核心。为了使智能汽车快速行驶,处理器必须准确结合路径的快速判断、相应的转向电机控制和直流驱动电机控制。如果传感器部分的数据没有得到正确的收集和识别,转向电机控制不当会导致模型车辆严重抖动,甚至偏离轨道;如果直流电机的驱动控制效果不好,也会导致一系列问题,如直线段速度不能上升、弯曲段速度过快等。 1.3 系统结构图 图1.1 系统结构图
1. 第二章 系统硬件设计
2.1 控制器的选择 使用课程实验STC89C52单片机完成。 2.2 概括 STC89C52RC是STC公司生产的低功耗、高性能CMOS8位微控制器,8位K可编程字节系统Flash存储器。STC89C52使用经典的MCS-51核心,但经过大量改进,芯片具有传统51单片机所没有的功能。在单芯片上,有灵巧的8 位CPU 并且可以在系统中编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、有效的解决方案。 图2.1STC89C52引脚图 2.3 STC89C52功能 8k字节Flash,512字节RAM, 32 位I/O 口线,门狗定时器,内置4KB EEPROM,MAX810复位电路,316 定时器/计数器,4个外部中断,7向量4级中断结构,全双工串行口。另外 STC89C52 可降至0Hz 可选择节电模式的静态逻辑操作支持两种软件。在空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容保存,振荡器冻结,单片机工作停止,直到下一个中断或硬件复位。最高运行频率35MHz,6T/12T可选。 2.4 硬件电路设计 本实验采用的电路板是在网上购买的普中单片机开发板,外设多,学习资料充足。我使用杜邦线连接每个模块,提供多个接口。 图2.2系统板电路图 图2.3系统板实物图 2.5 电机驱动模块 本项目驱动两路直流电机,实现电机实时变速和测速。 表1 L298N 输入输出逻辑真值表 0为低电平;1 高电平;X” 任何状态。 图2.3 L298N 电路图和实物图
2.6 测速传感器模块 速度传感器模块原理:输出轴上的机械几何位移通过光电转换转换为脉冲或数字量。光电编码器是目前应用最广泛的传感器,由光栅盘和光电检测装置组成。光栅板在一定直径的圆板上等分开几个矩形孔。 由于光电码盘与电机同轴,当电机旋转时,光栅盘与电机同速旋转 光二极管等电子元件的检测 通过计算每秒光,设备检测输出多个脉冲信号 输出脉冲的数量可以反映当前电机的转速。 当模块槽中没有遮挡时,接收管导通,模块DO输出低电平,遮挡时,DO输出高电平。 DO 可与单片机一起输出接口 IO 直接连接口,检测传感器是否有遮挡,如使用电机码盘,可检测电机转速。 模块 DO 可与继电器连接,形成限位开关等功能,也可与有源蜂鸣器模块连接,形成报警器。 产品接线说明: a、VCC 接电源正极 3.3-5V b、GND 接电源负极 c、DO TTL 输出开关信号 d、AO 该模块不起作用 图2.4 测速传感器模块电路图和实物图 基本工作原理: (1)采用IO口 TRIG触发测距,至少10us高电平信号。 (2)模块自动发送8个40个khz自动检测方波是否有信号返回。 (3)有信号返回,通过 IO 口 ECHO 输出高电平,高电平的持续时间是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2; 2.7 红外检测电路模块 原理:红外检测电路原理其实很简单,就是利用红外线在不同颜色物体表面具有不同反射性质的特点,在汽车行驶过程中不断向地面发射红外光。当红外光遇到白色纸质地板时,会发生漫反射。反射光被安装在汽车上的接收管接收,收集到的电压为高电平;如果遇到黑线,红外光被吸收,汽车上的接收管无法接收红外光。收集到的电压为低电平。为了调节红外对管的灵敏度,增加了四路跟踪模块。 注:由于本项目的设计功能相对简单,只需位于汽车中心轴的两个红外检测电路即可。通过调整模块上的转轴,调整模块的灵敏度达到最佳实验效果。
图2.5红外检测电路模块原理图和实物图
图2.64路循迹模块实物图
2.8 超声波测距模块 超声波测距模块简介:超声波检测设计汽车避障采用超声波测距,并根据不同距离测量离障碍物 做出不同的反应。 检测距离:5CM-4M 。 分辨率:5MM。 数字电平信号可直接连接单片机,无需任何辅助电路或单片机生成 距离与模块输出信号脉冲长度成正比。 图 2.7 超声波测距时间图和实物图 2.9 LCD显示模块 简介:1602液晶,又称1602字符型液晶,是一种点阵型液晶模块,专门用于显示字母、数字、符号等。它由若干个5X7或者5X由11等点阵字符位组成,每个点阵字符位可以显示一个字符,每个点之间有一个点距间隔,每行之间也有一个间隔,起到字符间距和行间距的作用。正因为如此,它不能很好地显示图形(自定义CGRAM,显示效果也不好)。1602LCD指16显示的内容X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。br> 液晶工作原理:在数字电路中,所有的数据都是以0和1保存的,对 LCD 控制器进行不同的 数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少, 只需要8位(1KB)即可。而对于中文,常用却有6000以上,于是有一个办法,就是将 ASCII 表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。 那么,得到了汉字的内码后,还仅是一组数字,那又如何在能屏幕上去显示呢? 这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义 有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,从而通过 扫描,显示在液晶屏幕上。 备注:加液晶显示是为了弥补在超声波蔽障及测距时不知道的具体距离以及测速传感传达的具体速度,有助于我们更好的预知路程蔽障的范围及距离障碍物的距离。 图2.8液晶显示实物图以及接口电路
1. 第三章 系统软件设计
3.1 编译环境 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。 3.2 红外传感器模块的驱动 红外线模块只要 M0 处理器向其供 5V 电压就能工作,然后通过引脚采集其 电平高低就可以根据不同情况做出相应的处理。
程序清单 3.1 读取红外传感器的高低电平
//*************************************************************// // 程序名称:读取红外传感器的高低电平。 // 功能描述:读取红外传感器的高低电平,通过L298N得到改变转速。 //单片机:STC89C52,外接
晶振11.0592 //硬件连接: // 四路循迹IN1~IN2接上P^0.0~ P^0.1 // 红外对管VCC接四路循迹VCC // 红外对管GND接四路循迹GND // 红外对管OUT接四路循迹OUT1~2 //*************************************************************// void Track(void) { if((IN1==0&&IN2==0)||(IN1==1&&IN2==1)) { Forward(); //调用前进函数 } if(IN1==1&&IN2==0) { Lift(); //调用左转函数 } if(IN1==0&&IN2==1) { Right(); //调用右转函数 } }
3.3 电机模块的驱动 L298N电机驱动,模块核心是L298N,有VS电机工作电压输入和VCC(5V),控制电压输出,四通道驱动,我让其同时控制小车的两对电机,从而带动两对驱动轮。只需要通过红外对管接受的路径信号来改变IN1~IN4的输入信号,就很容易让电机止转,反转和停止,从而控制小车的循迹。首先进行电机驱动调试便于以后的测试。
程序清单 3.2直流电机驱动调试
//*************************************************************//
// 程序名称:直流电机测试程序
// 功能描述:直流电机正转2秒,反转2秒,自动加速正转,自动减速。
//单片机:STC89C52,外接晶振11.0592
//硬件连接: P1.0---IN1
// P1.1---IN2
// P1.2---ENA
// 直流电机两端分别接OUT1和OUT2
//电机驱动电压根据所接电机而定,驱动板芯片逻辑电压为+5V
//*************************************************************//
#include<reg52.h>
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit ENA=P1^2;
sbit IN3=P1^3;
sbit IN4=P1^4;
sbit ENB=P1^5;
void delay(unsigned int z);
void delay_us(unsigned int aa);
/*****************主函数**************/
void main()
{
while(1)
{
unsigned int i,cycle=0,T=2048;
IN1=1; //正转
IN2=0;
IN3=1;
IN4=0;
for(i=0;i<200;i++)
{
delay(10);//PWM占空比为50%,修改延迟时调整PWM脉冲
ENA=~ENA;
ENB=~ENB;
}
IN1=1; //自动加速正转
IN2=0;
IN3=1;
IN4=0;
while(cycle!=T)
{ ENA=1;
ENB=1;
delay_us(cycle++);
ENA=0;
ENB=0;
delay_us(T-cycle);
}
}
}
/*********************z秒延时函数*********************/
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
/*****************微秒延时****************************/
void delay_us(unsigned int aa)
{
while(aa--);
}
程序清单 3.3直流电机驱动与路径识别
//*************************************************************//
//程序名称:直流电机驱动与路径识别
//功能描述:红外对管接受路径信号来改变IN1~IN4的输入信号,从而使
//电机的转动和停止.
//单片机 :STC89C52,外接晶振11.0592
//硬件连接: P1.0---IN1
// P1.1---IN2
// P1.2---ENA
// 直流电机两端分别接OUT1和OUT2
//电机驱动电压根据所接电机而定,驱动板芯片逻辑电压为+5V
//*************************************************************//
void Forward() //电机前进
{PWM1=1;
PWM2=1;
}
void Lift() //电机左转
{ PWM1=0;
PWM2=1;
}
void Right() //电机右转
{
PWM1=1; PWM2=0;
}
void Track(void)
{if((IN1==0&&IN2==0)||(IN1==1&&IN2==1))
{
Forward(); //调用前进函数
}
if(IN1==1&&IN2==0)
{
Lift(); //调用左转函数
}
if(IN1==0&&IN2==1)
{
Right(); //调用右转函数
}
}
备注:需要转弯的时候才需要两对电机驱动其左右转动, 在常态下则由四轮的推力使前轮向前转动。具体实现是通过控制前面产生的两路 PWM 波的占空比和 L298N 芯片的 IN1、IN2 的方向来实现小车的前进循迹。
图3.1直流电机控制Proteus仿真图
图3.2直流电机控制流程图 备注:程序采用两个红外对管左边检测黑线,右边检测白色板面,沿着黑线边缘前进。 3.4 测速模块 由于主轮与后面光码盘扇叶转速的比例是 1:20。所以测主轮的转速公式为转速=((一秒测速传感器捕获光码扇盘方孔的个数)/20)23.143.5(CM/S) 备注:小车轮子半径3.5CM,采用1秒小车的速度测试便于速度的准确性。 程序清单 3.4 直流电机转速的测量
//*************************************************************//
//程序名称:直流电机转速的测量
//功能描述:电机码盘计数,被遮挡的个数通过计算公式得到小车速度
//单片机 :STC89C52,外接晶振11.0592M
//硬件连接: D0---P1.O
//*************************************************************//
/*定时器0中断号1*/
void Time0() interrupt 1
{
TH0 = 0xDC; //11.0592M晶振下装入10ms初值
TL0 = 0x00;
time++;
if(time == 100)
{
Wheel_Speed = ( Angular_N / 20 ) * 2 * 3.5 * 3.14 ;
//获取1s内中断计数的值num,并进行数值处理 (中断数值/20*直径 //*3.14为1s内移动距离)
time = 0;
Angular_N = 0;
}
}
/*外部中断0初始化*/
void Int0Init()
{
IT0 = 1; //跳变沿出发方式(下降沿)
EX0 = 1; //打开INT0的中断允许
EA = 1; //打开总中断
}
/*外部中断0的中断函数*/
void Int0() interrupt 0
{
Angular_N++;
}
备注:我的开发板液晶模块LCD1602和LCD12864都损坏了,调试多次都未成功。所有未能做出测速显示模块,同时光码测速模块的资料未搜索到,这个模块尝试失败。
3.5 超声波模块 HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能, 测距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路。
基本工作原理: (1)采用 IO 口 TRIG 触发测距,至少10us的高电平信号; (2)模块自动发送 8个40khz 的方波,自动检测是否有信号返回; (3)有信号返回,通过IO口ECHO 输出一个高电平,高电平持续的时间就是超声 波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;
程序清单 3.5 超声波模块测试
//*************************************************************//
//程序名称:超声波模块
//功能描述:超声波测距,控制小车前进停止
//单片机 :STC89C52,外接晶振11.0592M
//硬件连接: D0---P1.O
//*************************************************************//
#include<reg52.h>
#include<intrins.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 DisplayData[3];
u8 code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//TRIG为控制端
sbit TRIG = P1^6; //超声波的 TRIG端 插在了P1.6口
//ECHO 为接收端
sbit ECHO = P1^7; //超声波的 ECHO端 插在了P1.7口
u8 flag = 0; //标志定时器是否溢出
//*************************************************************//
//函 数 名 : delay
//函数功能 : 延时函数,i=1时,大约延时10us
//*************************************************************//
void delay(u16 i)
{
while(i--);
}
void init_time()
{
TMOD = 0x01; //选择定时器0工作 工作方式为方式1
TH0 = 0; //装初值0
TL0 = 0;
TF0 = 0; //中断溢出标志位
ET0 = 1; //开定时器中断
EA = 1; // 开总中断
}
//*************************************************************//
// 函数名 :display(int num)
//函数功能 :数码管显示函数
//*************************************************************//
void display(int num) //显示函数
{
u8 i;
if(num == -1) //当超出范围 显示999
{
DisplayData[0] = table[9];
DisplayData[1] = table[9];
DisplayData[2] = table[9];
}
else //显示到前三个数码管上因为测距范围为2-400cm 故3位即可
{
//取百位
DisplayData[0] = table[num / 100]|0x80;
//取十位
DisplayData[1] = table[num/10%10];
//取个位
DisplayData[2] = table[num %10];
}
for(i=0;i<3;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
}
P0=DisplayData[i]; //发送数据
delay(100); //间隔一段时间扫描
P0=0x00; //消隐
}
}
void delayed(unsigned int x) //延时xmS
{
unsigned int i,j;
for(i = x; i > 0; i--)
{
for(j = 113; j >0; j--);
}
}
void main()
{
int x;
u16 distance,out_TH0,out_TL0;
TRIG = 0; // 先给控制端初始化为0
while(1)
{
init_time(); //初始化定时器
flag = 0; //置溢出标志位为0
//控制口发一个10US 以上的高电平
TRIG = 1;
delay(2);
TRIG = 0;
//等待接收端出现高电平
while(!ECHO);
TR0 = 1; //启动计时器 开始计时
while(ECHO); //等待高电平结束
TR0 = 0; //关闭低电平
out_TH0 = TH0; //取定时器的值
out_TL0 = TL0;
out_TH0 <<= 8; //右移8位
distance = out_TH0 | out_TL0; //合并为16位的值
distance /= 58;
if(flag == 1) //如果定时器溢出 则超出超声波测量范围
{
display(-1);
flag = 0;
}
else
{
for(x =5; x >=0; x--)
//加此循环只是为了将结果在数码管上停留时间长点便于观察
{
display(distance);
}
}
delay(600);//60ms的周期,这里不是6ms,太多会闪烁。
}
}
void timer0() interrupt 1 //中断函数
{
flag=1; //溢出标志位置1
}
超声波传感器的使用方法:控制口发一个10US 以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的,此时就为此次测距的时间,方可算出距离。如此不断的周期测, 就可以达到移动测量的值了。
- 总 结
历经十几天的时间,终于把老师要求的嵌入式课程设计完成了,从资料的搜索到与同学的合作再到最终的调试,在整个实验过程中,第一次感觉到作为科学家的那份废寝忘食做科研任务的精神,无论是学生时代的学习和成长,还是以后步入工作都会铭记自己第一次实验。 记得在刚刚开始的时候,我特别希望做的完美,无论是代码还是小车模型,我特地在网上买了一套工具包括四驱小车模型。但是单片机开发板被我弄坏了,折腾一个星期没有成果,特别沮丧,但是多亏我一个好朋友的帮助,有一天和他在实验室研究的晚上10点,基本上我在一旁学习,最终是成功的完成循迹小车一代,也就是老师布置的任务。此次的成功,无疑给予了我很大的决心。 关于此次的循迹车,从一幅幅电路图到一个个电子元件,再到一个一个成 型的模块,最后到组装并成功实现功能。这其中所花费的精力,也有些让自己 动容。然而我想,做每个项目本都应该如此吧!一步一步的品味到了辛酸,才会 获得甘甜。十分的信心,十足的恒心。只有这样,才能成事。 在本课题的设计中,虽然把实物做出来了,而且都符合课题设计的要求但是依然让我不是很满意,觉得功能过于单一,因此暑假花了很长时间自学《单片机原理》和小车外设的使用,因此在做这篇课题报告的时候,便把剩余的模块都添加上去了,在正文部分也都提及。在暑假制作小车的时候,本来打算一口气完成加上四个模块的成品车,但是发现,无论是代码还是各个模块与小车之间的接线都存在较大问题,两三天的时间都未能够解决,最后打算,挨个模块测试,或者存在相互关系的模块同时进行测试,这样也能降低难度。最终算是勉强完成了自己的目标。 在上半年我一直在搜集电子设计大赛和“飞思卡尔”智能汽车邀请赛上的资料,目前已经下载接近100G的资料,我今后的一大目标就是可以达到赛场上顶尖的要求,虽然现在相比“飞思卡尔”智能汽车邀请赛上的智能小车还是极大的差距,最主要的问题是自己不能完全自主设计代码,这样做实验的话会失去被动性,在今后的学习之中,还得不断精炼自己的编程功底,已达到自己的要求,这样才能完成自己的目标。 姹紫嫣红看遍,归来仍是少年,希望自己一直在热爱的事情上一路向前,以梦为马,不负韶华。 致 谢 感谢张老师,在他的教导之下,让我对实验有了清晰的思路,感谢曾老师和温老师,在二位老师的鼓励下,让我有了更加浓厚的学习兴趣和研究目的,每次的成功都急于和老师们分享,这样觉得自己流下的每一滴汗,付出的每一秒都是值得的。 感谢大二的蔡俊学长,肖春明学长等,每次去找他们时,他们都不惜自己的时间给我们讲解难,以及告诉我们他们当时的经验教训。感谢 1409 里面的每位同学,1409陪伴每一位自动化学生的成长,学校给自动化学生莫大的帮助,将是我们毕生实验生涯以及今后的生活的精神寄托。 感谢信息学院的阙同学,你不仅帮助提供给我所需的器材,还指导我代码需要按照不同功能创建多个文件便于调试,我感觉到别人的优秀,更加不能松懈自己的学习进程。 感谢我的所有老师,是他们让我在人生的道路上不断的学习与进步。 感谢江西理工大学给我这个学习的环境,这是让我重新定义自己,并且找到新的起点的地方。祝愿自己在新的起点向着不变的方向进军。
- 参考文献
[1]周立功等. 《ARM嵌入式系统基础教材》. 北京:北京航空航天大学出版社, 2008 [2]郭天祥. 《 51单片机C语言教程》(第二版). 北京:电子工业出版社,2018 [3]长沙太阳人电子. 《 SMC1602A LCM》. 2009 [4]李全利等. 《单片机原理及应用》(第二版). 北京:清华大学出版社 2006 [5]刘德全等. 《Proteus 8¬—电子线路设计与仿真》(第二版). 北京:清华大学出版社 2017 [6]百度文库等 附录图片