1、- -?单片机原理及应用课程设计报告?课题:以电子钟为主的多功能设计 班级 车辆3101 学号 3102117107 学生 延力 指导教师 段卫平 工学院电子与电气工程学院目 录1 课程设计概述4 1.1 设计课题任务4 1.2 功能要求说明4 1.3 设计课题总体方案及工作原理42 设计课题硬件系统的设计62.1 硬件系统各模块功能简要介绍62.2 原理电路图72.3 设计PCB图,元器件布局图与与器件清单73 软件系统的设计83.1 软件系统各功能模块简要介绍83.2 设计课题软件系统程序流程框图83.3 设计课题软件系统程序清单 114 仿真与误差分析 124.1 设计课题的设计结论及使
2、用说明 124.2 设计课题的仿真结果 124.3 设计课题的误差分析 124.4 设计体会 134.5 教学建议 13参考文献 14致 15附录 16一、设计目的1总体要求(1) 独立完成设计任务(2) 绘制系统硬件总框图(3) 绘制系统原理电路图(4) 制定编写设计方案,编制软件框图,完成详细完整的程序清单和注释;(5) 制定编写调试方案,编写用户操作使用说明书 (6) 写出设计工作小结。对在完成以上文件过程所进展的有关步骤如设计思想、指标论证、方案确定、参数计算、元器件选择、原理分析等作出说明,并对所完成的设计作出评价,对自己整个设计工作中经历教训,总结收获和今后研修方向。2 具体要求本
3、次工程实践的校局部主要以单片机为根底,进展单片机软件编程,目的是为了提高学生的软件编程和系统设计能力,整个设计系统包括两个局部,硬件及软件局部,硬件局部已经制作成功,学生只需要掌握其原理和焊接相应的元器件,掌握元器件的区分和元器件的作用以及应用场所即可,另外对所焊接的电路还需要进展仔细的检查,判断是否有焊接错误的地方或者短路的地方,对出现的异常情况要能够根据现象判别原因,并具备解决问题的能力,从而切实提高学生的硬件电子电路的分析、判断能力。 软件编程是本次工程实践的重要环节。在为期两周的工程实践中,将占据主要时间,学生要完成的软件编程任务主要包括以下几点: 1、熟悉Keil C51编程平台及相
4、关编程软件 2、编写、调试蜂鸣器、继电器动作、方波程序并进展软硬件联调 3、编写、调试LED流水灯循环显示程序并进展软硬件联调 4、编写、调试键盘扫描子程序并进展软硬件联调 5、编写、调试数码管动态扫描程序并进展软硬件联调 6、电子钟设计包括键盘、时钟、显示等 7、温度测量控制系统设计包括键盘、显示、控制、报警等 其中前五个容是后两个容的根底,主要是编制一些子程序,为后继的整个系统设计打下根底。 电子钟设计一个简单的单片机编程设计,要求电子钟软件程序必须具备键盘扫描、数码管显示、时钟以及日历、秒表和闹钟功能。 温度测量与控制系统设计是一种非常简单而又应用普遍的温度控制系统、他包括温度采集、信号
5、转换、单片机处理以及控制、报警等局部。要求学生采用声光报警方式。二 、总体设计2.1 系统硬件总框图图1 系统设计总框图此次课程设计,AT89C52是一种带2K字节闪烁可编程可擦除只读存储器FPEROMFalsh Programmable and Erasable Read Only Memory的低电压,高性能CMOS 8位微处理器,俗称单片机。此次课程设计的电子钟就是由AT89C52单片机、时钟电路、报警电路,LED流水灯电路,动态数码管显示电路、音乐电路等组成。运用汇编语言来控制单片机AT89C52来实现LED流水灯、报警器、动态数码显示、电子音乐等功能,并在此根底上综合运用上述功能,实
6、现电子钟的设计(包括键盘、时钟、显示等),温度测量控制系统(包括键盘、显示、控制、报警等)。且本设计中的AT89C52单片机是整个工作过程的核心,是整个设计灵魂,它控制了脉冲时序的产生,显示信号的发送控制显示LED的选择。同时也考虑到AT89C52单片机来制作电子时钟其最大的好处就是可最大的调整时钟使其准确度更高。2.2 设计原理图图2 时钟电路原理图三、硬件单元设计3.1 NE555P模块图3为555定时器管脚分布。555定时器可构成多谐振荡器,是一种性能较好的时钟源。调节电位器RW1,使在555输出端3获得频率为5060Hz的矩形波信号,当根本RS触发器Q为1时,门5开启,此时脉冲信号通过
7、门5作为计数脉冲加于计数器的计数输入端CP。3.2 数码管显示为了能使电路简单我们采用数码管动态显示方式。数码管不同位显示的时间间隔可以通过调整延时程序的延时长短来完成。数码管显示的时间间隔也能够确定数码管显示时的亮度,假设显示的时间间隔长,显示时数码管的亮度将亮些,假设显示的时间间隔短,显示时数码管的亮度将暗些。假设显示的时间间隔过长的话,数码管显示时将产生闪烁现象。图4 数码管显示图3.3 DS1302模块DS1302的RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进展操作。如果在传送过程中RST置为低
8、电平,那么会终止此次数据传送,I/O引脚变为高阻态。其管脚图如下:图5 DS1302管脚图各引脚功能:Vcc1为后备电源,VCC2为主电源,X1和X2是振荡源,SCLK为输入端RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入 移位存放器;其次,RST提供终止单字节或多字节数据的传送 手段。3.4时钟控制石英晶体振荡器是利用石英晶体的压电效应制成的一种谐振器件,它的根本构成大致是:从一块石英晶体上按一定方位角切下薄片,在它的两个对应面上涂敷银层作为电极,在每个电极上各焊一根引线接到管脚上,再加上封装外壳就构成了石英晶体谐振器。其产品一般用金属外壳封装,也有用玻璃壳、瓷或塑料
9、封装的。HMOS型MCS-51外部时钟源的接发:在XTLA1和XTLA2两端跨接晶体或瓷振荡器,与部反相器构成稳定的自激振荡器。其发出的时钟脉冲直接送入片定时控制部件,其中C电容对频率有微调作用。图6 时钟电路3.5 扬声器图7 扬声器原理图蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的。因此需要一定的电流才能驱动它,单片机IO口输出的电流较小,其TTL电平根本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。程序过改变单片机对应IO口输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。另外,改变其占空比,也可以控制蜂鸣器的声音大小。可以有两种驱动方
10、式,即用PNP或NPN三极管电流放大电路驱动。本电路通过一个PNP三极管9012来放大驱动蜂鸣器,当输出高电平时,三极管Q1截止,没有电流流过线圈,蜂鸣器不发声;当输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。因此,我们可以通过程序控制IO口输出的电平来使蜂鸣器发出声音和关闭,从而实现各种可能音响的产生。启动报警子程序如下: 停顿报警子程序如下:START: SETB P1.0 STOP: CLR P1.0RET RET3.6 LED灯显示图8 LED灯显示电路图本次课程设计中,“程序语言通过“翻译软件“翻译成单片机所需的二进制代码,单片机可工作。要用外加电源和分压电阻来控制低
11、电平驱动点亮,因为单片机不能直接高电平驱动LED灯。如图D1-D8和R1、R2以及R6-R11连接到单片机IO口,当P1口某脚变低时相应LED发光。实现LED灯的闪烁,只需利用编程方法依次从低位到高位逐个变为低电平,等待少许时刻再变高即可。3.7 键盘图9 键盘电路在MCS-51系列单片机的指令系统中设有散转指令JMP A+DPTR,可看成是专门配合键入程序是整个应用程序的核心局部。键盘的操作,无论是按键或键盘都是利用机械触点的合、断作用。一个电压信号通过机械触点的闭合、断开过程。由于机械触点的弹性作用,在闭合及断开瞬间均有抖动过程,会出现一系列负脉冲。抖动时间的长短,与开关的机械特性有关,一
12、般为510ms。一组按键或键盘都要通过I/O口线查询按键的开关状态。且独立式按键电路配置灵活,软件构造简单,但每个按键必须占用一根I/O口线,在按键数量较多时,I/O口线浪费较大。3.8 AT89C52AT89C52是此次课程设计的核心局部。其管脚图如下:图10 AT89C52管脚图AT89C52是低功耗、高性能的CMOS8位单片机。片带有8KB的Flash存储器,且允许在系统改写或用编程器编程。另外,AT89C52的指令系统和引脚与80C52完全兼容。AT89C52各管脚功能如下:VCC:供电电压;GND:接地;P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。;P1口
13、:P1口是一个部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流;P2口:P2口为一个部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1时,其管脚被部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流;P3口:P3口管脚是8个带部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1后,它们被部上拉为高电平,并用作输入;P3口管脚功能:P3.0是RXD串行输入口;P3.1是TXD串行输出口;P3.2是/INT0外部中断0;P3.3是/INT1外部中断1;P3.4是T0记时器0外部输入;P3.5是
14、T1记时器1外部输入;P3.6是/WR外部数据存储器写选通;P3.7是/RD外部数据存储器读选通;P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当外部存储器时,地址锁存允许输出电平用于锁存地址的地位字节。/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA/VPP:当/EA保持低电平时,那么在此期间外部程序存储器0000H-FFFFH,不管是否有部程序存储器。XTAL1:反向振荡放大器的输
15、入及部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。四、软件单元设计4.1程序流程图开场取系统时间并转二进制为ACSII码将时间存入显示缓冲区显示时间和界面调用延时子程序返回DOS程序完毕调用清屏子程序C键按下?ESC键按下?否是是否调用时间修改程序读键盘输入值4.2程序清单T_R Bit P3.4 ;实时时钟复位线引脚 T_C Bit P3.2 ;实时时钟时钟线引脚 T_I Bit P3.3 ;实时时钟数据线引脚 SEC EQU 30H MIN EQU 31H H EQU 32H D EQU 33H MON EQU 34H W EQU 35H Y EQU 36H ORG 0000H
16、LJMP start ORG 001bH AJMP INTT1 ORG 0030HSTART: LCALL KEY AJMP START ;*蜂鸣器*KEY0: SETB P3.4 LCALL DELAY LCALL DELAYCLR P3.4 LCALL DELAY LCALL DELAYSETB P3.4LCALL DELAYLCALL DELAYCLR P3.4LCALL DELAYLCALL DELAYSETB P3.4LCALL DELAYLCALL DELAYCLR P3.4RET ;*流水灯*KEY1: MOV R2,#2REB: MOV R1,#8 MOV A,#0AFHLOO
17、PB: MOV P2,A RL A LCALL DELAY DJNZ R1,LOOPB DJNZ R2,REB RET;*日期* KEY2: CLR T_R CLR T_C MOV SP,#60H ;修改堆栈 MOV SEC,#00H ;初始时间设为10:00:00 MOV MIN,#00H MOV H,#10H MOV D,#18h ;初始日期设为08年1月18日第一周 MOV MON,#01H MOV W,#01H MOV Y,#08H LCALL SETDS1302 LCALL GET1302 LCALL DISPLAY MOV R3,#25 MOV TMOD,#01H MOV TH0,
18、#70H ;置定时器初值(定时40ms) MOV TL0,#00H SETB TR0 ;启动定时器0LP1: C TF0,LP2 ;查询计数溢出 SJMP LP1 ;未到40 ms继续计数LP2: MOV TH0,#0B8H ;重新置定时器初值 MOV TL0,#00H LCALL DISPLAY ;显示 DJNZ R3,LP1 ;未到1 S继续循环 LCALL GET1302 ;每过1s从DS1302读取一次时间MOV r3,#25 SJMP LP1;数码显示子程序DISPLAY: MOV DPTR,#DIG_CODE;显示分钟 MOV P1,#11110111b MOV A,MIN ANL
19、 A,#0FH MOVC A,A+DPTR MOV P0,A LCALL DIS_DELAY MOV P1,#11111011b MOV A, MIN SWAP A ANL A,#07H MOVC A,A+DPTR MOV P0,A LCALL DIS_DELAY;显示小时 MOV P1,#11111101b MOV A,H ANL A,#0FH MOVC A,A+DPTR MOV P0,A LCALL DIS_DELAY MOV P1,#11111110b MOV A,H SWAP A ANL A,#03H MOVC A,A+DPTR MOV P0,A LCALL DIS_DELAY RET
20、 ;显示延时5ms子程序DIS_DELAY: PUSH PSW MOV R7,#10D1: MOV R6,#248D2: DJNZ R6,$ DJNZ R7,D1 POP PSW RET;设置DS1302初始时间,并启动计时SETDS1302: CLR T_RNOP CLR T_CNOP SETB T_R NOP MOV B,#8EH ;写控制命令字 LCALL INPUTBYTE MOV B,#00H ;写保护关闭 LCALL INPUTBYTE SETB T_CNOP CLR T_R MOV R0,#SECOND ;存中的时间首地址 MOV R1,#80H ;DS1302中的时间首地址 M
21、OV R7,#7 ;字节数SETLOOP: CLR T_RNOP CLR T_CNOP SETB T_RNOP MOV B,R1 ;写命令字 LCALL INPUTBYTE MOV A,R0 ;设置时间 MOV B,A LCALL INPUTBYTE INC R0 INC R1 INC R1 SETB T_CNOP CLR T_RNOP DJNZ R7,SETLOOP CLR T_RNOP CLR T_CNOP SETB T_RNOP MOV B,#8EH LCALL INPUTBYTE MOV B,#80H ;开写保护 LCALL INPUTBYTE SETB T_CNOP CLR T_RN
22、OP RET;从DS1302读取时间GET1302: MOV R0,#SECOND MOV R1,#81H ;DS1302中读时间的首地址 MOV R7,#7GETLOOP: CLR T_RNOP CLR T_CNOP SETB T_RNOP MOV B,R1 LCALL INPUTBYTE ;写命令字 LCALL OUTPUTBYTE ;读时间 MOV R0,A ;将从DS1302中读取的时间从存中保存 INC R0 ;修改地址指针 INC R1 INC R1 SETB T_CNOP CLR T_RNOP DJNZ R7,GETLOOP RET;向DS1302写一个字节INPUTBYTE:
23、MOV R4,#8INPUTLOOP: MOV A,B RRC A MOV B,A MOV T_I,C SETB T_C NOP NOP NOP CLR T_C DJNZ R4,INPUTLOOP RET;从DS1302读一个字节OUTPUTBYTE:CLR aCLR c MOV R4,#8OUTPUTLOOP: NOP NOP MOV C,T_I RRC A SETB T_C NOP NOP NOP CLR T_C DJNZ R4,OUTPUTLOOP RETKEY: MOV P1,#0F0H MOV A,P1 MOV B,A ACALL DELAY MOV A,P1 CJNE A,B,DO
24、 CJNE A,#0E0H,K1 AJMP KEY0K1: CJNE A,#0D0H,K2 AJMP KEY1K2: CJNE A,#0B0H,K3 AJMP KEY2K3: CJNE A,#070H,DO AJMP KEY3DO: RETDELAY: MOV R6,(#200)DL1: MOV R5,#250 DJNZ R5,$ DJNZ R6,DL1RETDEL1: MOV R7,#02DL2:MOV R6,#0FFH DJNZ R6,$ DJNZ R7,DL2 RETDELAYY1:MOV R7,#02DELAY10:MOV R4,#187DELAY11:MOV R3,#248 DJNZ
25、 R3,$ DJNZ R4,DELAY11 DJNZ R7,DELAY10 DJNZ R5,DELAYY1 RETkey3: MOV SP,#60H MOV TMOD,#10H SETB ET1 SETB EA SETB TR1START0:clr p3.4 MOV 30H,#00HNEXTT:MOV A,30H MOV DPTR,#TABLE MOVC A,A+DPTR MOV R2,A JZ ENDD ANL A,#0FH MOV R5,A MOV A,R2 SWAP A ANL A,#0FH JNZ SING CLR TR1 AJMP DD1SING:DEC A MOV 22H,A RL
26、 A MOV DPTR,#TABLE1 MOVC A,A+DPTR MOV TH1,A MOV 21H,A MOV A,22H RL A INC A MOVC A,A+DPTR MOV TL1,A MOV 20H,A SETB TR1DD1: LCALL DELAYY INC 30H AJMP NEXTTENDD:CLR TR1 AJMP START0INTT1:PUSH PSW PUSH ACC MOV TL1,20H MOV TH1,21HCPL p3.4 POP ACC POP PSW RETIDELAYY:MOV R7,#02DELAY0:MOV R4,#187DELAY1:MOV R
27、3,#248 DJNZ R3,$ DJNZ R4,DELAY1 DJNZ R7,DELAY0 DJNZ R5,DELAYY RETTABLE: DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H
28、DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H,00HTABLE1: DW 64260,64400,64524,64580,64684,64777,64820,64898 DW 64968,65030,65058,65110,65157,65178,65217;字符显示码表DIG_CODE: DB 14H,0d7H,4cH,45H,87H,25H,24H,57H,04H,44H END五、焊接与调试一软件调试步骤1、从桌面或【开场】菜单项选择择【程序】Keil Uvision命令,翻
29、开此软件,进入Keil Uvision界面。2、翻开软件后,在Project菜单中选择New Project命令,翻开一个新工程。保存此工程,输入工程文件名后,并保存工程文件的目录。4、为工程文件选择一个目标器件,即选择8051的类型。在Data base 列表框中选择“ATML 89C52,确定。5、用鼠标对准工程工作区的目标1,点击右键在弹出的菜单中选择“为目标目标1设置选项。在为“为目标目标1设置选项中,点击“调试菜单,在此菜单中可选择使用硬件仿真或软件仿真,假设连接实验箱时那么选择硬件仿真,点击硬件仿真选项后面的调试选项,在此对话框中选择串口波特率,波特率为38400。6、上述设置好后
30、,点击“文件/新建,创立源程序文件并输入程序代码。输入好代码后点击“文件/保存。7、把源文件添加到工程中,用鼠标指在目标工作区的目标1,点击右键在弹出的菜单中选择添加文件到源代码组,在弹出的添加文件框中,选择需要添加到工程中的文件。8、开场编译,点击编译连接的图标,对工程文件进展编译。9、假设编译没有错误后,为工程工程设置软硬件调试环境。二烧录程序的步骤1、用编辑软件编写程序,使用汇编语言编写的程序文件名后缀即扩展名是.ASM,编写的程序为称为源程序。2、将源程序用编译软件进展编译,生成扩展名为.OBJ的文件。3、通过编程器扩展名为.HEX的可执行文件烧到单片机。在写入之前还可以进展软件仿真,
31、既在软件上模拟单片机程序原形情况,以便进展调试和修改。三调试 按照此次课程设计的要求调试过程如下:按键KEY0,KEY1,KEY2,KEY3分别对应蜂鸣器,LED流水灯,数码管,音乐四个功能。1、蜂鸣器测试 通过按按键KEY0,听到蜂鸣器发出“嘀 ,“嘀的响声;与相应的程序代码相比拟,结果正确。2、LED流水灯测试 通过按按键KEY1,观察到LED流水灯显示,并循环2次;与相应的程序代码相比拟,结果正确。 3、数码管测试 通过按按键KEY2,观察到数码管从“1000 开场计时,依次显示“1001 ,“1002 ,“1003 ;与相应的程序代码相比拟,结果正确。因为程序要求数码管显示的时间是小时
32、和分钟,所以要观察到数码管的变化要等一分钟的时间。 4、 音乐测试通过按按键KEY3,听到蜂鸣器响起“生日快乐的音乐;与相应的程序代码相比拟,结果正确。六、设计总结通过本次实验,让我对80C51单片机有了更好的了解,懂得如何去使用定时器计数器,中断,串行口,数码管显示,按键等知识,让自己对单片机产生了更大的兴趣。能够完全实现数字钟的功能,让自己所学的东西应用到实践中,感觉到了单片机的重要性。能够通过单片机,完成各种成品的设计。通过本次设计,我们系统的了解了实时时钟的设计流程,尤其是硬、软件的设计方法,掌握了键盘显示电路的根本功能及编程方法,掌握了键盘电路和显示电路的一般原理,也进一步掌握了定时
33、器的使用和中断处理器程序的编程方法。开拓了思路,锻炼了实践动手能力,提高了分工协作能力和分析问题,解决问题的能力,到达了本次课程设计的目的。在调试电路的过程中也积累了一些珍贵的经历,比方说,在I/O口要保证标准的高电平1的产生,一般要上拉电阻5.1k,在一些需要高电平的地方,不能用悬空来模拟,必须严格的按照“+5v来连接,特别是调试过程中的分局部进展很重要。此次单片机课程设计,从理论到实践,学到了很多的东西。同时不仅稳固了以前所学过的知识,而且还学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合
34、起来,从理论中得出结论,才能真正为社会效劳,从而提高自己的实际动手能力和独立思考的能力。这次的课程设计还让我学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。更重要的是,我在这一设计过程中,学会了坚持不懈,不轻言放弃。单片机课程设计虽然完毕了,但通过设计所学到的东西将长久存在。相信这次设计带给我们的严谨的学习态度和一丝不苟的科学作风将会给我们未来的工作和学习打下一个更坚实的根底单片机课程设计,是对单片机知识的验证,可以帮助我们理解稳固所学知识,激发我们对单片机课程的兴趣,更锻炼了我们独立思考、开拓创新的能力。在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。为了让自己
35、的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。我们是在做单片机课程设计,但我们不是艺术家,他们可以抛开实际尽情在梦想的世界里翱翔,而我们一切都要有据可依,有理可寻,不切实际的设想永远只能是设想,永远无法升级为设计。最后,要做好一个课程设计,就必须做到:在设计程序之前,对所用单片机的部构造有一个系统的了解,知道该单片机有哪些资源;要有一个清晰的思路和一个完整的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改良是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。还有要感指导教师在我们遇到困难时,给予我们的建议与鼓励。通过这次课程设计,让我对?单片机原理与运用?这门课程有了更深刻的理解,坐而言比方立而行,对于这些单片机运用设计还是应该自己动手实际操作才会有深刻理解七、参考文献1 何立民.单片机应用技术大全.:航空航天大学, 19942 永雄.新编单片机原理与应用M,:电子科技大学,2003.2.3 小军.用单片机