目 录
第1节 前 言……………………………………………………………………………1
1.1 多路温度采集系统概述…………………………………………………………1 1.2 本设计任务和主要内容………………………………………………………1 第2节 系统总体设计…………………………………………………………………2
2.1 系统概述………………………………………………………………………2 2.2 系统工作原理…………………………………………………………………2 第3节 系统的硬件设计………………………………………………………………3 3.1 CPU的选用……………………………………………………………………3
3.2 ADC0809………………………………………………………………………4 3.2.1 ADC0809的内部逻辑结构………………………………………………4
3.2.2引脚结构…………………………………………………………………5
第4节 软件编辑思路及流程……………………………………………………………6
4.1 软件编辑思路…………………………………………………………………6 4.2 具体软件编程…………………………………………………………………6
第5节 结束语…………………………………………………………………………18
参考文献…………………………………………………………………………………19
基于单片机的多路温度采集系统
第1节 前 言
本课题要设计一种多路温度采集检测系统,采用目前低价位但技术十分成熟的
AT89C52单片机作为内核,选用电位器代替热敏电阻为输入元件,利用ADC0809转换信号,送到显示器(8个LED数码管)循环显示所测的四路温度数值,并根据现场工业需要,设置了一定范围的报警值,报警优先显示,利用按键消除报警。可用按键查看某一路的温度值,查看时采集不中断。软件算法上采用了直接拟合的方法(通过电压-温度关系来计算温度值),符合课题要求。本课题构成的多路温度系统具有结构简单、价格低廉、测量精度高、量程宽的特点,在很多场合具有一定的适用性。 关键词: AT89单片机、温度采集、显示、报警
1.1 多路温度采集系统概述
温度采集在工业中的应用越来越广泛,而且要求也越来越高,我们结合本学期所学的《单片机原理与应用技术》课程,利用实验室已有的AT89系列单片机,作一个简易的可多路检测温度并能在超出范围时报警的系统。该系统用AT89S52单片机作为内核,利用ADC0809转换芯片辅助,以八个电位器作为模拟温度输入信号,一个5路8位数码管作为显示设备。可单独循环显示每一路的温度值,并且有键盘控制显示每路的温度值,这样可以满足在工业需要。
1.2 本设计任务和主要内容
设计应解决下列各主要问题:
1、8路温度值(可用0~5V电压值模拟0-100℃)的数据采集,经A/D转换后送入单片机;
2、8个键盘、8个LED数码管显示电路,用于循环显示每一路的温度值(显示精确到小数点后一位),通过按键还可以选择任意一路显示。
3、设温度值的正常范围,若当前温度值超过此范围,则LED闪烁报警; 4、通过按键解除报警。
1
第2节 系统总体设计
2.1 系统概述
根据设计要求的性能指标,本系统不仅要满足一定精度的温度采集的基本功能,
而且由于测量的路数为8路,还存在多路信号的循环显示问题,还要考虑温度超限报警输出的功能,同时系统还具有显示当前各路的测量温度值的功能和键盘选择显示路数的功能。
2.2 系统工作原理
根据本课题的设计目标以及硬件的特点,本系统的结构原理图如下图2-1所示:
图2-1 系统结构原理图
图2-2 系统原理图
第3节 系统的硬件设计
一个温度采集系统,包括被采集信息的采集、转换、显示等环节,在本多路温度采集系统中,包括A/D转换电路的设计,CPU的选型以及包括显示电路,存储器、报警电路、电源电路等设计。
3.1 CPU的选用
目前,生产单片机的厂商有很多,尤其是近年来微电子技术、计算机技术的飞速发展,比较著名的有Intel、Philips、Microchip、Motorola、Zilog、Atmel等半导体企业。
在上述著名的半导体企业产品中,尤其在工业测控场合,运用较多的为Intel公司的MCS-51系列,Microchip公司的PIC系列,如果作单路温度测量,恐怕要选
2
择该系列的CPU,但由于本系统涉及的是多路,各路报警的输出信号需要单独输出,而且考虑信号调理电路的切换等还需要不少的控制线,因此该系列的少引脚特点就不适合本设计的需要,因此,本设计还是选用了ATMEL最新的8位单片机AT89S52作为本系统的CPU。下面简单地介绍一下89S52。
功能特性描述:AT89S52 是一种低功耗、高性能 CMOS8 位微控制器,具有8K 在系统可编程 Flash 存储器。使用 Atmel 公司高密度易失性存储器技术制造,与工业 80S52 产品指令和引脚完全兼容。片上 Flash 允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的 8 位 CPU 和在系统可编程 Flash,使得 AT89S52 为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
89S52 具有以下标准功能:8k 字节 Flash,256 字节 RAM,32 位 I/O 口线,看门狗定时器,2 个数据指针,三个 16 位定时器/计数器,一个 6 向量 2 级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至 0Hz 静态逻辑操作,支持 2 种软件可选择节电模式。空闲模式下,CPU停止工作,允许 RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM 内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
图3-1 89C52的引脚
3.2 ADC0809
ADC0809是把采集的模拟量转换成数字量并传送到89C52中。它是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件并且还是逐次逼近式A/D转换器,可以和单片机直接接口。
3
3.2.1 ADC0809的内部逻辑结构
图3-2 ADC0809的内部逻辑结构
由图3-2可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
3.2.2 引脚结构
图3-4 ADC0809的引脚
4
第4节 软件编辑思路及流程
4.1 软件编辑思路
软件编辑思路:数字显示----算法----一路采集----一路采集转换及显示---八路采集转换及显示----键盘小子程序----八路循环采集且键盘控制------八路循环采集且键盘控制和报警。
4.2 具体软件编程 ORG 0000H
AJMP MAIN;
BUF EQU 40H ;显示缓冲区
MOTATA EQU 50H ;AD0809数据存放于此 WH EQU 48H ;温度上限数据存放区 WL EQU 58H ;温度下限数据存放区 BUFF1S EQU 38H; BUFF1MS EQU 39H; BUFF5S EQU 3AH; INNAL EQU 3CH; ALARMBUF EQU 33H
BUFFH EQU 31H ;八路LED报警信号 红灯 BUFFL EQU 32H ;八路LED报警信号 绿灯
5
BACK EQU 34H ;利用与BUF地址的重复修改路数 CHANNEL EQU 35H TEMPBUF EQU 36H
READ_AD BIT 30H ;是否要读写AD0809的标志位 DISPIN BIT 31H; SETWARN BIT 32H SOLIDISP BIT 33H ENTER BIT P1.2 SETH BIT 35H SETL BIT 36H SETIN BIT P1.3 ABYTEIN BIT p1.1 ORG 0003H AJMP INT_0; ORG 000BH LJMP INT_T0 ORG 0100H
MAIN: MOV SP, #70H ; SETB READ_AD ; SETB EA ; CLR SETWARN ; SETB SETIN ; LCALL INITWARN ; LCALL INIT_2 ; ;LOOP: JNB READ_AD,DIS ; ; LCALL WARN ; CLR READ_AD ; LCALL READ ; LCALL DLY1MS ; LCALL ADJUST ; DIS: LCALL DISPLAY;
LCALL KEYCHK ; CJNE A,#0FFH, AKEY ; LJMP LOOP ;AKEY: LCALL KEYFUNC;
CJNE A,#0FFH,CALLRPD ; LJMP LOOP ;CALLRPD: LCALL KEYRPD;
设置堆栈位置 初始化标志位 开总中断
清除温度设置标志位
当其为0时表示要进行通道数采集 初始化温度上下限
初始化2#工作寄存器区
主循环,启动ADC0809,从第一个通道开始读取若不读AD0809,则调显示,次标志位也表示1s
延时结束
延时已完毕,则计算要显示的温度路数及温度值
送缓冲区
报警
清楚标志位
读取一次AD0809 此处加1ms的延时,否则数码管会因中断的存在
而产生闪动
调整显示
在此完成键盘检测及显示任务
调键盘检测子程序 若有键按下,则跳转 若没有则循环 验证按下的键是否为数字键,若是则处理输入 不为数字键则返回循环 6
;
SJMP LOOP;
;*********初始化2#工作寄存器区************
INIT_2: PUSH PSW ;初始化2号工作寄存器区 SETB RS1;
CLR RS0 ;选择2号工作寄存器区 MOV R2, #00H ;存放要显示的路数 CLR DISPIN ;初始化路显示标志位;
MOV R0, #MOTATA ;R0充当指向MOTATA的指针 POP PSW; RET;
;*******调整指针********* PADJUST:
ONADJUST: DJNZ R2,INADJUST; RET;返回 INADJUST: INC R0;
SJMP ONADJUST;
;*************计算并调整显示缓存区的数据******* ADJUST: PUSH PSW ;保护 SETB RS1;
CLR RS0 ;选择2号工作寄存器区 CJNE R2,#08H,NE08; GE08: MOV R2,#00H; MOV R0,#MOTATA; SJMP LESS08; NE08: JNC GE08;
LESS08: JB SETWARN, DISPWARN ;若在设定温度,则也不调整显示 JB SOLIDISP, ADJEND ;若为固定显示,则跳过调整 JB DISPIN,DLY_5S ;若有键盘值输入,则延时5秒来暂时固定显示 INC R0 ;调整R0,使其指向下一个要显示的温度值地
址
INC R2 ;调整R2 mov channel,r2; SJMP ADJEND;
DLY_5S: DJNZ BUFF5S,ADJEND; CLR DISPIN; LJMP ADJEND
DISPWARN: JB SETH,DISHIGH ;若在调整上限值则跳转到上限温度显示 JB SETL,DISLOW ;若在调整下限值则跳转到下限温度显示
SJMP ADJEND ;若不在调整则显示输入路数的当前检测温度
值
DISLOW: MOV R0,#WL ;将指针调整到温度上限存放区 SJMP ADAPT ;跳转到指针调整处
DISHIGH:MOV R0,#WH ;将指针调整到温度下限存放区 ADAPT: MOV R2,CHANNEL ;调整R2的值为通道数
7
LCALL PADJUST ;指针指向R2
ADJEND: LCALL LOADTEMP ;将当前指针指向数据放到缓冲区 POP PSW; RET;
;**************** 将当前指针指向数据放到缓冲区********
LOADTEMP: LCALL COMPUTE ;调用COMPUTE得到要显示的当前温度值 MOV R1,#BUF; MOV A,channel;
MOV @R1,A ;将路数送入显示缓冲区
INC R1 ;调整到要显示温度值的缓冲区 JB SETH,DISPH ;若设定温度上限,则显示H JB SETL,DISPL ;若设定温度下限,则显示L Mov a,#10h ;消隐 SJMP DISP2 DISPH: MOV A,#11H SJMP DISP2 DISPL: MOV A,#12H DISP2: mov @r1,a; INC R1; MOV A,R5; ANL A,#0FH;
MOV @R1,A ; 最低位 INC R1; MOV A,R5; ANL A,#0F0H; SWAP A;
MOV @R1,A ;次低位 ,应当在此处添加小数点 INC R1; MOV A,R4; ANL A,#0FH;
MOV @R1,A ;次高位 INC R1; MOV A,R4; ANL A,#0F0H; SWAP A;
MOV @R1,A ;最高位 RET;
;*************读取一次0809的内容***********
READ: MOV R6,#08H ;用中断的方式读取一次AD0809 MOV R0,#MOTATA ;0号工作寄存器区 MOV DPTR,#0FFFEH ;A0作为地址
MOV A,#00H ;表示先检测第一个通道 MOV INNAL,A ;将检测的路数保存 MOVX @DPTR,A ;开启ADC0809
8
SETB EX0 ;开外部中断0
RET ;若已读取完毕,则返回 ;**********************显示子程序************ ;要显示的数据入口为BUF(6位);1号工作寄存器区 DISPLAY: PUSH PSW ;压栈保护 SETB RS0;
CLR RS1 ;切换工作寄存器区到 1 MOV R0,#BUF MOV R7,#06H MOV R1,#01H NEXTDIS: MOV A,@R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR ;取段码 CJNE R7,#03H,NODIP ;显示小数点 ANL A,#07FH NODIP: MOV DPTR,#0FFDCH
MOVX @DPTR,A ;送段码 MOV DPTR,#0FFDDH MOV A,R1
MOVX @DPTR,A ;送位码 RL A MOV R1,A LCALL DLY1MS
INC R0 ;调整显示 DJNZ R7,NEXTDIS; POP PSW; RET
;**************************延时1ms**************************** DLY1MS: MOV BUFF1MS,#0F9H DJNZ BUFF1MS,$ RET
;*************************按键检查子程序******************** KEYCHK:MOV A,#00H ;查看是否有键按下 MOV DPTR,#0FFDDH MOVX @DPTR,A MOV DPTR,#0FFDEH MOVX A,@DPTR CPL A
ANL A,#0FH
JNZ TEST ;若有键按下则检测,无则返回。 MOV A,#0FFH RET
TEST: LCALL KEYTEST MOV BACK,A
9
LCALL DISPLAY LCALL KEYTEST
CJNE A,BACK,NOKEYD WAIT: LCALL DISPLAY;
MOV A,#00H ;等待键抬起 MOV DPTR,#0FFDDH MOVX @DPTR,A MOV DPTR,#0FFDEH MOVX A,@DPTR CPL A
ANL A,#0FH
JNZ WAIT ;若键未抬起,则继续等待 MOV A,BACK ;将检测到的键值送给A SJMP CHKEND NOKEYD: MOV A,#0FFH CHKEND: RET
;**********************按键检测子程序******************** KEYTEST: MOV R0,#0FEH MOV R1,#00H MOV R2,#08H NEXTL: MOV A,R0
MOV DPTR,#0FFDDH MOVX @DPTR,A MOV DPTR,#0FFDEH MOVX A,@DPTR CPL A
ANL A,#0FH
JNZ KEYDWN ;看按下的键是否在当前列
DJNZ R2,GOSCAN ;看是否扫描完毕,若没有则调整继续扫描 SJMP TSTEND ;若扫描完毕,则返回。 GOSCAN: MOV A,R0 RL A MOV R0,A INC R1 SJMP NEXTL KEYDWN: MOV R3,#00H LL0: RRC A JC LL1 INC R3 SJMP LL0 LL1: MOV A,R3 MOV B,A MOV A,#8 MUL AB
10
ADD A,R1 ;A中返回的为按下的键的代码 RET
TSTEND: MOV A,#0FFH RET
;***********延时1s******************* DLY_1S: MOV TMOD,#01H; SETB ET0;
MOV TH0,#0F0H ;10ms MOV TL0,#0D8H; MOV buff1s,#100; SETB TR0; RET;
;*********定时器T0中断服务程序********** INT_T0:CLR TR0 ;关计数器
DJNZ buff1s ;NEXT_10MS;若不到1s继续 SETB READ_AD;若到了,则置标志位 cpl p1.0; clr et0; SJMP T0_END;
NEXT_10MS: MOV TMOD,#01H
MOV TH0,#0F0H ;定时10ms MOV TL0,#0D8H SETB TR0 T0_END: RETI
;*************计算子程序,完成一路计算**************** COMPUTE: MOV A,@R0;
MOV B,#04H ;测得的温度数乘以4 MUL AB; MOV R6,B; MOV R7,A;
LCALL HB2 ;调用子程序转化为压缩BCD码,R4,R5为出口 RET;
HB2: CLR ;BCD码初始化 MOV R4,A MOV R5,A
MOV R3,#10H ;转换双字节十六进制整数
HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中 RLC A MOV R7,A MOV A,R6 RLC A MOV R6,A
MOV A,R5 ;BCD码带进位自身相加,相当于乘2 ADDC A,R5
11
DA A ;十进制调整 MOV R5,A MOV A,R4 ADDC A,R4 DA A MOV R4,A
DJNZ R3,HB3 ;处理完16bit RET;
;********报警子程序*********
WARN: MOV R0,#MOTATA ;R0指向MOTATA MOV R1,#WH ; R1指向WH MOV R7,#08H ;R7为循环次数 WLOOP:MOV A,@R0
MOV ALARMBUF,@R1 ;与指令相适应的必要中转 CJNE A,ALARMBUF,RED
GEHIGH: CLR C ;红灯信号 LJMP NEXTRED
RED : JNC GEHIGH ;读入数值比预设大 SETB C
NEXTRED:MOV A,BUFFH
RLC A ;压入红灯信号 MOV BUFFH,A
MOV A,R1 ;调整R1指向WL ADD A,#10H MOV R1,A
MOV ALARMBUF,@R1 MOV A,@R0
CJNE A,ALARMBUF,GREEN LSLOW: CLR C ;绿灯信号 LJMP NEXTGRN
GREEN: JC LSLOW ;读入数值比预设小 SETB C
NEXTGRN:MOV A,BUFFL RLC A
MOV BUFFL,A MOV A,R1 SUBB A,#10H MOV R1,A INC R1 INC R0
DJNZ R7,WLOOP
MOV A,BUFFH ;将红灯报警信息送出 MOV DPTR,#0FBFFH ;红灯信号对应地址p2.2 MOVX @DPTR,A
12
MOV A,BUFFL ;将绿灯报警信息送出 MOV DPTR,#0F7FFH ;绿灯信号对应地址p2.3 MOVX @DPTR,A RET
;************键位调整程序************ KEYFUNC: MOV DPTR,#KEYTABLE
ANL A,#0FH ;消除键位干扰 MOVC A,@A+DPTR ;调整跳转位置 CJNE A,#0AH,K1 MOV A,#0FFH SETB SETIN
SETB SETH ;表示要设定温度报警上限值 CLR SETL RET;
K1: CJNE A,#04H,K2 MOV A,#0FFH SETB SETIN
SETB SETL ;表示要设定温度报警下限值 CLR SETH RET
K2: CJNE A,#0FH,K3 MOV A,#0FFH
JB SETWARN,ENDISP SETB SETWARN CLR ABYTEIN CLR SETH CLR SETL CLR ENTER RET
ENDISP: CLR SETWARN; CLR SETH; CLR SETL; RET;
K3: CJNE A,#0EH,K4 MOV A,#0FFH
JB SOLIDISP,ENSOLID; SETB SOLIDISP RET
ENSOLID: CLR SOLIDISP RET
K4: CJNE A,#0CH,K5 MOV A,#0FFH; CLR SETIN; CLR SETH;
13
CLR SETL; RET;
K5: CJNE A,#0DH,K6 MOV A,#0FFH SETB ENTER RET; K6: RET
KEYTABLE: db 07h,04h,08h,05h,09h,06,0Ah ; 0, 1 ,2 ,3 ,4 ,5 ,6
db 04h,01h,00h,02h,0Fh,03h,0Eh,0Ch,0Dh ; 7 ,8 ,9 ,10 ,11,12, 13, 14 ,15 ;*********实现对各个设定键的响应**********
KEYRPD: JB SETWARN,WARNSET ;根据SOLIDISP的值调显示 PUSH PSW; SETB RS1;
CLR RS0 ;选择2号工作寄存器区 MOV R0,#MOTATA;
MOV CHANNEL,A ;将读入的值放入通道缓冲 MOV R2,A; MOV BACK,A; MOV BUF,A;
LCALL PADJUST ;调整R0,使其指向R2通道的温度值 SETB DISPIN ;5s计时的标志位 MOV BUFF5S,#05H ;初始化5s计时 MOV R2,CHANNEL; POP PSW;
RET ;调整完毕,返回
WARNSET:JNB SETIN,INSET ;若未设定通道,先进行设定 LJMP SETTEMP ;若已设定则跳转到温度设定处 INSET: MOV CHANNEL,A RET
SETTEMP:JB SETH,HIGHSET ;设定温度警告上限 JB SETL,LOWSET ;设定温度警告下限 RET
HIGHSET: LCALL READTEMP
MOV R0,#WH ;调整R0使其指向温度上限存储区 LJMP STORESET LOWSET: LCALL READTEMP
MOV R0,#WL ; 调整R0使其指向温度下限存储区 STORESET:MOV A ,TEMPBUF;
LCALL COMPACT ;将输入的数转化为16进制数存储(未改变R0) MOV R2,CHANNEL ;送入要调整到的位置 LCALL PADJUST ;调用调整子程序
MOV @R0 ,A ; 将温度值送到相应的位置
14
RET
READTEMP: JB ABYTEIN,READLOW;若已经有一位读入则读取低位 READHIGH: SWAP A;
MOV TEMPBUF,A; SETB ABYTEIN; RET;
READLOW: ORL A,TEMPBUF; MOV TEMPBUF,A; CLR ABYTEIN; RET;
;**********将输入温度值转化为16进制数********** COMPACT: MOV R2,A;
ANL A,#0FH ;分离出十进制数的低位 SWAP A; MOV R3,A; MOV A,R2;
ANL A,#0F0H ;分离出十进制数的高位 SWAP A; MOV R2,A;
LCALL BH2 ;将双字节BCD码转化为十六进制整数 MOV A,R2 ;将R2R3中的数除以4 CLR C; RRC A; MOV R2,A; MOV A,R3; RRC A; MOV R3,A MOV A,R2; RRC A; MOV A,R3
RRC A ;转换完毕A中为要得到的16进制数 RET;
;*********双字节BCD码整数转换成双字节十六进制整数********* BH2: MOV A,R3 ;将低字节转换成十六进制
LCALL BCDH MOV R3,A
MOV A,R2 ;将高字节转换成十六进制 LCALL BCDH
MOV B,#100 ;扩大一百倍 MUL AB
ADD A,R3 ;和低字节按十六进制相加 MOV R3,A CLR A ADDC A,B
15
MOV R2,A RET
;*******单字节BCD码整数转换成单字节十六进制整数 BCDH: MOV B,#10H ;分离十位和个位
DIV AB
MOV R4,B ;暂存个位
MOV B,#10 ;将十位转换成十六进制 MUL AB
ADD A,R4 ;按十六进制加上个位 RET
;********初始化WH和WL******** INITWARN: MOV R0,#WH; MOV A,#0AFH; MOV R7,#08H; INITHIGH: MOV @R0,A;
DJNZ R7,HIGHINC; SJMP ENDHIGH; HIGHINC: INC R0;
SJMP INITHIGH; ENDHIGH: MOV R0,#WL; MOV A,#04BH; MOV R7,#08H; INITLOW: MOV @R0,A;
DJNZ R7,LOWINC; SJMP ENDLOW; LOWINC: INC R0;
SJMP INITLOW; ENDLOW: RET;
;***********外部中断0的服务程序********** ;完成一个循环的数据读取
INT_0: CLR EX0 ; 若转换完毕关中断 MOV DPTR,#0FFFEH;
MOVX A,@DPTR ;读取转换完毕后的数 MOV @R0,A ;将转换完毕的数保存
DJNZ R6,READNEXT;若未读取完毕则调整后继续 LCALL DLY_1S; SJMP EX0_END; READNEXT: INC R0; INC INNAL; MOV A,INNAL;
MOVX @DPTR,A ;再次启动AD0809 SETB EX0 ;开外部中断0 EX0_END: RETI;
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
16
DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH DB 0FFH,089H,0C7H; END
结 束 语
为了完成这次设计让我专研了很久,通过这次的设计使我深刻知道了原来学好一个东西真的很不容易,要花很多时间的研究和去请教别人,也使我知道了 原来我们的知识是多么的缺乏。
但是这个次的设计总体自己觉得还是不错的 ,但是也有些瑕疵,我相信在我以后不断的学习,慢慢的让我去把自己的不足弥补上来 是自己的能力渐渐的上升!
不仅仅这次多设计的了解 也多如何去写好个文本文档有了一个体验 ,也给自己有了一个很深刻的训练!使我知道了只有每做一件事情都要认真仔细才能成功!
17
参考文献
[1]王新贤,通用集成电路速查手册, 山东: 科学技术出版社,2004
[2]李逍华,李玲,牛艳,单片机应用系统设计——入门向导与设计实例, 武汉: 武汉大学出版社,2003.3
[3]魏立峰,王宝兴,单片机原理与应用技术, 北京: 北京大学出版,2006.8 [4] 74HC74,74HC02,74HC164,74HC165使用手册,http://www.eeworld.com [5]89S52使用手册, http://www.eeworld.com
18
因篇幅问题不能全部显示,请点此查看更多更全内容