温度传感器的简单设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机原理
课
程
设
计
课题:温度传感器的简单设计
班级:宿迁学院
姓名:
学号:07
指导教师:
二○一○年六月
目录
第一章前言
1.1 传感器简介
1.2 热敏电阻传感器
1.3 MCU与嵌入式系统
第二章系统硬件设计
2.1 系统原理图
2.2 单片机(MCU)模块
2.2.1 MC908GP32单片机性能概述
2.2.2 GP32最小系统
2.2.3 MC68HC908GP32内部结构
2.2.4 GP32MCU的引脚功能
2.3 A/D转换模块
2.3.1 进行A/D转换的基本问
2.3.2 数字控制系统框图
2.3.3 A/D转换模块的基本编程方法
2.4 串行通信模块
2.4.1 RS-232C总线标准
2.4.2 SCI电平转换电路设计
第三章系统软件设计
3.1 MCU的程序设计
第四章编辑程序
第五章系统测试
4.1 接硬件电路
4.2 08C语言程序调试
第六章心得总结
参考文献
基于GP32温度传感器的设计
第一章前言
1.1 传感器简介
传感器是一种把物理量或化学量转变成便于利用的电信号的器件,其实质是一种功能块,其作用是将来自外界的各种信号转变为电信号。
它是实现测试与自动控制系统的首要环节。
如电子计价秤中所安装的称重传感器,它是电子计价秤的重要部件,它担负着将重量转换成电信号的任务,它所输出的电信号被放大器放大并经A/D转换后由相关电路显示出称重信息。
如果没有传感器对原始参数进行精确可靠的测量,哪么无论是信号转换或信息处理,或者最佳数据的显示和控制都将无法实现。
在现代电子信息系统中,信息采集传感器技术、信息传感痛惜技术、信息处理微处理器技术是现在电子信息技术的3大核心技术。
1.2热敏电阻传感器
温度传感器利用一些金属、半导体等材料与温度有关的特性而制成的,这些特性包括热膨胀、电阻、电容、磁性、热电势、热噪声、弹性及光学特征。
根据制造材料将其分为热敏电阻传感器、半导体热电偶传感器、PN结温度传感器和集成温度传感器等类型。
热敏电阻传感器,其最基本电气特性是随着温度的变化自身阻值也随之变化。
热电阻材料热电阻测温是基于金属导体的电阻值随温度的增加而增加这一特性。
1.3 MCU与嵌入式系统
MCU的基本含义:在一块芯片上集成了中央处理器单元(CPU)、存储器(RAM/ROM)、定时器/计数器及多种输入/输出(I/O)接口的比较完整的数字处理系统。
MCU从体系结构到指令系统都是按照嵌入式系统的应用特点专门设计,能很好地满足应用系统的嵌入,面向测控对象和现场可靠运行等方面的要求。
因此由MCU构成的系统是发展最快、品种最多、数量最大、应用最广的嵌入式系统。
由于MCU有嵌入式应用的专用体系结构与指令系统,而且具有体积小、可靠性高等特点,同时具有各种各样的型号,可以满足不同的需求,实际应用时,开发者可根据具体要求选用最佳型号的MCU嵌入到所需的应用系统中。
一个以MCU为核心,比较复杂的嵌入式产品或实际嵌入式应用系统,包含模拟量的输入、模拟量的输出,开关量的输入、开关量的输出以及数据通信部分。
如图1为一个典型的嵌入式应用系统框图:
/
在执行机构中,有开关量执行机构,也有模拟量执行机构。
开关量执行机构只有“开”、“关”两种状态。
模拟量执行机构需要连续变换的模拟量控制。
MCU 一般不能直接控制这些执行机构,需要通过相应的驱动电路实现。
还有一些执行机构,即不是通常的开关量控制,也不是通常的D/A转换量控制,而是“脉冲”量控制,如控制空调电动机,MCU则通过软件对其控制。
第二章系统的硬件设计
2.1 系统原理图如下图所示:
该系统的设计步骤是按照一般嵌入式产品的开发步骤设计的。
第一步输入输出分析
本系统的输入量有:传感器采集入口。
该信号是由传感器流向B口。
输
出量有:串口输出、温度传感信号输出。
第二步设计并制作硬件系统
该系统是选用MC68HC908GP32 MCU ,该芯片是集成了8位A/D转换器,
只要接传感器就可以工作,同时开发系统已经接好串口通信线路,MAX232芯
片是集成在开发板上的。
只要连接温度传感器电路的输出。
第三步系统软件设计
该系统的软件很简单,直接就可分成每个小模块,如:A/D转换电路、
小灯循环点亮模块、单片机系统等。
在定义好系统寄存器后,针对各模块进
行详细设计编码,最后测试各个模块,完成MCU软件设计。
第四步系统测试
在软件和硬件系统都设计完成后,把程序通过专用编译器和写入工具写到MCU中,运行系统。
在系统运行中,不断发现系统的不足之处,并改进它,使系统更加完善,对环境的适应能力更强。
2.2 单片机(MCU)模块
2.2.1 MC908GP32单片机性能概述
(1)512B片内RAM;32K片内Flash程序存储器,具有在线编程和保密功能。
(2)时钟发生器模块,具有32KHz晶振PLL电路,可产生各种工作频率;8MHz 内部总线频率。
(3)增强的HC05 CPU结构;16种寻址方式(比HC05多8种);16位变址寄存器和堆栈指针;存储器至存储器数据传送;快速8×8乘法指令;快速16/8除法指令;扩展的循环控制功能;BCD功能.
(4)33根通用I/O脚,包括26根多功能I/O脚和5或7根专用I/O脚;PTA、PTC和PTD的输入口有可选择的上拉电阻;PTC0—PTC4有15mA吸流和放流能力,其他口有10mA吸流和放流能力 (总体驱动电流应小于150mA);所有口有最高5mA 输入电流保护功能。
(5)增强型串行通讯口SCI;串行外围接口SPI;两个16位双通道定时器
接口模块(TIM1和TIM2),每个通道可选择为输入捕捉、输出比较和PWM,其时钟可分别选为内部时钟的1、2、4、8、6、32和64的分频值;带时钟预分频的
定时基模块有8种周期性实时中断(1、4、16、256、512、1024、2048和4096Hz),可在STOP方式时使用外部32KHz晶振周期性唤醒CPU;8位键盘唤醒口。
(6)系统保护特性:计算机工作正常(COP)复位;低电压检测复位,可选为3V或5V操作;非法指令码检测复位;非法地址检测复位。
(7)具有PDIP40、SDIP42和QFP44封装形式。
(8)优化用于控制应用;优化支持C语言。
2.2.2 GP32最小系统
硬件结构,但仅有一个MCU是无法工作的,它必须与以MC908GP32单片机为原型的HC08系列MCU的其他相应的外围电路一起,才能构成一个最小系统。
MC908GP32芯片(以40脚封装为例)最小系统的外围支撑电路包括电源与滤波电路、晶振电路和复位电路。
图MC908GP32最小系统电路图
1、电源供给与滤波
GP32芯片的20、19脚(Vdd,Vss)为芯片的电源输入端,1、2脚为内部PLL 的电源供给。
接在电源与地之间的0.1uF电容为滤波电容,PLL电路目的在于由频率小的外部晶振产生较大频率的内部时钟,提高芯片的抗干扰性。
在MCU的第三脚,接有内部PLL模块的外部滤波电路。
滤波电路的作用是增强电路工作稳定性。
2、晶振电路
接在MCU第4、5脚之间的电路为晶振电路,这里选用的晶振频率为f=32.768Hz.。
通过内部PLL电路模块,可获得小于等于8MHz的内部总线频率。
电路及其元件参数是由GP32参考手册确定的。
实际开发中,嵌入式应用工程师往往根据参考手册提供的电路及参数,通过自己的实践,构筑MCU的外围支撑电路,而不深究其工作原理。
3、复位电路
接在MCU第6脚的电路为芯片硬件复位电路,正常工作时该脚通过10千欧姆电阻正极(这里设为5v电源供电),所以应为高电平。
若按下复位按钮RST,则第6脚通过51欧姆电阻接地,为低电平,芯片复位。
2.2.3 MC68HC908GP32内部结构
MC68HC908GP32 MCU(以下简称GP32 MCU)的三种封装形式只有引脚数量和形式有所区别,其他方面是一致的。
图4给出了GP32的内部结构框图。
图4中I/O接口是按44引脚的GP32给出的,对于42引脚的GP32 MCU则没有PTC5、PTC6两个引脚,对于40引脚的GP32 MCU则没有PTC5、PTC6及PTD6/T2CH0、PTD7/T2H1四个引脚。
从内部结构简图可以看出,GP32内部有以下主要部分:M68HC08 CPU、存储器、定时接口模块、定时基模块、看门狗模块、并行I/O接口、串行通信接口SCI、串行外设接口SPI、断点模块、A/D转换模块、键盘中断模块、时钟发生模
块及锁相环电路、低电压禁止模块、复位与中断模块、鉴控模块MON、系统设置模块。
2.2.4 GP32MCU的引脚功能
右图给出了42引脚的MC68HC908GP32
MCU 的引脚图,引脚功能分类简介如下
(1)电源类引脚:
VDD 、VSS(20引脚、19引脚):电
源供给端。
VDDAD/VREFH、VSSAD/VREFL(31引脚、
32引脚):内部A/D转换模块的电源供给
及参考电压输入端。
VDDA、VSSA(1引脚、2引脚):时钟
发生器模块(CGM)的电源供给端。
(2)控制类引脚:
RST(6引脚):外部低有效复位输入
或输出引脚,有内部上拉电阻。
IRQ(14引脚):外部中断输入引脚,
有内部上拉电阻。
(4)I/O类引脚:
PTA7/KBD7-PTA0/KBD0(42-35引
脚):8位通用双向I/O接口,每个可编程
为键盘输入引脚。
PTB7/AD7-PTBO/AD0(32-25引脚):8位通用双向I/O接口,也可作为8位A/D转换输入引脚。
PTC4-PTC0(11-7引脚):5位通用双向I/O接口。
PTD7/T2CH1-PTD0/SS(24-21引脚、18-15引脚):8种特殊功能、双向I/O 接口,其中PTD4-PTD7用于定时器模块(TIM1和TIM2)。
SPSCK、MOSI、MISO、SS用语串行外围接口(SPI)。
PTE1/TxD、PTE0/RxD(12引脚、13引脚):2位双向I/O接口或串行通信。
(4)其他:
CGMXFC(3引脚):CGM的外部滤波电容连接引脚。
OSC1、OSC2(5引脚、4引脚):芯片内振荡器引脚。
2.3 A/D转换模块
2.3.1 进行A/D转换的基本问题
(1)采样精度:数字量变化一个最小量时模拟信号的变化量,即采样位数。
(2)采样速率:是指完成一次A/D采样所要花费的时间。
(3)滤波:为了使采样的数据更准确,对采样的数据进行筛选去掉误差较大的毛刺。
通常采用中值滤波和均值滤波来提高采样精度。
中值滤波是取3次采样
的中间值,均值滤波是取多次采样的算术平均值。
(4)物理量回归:把A/D采样值与实际物理量对应起来。
2.3.2 数字控制系统框图
(1)A/D转换初始化对ADCLK写入控制字节,决定时钟输入源是内部总线还是外部晶振,决定分频系数等。
(2)启动A/D转换对ADSCR写入控制字节,选取要转换的通道、决定转换结束数据获取的方式、设置是连续转换还是一次转换等。
(3)获A/D转换结果若是中断方式,在A/D中断程序中取得,若是查询方式,通过ADSCR的第7位(COCO位)取得,当COCO=1时可从ADR中取数。
2.4 串行通信模块
2.4.1 RS-232C总线标准
MCU引脚一般输入/输出使用TTL电平,而TTL电平的“1”和“0”的特征电压分别为2.4V和0.4V,适用于板内数据传输。
为了使信号传输得更远,美国电子工业协会EIA(Electronic Industry Association)制订了串行物理接口标准RS-232C。
RS-232C采用负逻辑,-3V~-15V为逻辑“1”,+3V~+15V为逻辑“0”。
RS-232C最大的传输距离是30m,通信速率一般低于20Kbps。
RS-232接口,简称“串口”,它主要用于连接具有同样接口的室内设备。
目前几乎所有计算机上的串行口都是9芯接口。
右图给出了9芯串行接口的排列位置,相应引脚含义见表。
图2.6(a)芯串行接口排列图图2.6(b) MAX232芯片引脚图在MCU中,若用RS-232C总线进行串行通信,则需要外接电路实现电平转换。
在发送端需要用驱动电路将TTL电平转换成RS-232C电平,在接收端需要用接收电路将RS-232C电平转换成TTL电平。
电平转换器不仅可以由晶体管分立元件构成,也可以直接使用集成电路。
该系统使用MAX232芯片,该芯片使用单一+5V 电源供电实现电平转换。
图给出了MAX232的引脚。
MAX232芯片引脚含义说明如下:
• VCC(16脚):正电源端,一般接+5V
• GND(15脚):地
• VS+(2脚):VS+=2VCC-1.5V
• VS-(6脚):VS-=-2VCC-1.5V
• C2+、C2-(4、5脚):一般接1μF的电解电容
• C1+、C1-(1、3脚):一般接1μF的电解电容
输入输出引脚分两组,基本含义见表2。
在实际使用时,若只需要一路SCI,
组别TTL电
平引
脚
方向典型接
口
RS-232
电平引
脚
方向典型接口
1 11
12 输入
输出
接MCU的
TxD
接MCU的
RxD
13
14
输入
输出
连接到接口与其他设备通
过RS-232相接
2 10
9 输入
输出
接MCU的
TxD
接MCU的
RxD
8
7
输入
输出
连接到接口与其他设备通
过RS-232相接
2.4.2 SCI电平转换电路设计
具有SCI接口的MCU,一般具有发送引脚(TxD)与接收引脚(RxD),不同公司或不同系列的MCU,使用的引脚缩写名可能不一致,但含义相同。
SCI的电平转换电路,主要目的是将MCU的发送引脚TxD与接收引脚RxD的TTL电平,通过RS-232电平转换芯片转换为RS-232电平。
MCU的串行通信引脚12(TxD)、13(RxD)分别接MAX232的11(T1IN)、12(R1OUT),MAX232的13(R1IN)、14(T1OUT)分别为RS-232电平的2(接收RxD)与3(发送TxD)引脚。
基本过程是:发送过程——MCU的12(TxD)(TTL电平)经过MAX232的11(T1IN)送到MAX232内部,在内部TTL电平被“提升”为RS-232电平,通过14(T1OUT)发送出去。
接收过程——外部RS-232电平经过MAX232的13(R1IN)进入到MAX232的内部,在内部RS-232电平被“降低”为TTL电平,经过12(R1OUT)送到MCU 的13(RxD),进入MCU内部。
详细原理图如图
图 SCI电平转换电路
第三章系统软件设计
3.1 MCU的程序设计
在MCU上的程序包括头文件定义、温度驱动子程序、系统初始化子程序、串口通信子程序等,通过专用编译器和写入工具写到MCU中。
系统的软件部分用C 语言编程,采用模块化结构,主要由A/D转换模块、单片机内部数据处理模块、温度显示模块等3部分构成,便于修改和维护。
系统的所有程序文件,见下表:
温度测量系统工程文件
第四章编辑程序代码
1.系统主函数模块
#include "Includes.h" //总头文件
INT8U Light_Pin;
void main(void)
{ DisableMCUInt(); //禁止总中断
MCUInit(); //芯片初始化
//在此处添加用户程序
LEDinit();
FMQinit();
SCIinit();
ADCinit();
EnableMCUInt();
EnableSCIreInt();
while(1)
{ SCISend1(ADCave(0,200));
Light_Pin=0;
if(ADCave(0,200)<=0x40)
{ LED_L_A('L');
Delay(15000);
LED_L_A('A');
Delay(15000);
FMQSOUND(ADCave(0,200));
Delay(15000);
}
else if(ADCave(0,200)>0x40)
{ Light_Pin=1;
LED_L_A('L');
Delay(15000);
LED_L_A('A');
Delay(15000);
FMQSOUND(ADCave(0,200));
}
}
}
1.2 GP32系统初始化程序
#include "GP32C.h" //映像寄存器名定义
void MCUInit(void)
{ //1.设置CONFIG2,CONFIG1
//1.1 设置CONFIG2
CONFIG2 = 0b00000001;
// ||_SCIBDSRC = 1内部总线时钟用作SCI时钟
// |__OSCSTOPENB = 0 在stop模式下禁止振荡器工作
//1.2 设置CONFIG1
CONFIG1 = 0b00111101;
//||||||||_COPD = 1 禁止COP模块
//|||||||__STOP = 0 禁止STOP指令
//||||||___SSREC = 1 32个CGMXCLK周期退出STOP模式
//|||||____LVI5OR3 = 1 LVI工作在5V
//||||_____LVIPWRD = 1 禁止LVI模块电源
//|||______LVIRSTD = 1 允许LVI复位信号
//||_______LVISTOP = 0 在stop模式下禁止LVI
//|________COPRS = 0 COP溢出范围使用长的时间
//2.PLL编程
PCTL = 0x00; //(1)禁止PLL:清零PLL控制寄存器PCTL
PCTL = 0x01; //(2)将P,E写入PTCL,置VCO的参考频率为2 PMSH = 0x01; //(3)将N写入PMSH,PMSL,置VCO的倍频因子$12C PMSL = 0x2C;
PMRS = 0b;//(4)将L写入PMRS,置VCO的输出频率范围系数为$80
PRDS = 0x01; //(5)将R写入PRDS
PCTL |= (1<<5); //(6)置PCTL.PLLON = 1,启动PLL电路
PBWC |= (1<<7); //(7)PBWC自动带宽控制位 = 1,选择自动控制方式
PCTL |= (1<<4); //(8)PCTL.BCS = 1,选择PLL电路为时钟源
}
1.3 串行通信子函数
//[SCI.h] 串行通信头文件
#include"GP32C.h"
#include"Type.h"
#define ReSendStatusR SCS1
#define ReTestBit 5
#define SendTestBit 7
#define ReSendDataR SCDR
void SCIinit(void);
void SCISend1(INT8U o);
void SCISendN(INT8U n,INT8U ch[]);
INT8U SCIre1(INT8U *P);
INT8U SCIreN(INT8U n,INT8U ch[]);
//[SCI.c] 串行通信驱动文件
#include"SCI.h"
void SCIinit(void)
{ SCBR=0b00000010;
SCC1=0b01000000;
SCC2=0b00001100;
}
void SCISend1(INT8U o)
{ while(1)
if((ReSendStatusR & (1<<SendTestBit))!=0) { ReSendDataR=o;
break;
}
}
void SCISendN(INT8U n,INT8U ch[])
{ int i;
for(i=0;i<n;i++)
SCISend1(ch[i]);
}
INT8U SCIre1(INT8U *p)
{ INT16U k;
INT8U i;
for(k=0;k<0xfbbb;k++)
if((ReSendStatusR &(1<<ReTestBit))!=0)
{ i=ReSendDataR;
*p=0x00;
break;
}
if(k>=0xfbbb)
{ i=0xff;
*p=0x01;
}
return i;
}
INT8U SCIreN(INT8U n,INT8U ch[]) { int m;
INT8U fp;
m=0;
while(m<n)
{ ch[m]=SCIre1(&fp);
if(fp==1)
{
return 1;
}
m++;
}
return 0;
}
1.4 小灯循环被点亮模块
//[LED.h] 小灯驱动头文件
#include "GP32C.h"
#include "Type.h"
#define Light_P PTA
#define Light_D DDRA
void LEDinit(void);
void LED_L_A(INT8U flag);
//[LED.c] 小灯驱动函数定义
#include "LED.h"
#include"GeneralFun.h"
extern INT8U Light_Pin;
void LEDinit(void)
{ Light_D |=0xff;
Light_P |=0xff;
}
void LED_L_A(INT8U flag)
{ if(flag=='A')
{
Light_P |=1<<Light_Pin; }
else if(flag=='L')
{
Light_P &=~(1<<Light_Pin); }
}
1.5 蜂鸣器被设定鸣叫模块
//[FMQ.h] 蜂鸣器驱动头文件
#include "GP32C.h"
#include "Type.h"
#define FMQ_P PTB
#define FMQ_D DDRB
#define FMQ_Pin 1
void FMQinit(void);
void FMQSOUND(INT8U flag);
//[FMQ.c] 蜂鸣器驱动函数定义
#include "FMQ.h"
#include "GeneralFun.h"
void FMQinit(void)
{ FMQ_D |=1<<FMQ_Pin;
FMQ_P &=~(1<<FMQ_Pin);
}
void FMQSOUND(INT8U flag)
{ if(flag<=0x40)
{ FMQ_P &=~(1<<FMQ_Pin);
Delay(15000);
FMQ_P|=1<<FMQ_Pin;
Delay(15000);
}
else if(flag>0x40)
{
FMQ_P &=~(1<<FMQ_Pin);
}
}
1.6 A/D转换模块:
A/D转换有关头文件[ADC.h]
#include "GP32C.h"
#include "Type.h"
#define COCOBit 7
void ADCinit(void);
INT8U ADCvalue(INT8U channel);
INT8U ADCmid(INT8U channel);
INT8U ADCave(INT8U channel,INT8U n); A/D转换有关C语言子函数[ADC.c]
#include "ADC.h"
#include "SCI.h"
void ADCinit(void)
{
ADCLK=0b00110000;
}
INT8U ADCave(INT8U channel,INT8U n) { INT8U i;
INT16U j;
j=0;
for(i=0;i<n;i++)
j+=ADCmid(channel);
j=j/n;
return (INT8U)j;
}
INT8U ADCmid(INT8U channel)
{ INT8U i,j,k,tmp;
i=ADCvalue(channel);
j=ADCvalue(channel);
k=ADCvalue(channel);
if(i>j)
{ tmp=i;
i=j;
j=tmp;
}
if(k>i)
{ if(k>j)
{
tmp=j;
}
else
{
tmp=k;
}
}
else
{tmp=i;
}
return tmp;
}
INT8U ADCvalue(INT8U channel)
{ INT8U tmp;
channel&=0b00011111;
tmp=ADSCR&0b;
ADSCR=tmp|channel;
while((ADSCR&(1<<COCOBit))==0);
return ADR;
}
第五章系统测试
4.1 接硬件电路
将导线的一端连接试验箱的可变电阻,一端连接PTB 0口,然后分别用导线将一个红灯、一个绿灯连至PTA 0口及PTA 1口,再用导线将蜂鸣器连至PTB 1口。
最后将写入器的一端接MCU的目标板,一端接PC机,将PC机的通信线与MCU相连,然后打开电源,将目标板上的按钮打到“写入器”一端。
4.2 08C语言程序调试
打开MT-IDE集成开发环境,加载工程WENDUCHUANGAN.pjt,,编译源程序,屏幕上显示:
点击“Flash操作”,选择“写入”,弹出一个对话框如下:
点击“擦除及写入”,提示“写入完毕”,表示写入代码成功:
将目标板上的按钮打到“扩展板一端”
打开串口调试器:选择HEX显示,即用十六进制显示:
(1)可变电阻的阻值比设定的值0x40 大,所以此时是绿灯在不停的闪烁(2)可变电阻的阻值比设定的值0x40 小,所以此时是红灯在不停的闪烁,并且蜂鸣器也不间断的鸣叫以示温度过高报警。
第六章心得总结
本次课程设计我做了一个以Mcu GP32芯片为核心的简易温度传感器,虽然
一开始做的不太理想,但是最终还是做了出来。
课程设计我也做了很多次,但这一次的有点不一样。
不像以前的老师那样,给我们提供很多的材料,以及程序代码,按照步骤一步一步去做,而是只给我们一个设计条件,其他的自己去做,这样同学们就有各种给样的思路,去设计各种各样的实验,让我们勤于动脑,多思考,更给我们带来了很大的乐趣。
乐趣是建立在实验完成的基础上,如果完成不了实验心理总是会不好受。
如果真要去找原因,我想那原因应该就是自己吧。
一次实验是为了检测一段时间的学习情况,做的好了,说明你这段时间掌握的很好,做的不好,那就要好好的反思一下,那里做不好,哪里出现错误,有了错误就要去改正,在找错误和不断地改进中进步,现在多换错误,是为了将来少换点错误。
我并不是一个聪明的学生,但是我想只要用心去做,就一定会有收获,一定可以弥补以前的过失,再追上其他人。
勤能补拙,心能让人坚定目标,世上无难事,只怕有心人,就让我努力吧!
参考文献:
[1] 嵌入式技术基础与实践实验指导王宜怀曹金华沈安东刘晓升. 清华大学出版社,2008
[2] 嵌入式技术基础与实践王宜怀刘晓升编著清华大学出版社 2007
[3] 单片机原理与应用[M] 丁元杰机械工业出版社 2007
[4] 单片机原理与接口技术 [M] 胡汉才清华大学出版社 2006
[5] 单片机原理及应用系统设计[M] 胡学海北京电子工业出版社 2005。