资源描述
2012年桂林理工大学第六届电子设计竞赛
多功能电子时钟设计
—按键调整时间,自带直流稳压电源,整点语音报时
组别:第一组
组长:黄~~ 学 号:3090731219
组员:杨~ ~ 学 号:3090718214
组员:易~ ~ 学 号:3090748232
二○一二年四月
2012年桂林理工大学电子设计竞赛
设计报告
多功能电子时钟设计报告(B题)
摘要:
本次设计以STC90C51单片机为基本数据处理平台和控制核心,综合利用DS1302、LCD1602及ISD1730语音芯片,实现了利用按键调整时间,自带直流稳压电源,同时具有语音整点报时的多功能电子时钟的设计。其中:DS1302包括时钟/日历寄存器31字节(8位)的数字暂存寄存器,数据通信仅通过一条串行输入输出接口,实时时钟/日历提供包括秒,分,时,日期,月份和年份信息,另外,其内部有充放电电容,电容充满电后即使掉电还可以保证时钟继续,如果使用外部电池,时钟在掉电的情况下能走的时间会更久;ISD1730语音芯片可以实现录音和放音,内部包括11位语音存储地址,使用SPI控制模式可以随意地进行划分录音和放音地址,实现准确地调用;使用STC90C51单片机对进行扫描,从DS1302读出时间信息,然后送到LCD1602进行显示。同时使用STC90C51单片机对ISD1730进行控制,当时钟芯片刚好走到整点时,准确的调用已经录好的报时语音地址进行放音,实现整点报时。
关键字:多功能,电子时钟,整点报时
一、设计题目:
1、以单片机为核心设计一个多功能电子钟设计
2、基本要求:
1、可实现时、分、秒的显示。
2、自带直流稳压电源
3、发挥部分:
1、整点语音报时功能;
2、可进行时、分、秒的手动设置。
二、方案论证及比较
方案一:
分析题目要求,可知要实现电子时钟的时、分、秒的显示并不困难,但是要在显示的同时方便的进行手动控制就不是件容易的事情。第一种方案我们考虑用6个数码管组合显示时、分、秒。
方案二:
第二种方案我们考虑用液晶显示时、分、秒。利用语音芯片实现整点报时。
数码管和液晶显示模块存在的主要区别有:
数码管显示内容单一,液晶则比较丰富;
数码管一般就是一个7段的8字,当然多的有16段的中间米字型的,液晶可以显示各种内容;(最基本的)
数码管是自发光的,液晶是靠背光(环境)的;
数码管是LED发光的效果,液晶是分子偏转引起的暗影效果;
数码管比液晶耗电;
给数码管的信号是电平信号,就是说其显示阶段的信号是固定不变的电平;
给lcd的信号是具有一定频率的交流信号,不用电平信号是用来延长lcd显示寿命。
三、理论分析及计算
1、电源的设计
设计方案:利用LM7805、LM317将220V 的交流电转换为适合单片机工作的直流稳压电流。
计算过程:
(1)用lm78/lm79系列三端稳压IC来组成稳压电源所需的外围元件极少,电路内部还有过流、过热及调整管的保护电路,使用起来可靠、方便,而且价格便宜。该系列集成稳压IC型号中的lm78或lm79后面的数字代表该三端集成稳压电路的输出电压,如lm7806表示输出电压为正6V,lm7909表示输出电压为负9V。因为三端固定集成稳压电路的使用方便,电子制作中经常采用。在实际应用中,应在三端集成稳压电路上安装足够大的散热器(小功率可不用)。当稳压管温度过高时,稳压性能将变差,甚至损坏。当制作中需要一个能输出1.5A以上电流的稳压电源,通常采用几块三端稳压电路并联起来,使其最大输出电流为N个1.5A,但应用时需注意:并联使用的集成稳压电路应采用同一厂家、同一批号的产品,以保证参数的一致。另外在输出电流上留有一定的余量,以避免个别集成稳压电路失效时导致其他电路的连锁烧毁。LM7805引脚如图1所示:1脚接输入,2脚接地,3脚接输出。图1 LM7805引脚图
图2 LM7805各项参数表
(2)LM317是可调节3端正电压稳压器,在输出电压范围1.2伏到37伏时能够提供超过1.5安的电流,此稳压器非常易于使用。稳压电源的输出电压可用下式计算,Vo=1.25(1+R2/R1)。仅仅从公式本身看,R1、R2的电阻值可以随意设定。然而作为稳压电源的输出电压计算公式,R1和R2的阻值是不能随意设定的。 首先317稳压块的输出电压变化范围是Vo=1.25V—37V(高输出电压的317稳压块如LM317HVA、LM317HVK等,其输出电压变化范围是Vo=1.25V—45V),所以R2/R1的比值范围只能是0—28.6。其次是317稳压块都有一个最小稳定工作电流,值一般为1.5mA。在应用中,为了电路的稳定工作,在一般情况下,还需要接二极管作为保护电路,防止电路中的电容放电时的高压把317烧坏。可以通过设定R1和R2阻值的大小,解决317稳压块最小稳定工作电流的问题。经计算可知R1的最大取值为R1≈0.83KΩ。又因为R2/R1的最大值为28.6。所以R2的最大取值为R2≈23.74KΩ。在使用317稳压块的输出电压计算公式计算其输出电压时,必须保证R1≤0.83KΩ,R2≤23.74KΩ两个不等式同时成立,才能保证317稳压块在空载时能够稳定地工作。
图3LM317引脚图图4 LM317绝对最大额定值
(3)利用桥式整流电路。桥式整流器是利用二极管的单向导通性进行整流的最常用的电路,常用来将交流电转变为直流电。桥式整流器品种多,性能优良,整流效率高,稳定性好,最大整流电流从0.5A到50A,最高反向峰值电压从50V到1000V。基本电路如图5所示。
桥式整流电路的工作原理如下:e2为正半周时,对D1、D3加正向电压,Dl、D3导通;对D2、D4加反向电压,D2、D4截止。电路中构成e2、D1、Rfz 、D3通电回路,在Rfz 上形成上正下负的半波整流电压,e2为负半周时,对图5桥式整流电路
D2、D4加正向电压,D2、D4导通;对D1、D3加反向电压,D1、D3截止。电路中构成e2、D2Rfz 、D4通电回路,同样在Rfz 上形成上正下负的另外半波的整流电压。如此重复下去,结果在Rfz 上便得到全波整流电压。其波形图和全波整流波形图是一样的。
从图中不难看出,桥式电路中每只二极管承受的反向电压等于变压器次级电压的最大值,比全波整流电路小一半。二极管作为整流元件,要根据不同的整流方式和负载大小加以选择。如选择不当,则或者不能安全工作,甚至烧了管子;或者大材小用,造成浪费。
2、语音模块的设计
设计方案:利用图6所示芯片,采样频率为4KHZ,录音时长60秒。要对不同长度的语音信号进行不同的地址长度设置。
特点:
· 可录、放音十万次,存储内容可以断电保留一百年
· 两种控制方式
· 两种录音输入方式
· 两种放音输出方式
· 可处理多达 255 段信息
· 有丰富多样的工作状态提示
· 多种采样频率对应多种录放时间
· 音质好,电压范围宽,应用灵活
电特性:
· 工作电压:2.4V-5.5V
· 静态电流:0.5 - 1 μA
· 工作电流:20mA图6 ISD1730芯片
用户可利用震荡电阻来自定芯片的采样频率,从而决定芯片的录放时间和录放音质。下表为 ISD1730 的参数表:
时间(秒) 20 30 37 45 60
采样频率( KHZ ) 12 8 6.4 5.3 4
ROSC 阻值( KΩ ) 60 80 100 120 160
独立按键工作模式:
ISD1730 的独立按键工作模式录放电路非常简单(后附图),而且功能强大。不仅有录、放功能,还有快进、擦除、音量控制、直通放音和复位等功能。这些功能仅仅通过按键就可完成。
在按键模式工作时,芯片可以通过 LED 管脚给出信号来提示芯片的工作状态,并且伴随有提示音,用户也可自定 4 种提示音效。
录音操作:
按下 REC 键, REC 管脚电平变低后开始录音,直到松开按键使电平拉高或者芯片录满时结束。录音结束后,录音指针自动移向下一个有效地址。而放音指针则指向刚刚录完的那段语音地址。
放音操作:包括边沿触发模式,电平音模式,快进操作,擦除工作,复位工作,音量操、G、FT 直通操作。
3、显示模块的设计
设计方案:利用LCD1602进行时分秒的显示。1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图所示:
图7 LCD1602尺寸图
1602LCD主要技术参数:
显示容量:16×2个字符芯片工作电压:4.5—5.5V
工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V
字符尺寸:2.95×4.35(W×H)mm
引脚功能说明:
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如图8所示:
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
数据
3
VL
液晶显示偏压
11
D4
数据
4
RS
数据/命令选择
12
D5
数据
5
R/W
读/写选择
13
D6
数据
6
E
使能信号
14
D7
数据
7
D0
数据
15
BLA
背光源正极
8
D1
数据
16
BLK
背光源负极
图8 1602LCD引脚功能
4.时钟产生模块的设计
设计方案:利用DS1302产生时钟
DS1302包括时钟/日历寄存器31字节(8位)的数字暂存寄存器,数据通信仅通过一条串行输入输出接口,实时时钟/日历提供包括秒,分,时,日期,月份和年份信息,闰年可自动调整,可以设置AM、PM。其引脚如图9所示:
图9DS1302引脚分布
功能特点:
1、可以对秒、分钟、小时、月、星期、年的计数。年计数可达到2100年。
2、有31*8位的额外数据暂存寄存器
3、最少I/O引脚传输,通过三引脚控制
4、工作电压:2.0-5.5V
5、工作电流小于320 纳安(2.0V)
6、读写时钟寄存器或内部RAM(31*8位的额外数据暂存寄存)可以采用单字节模式和突发模式
7、8-pin DIP封装或8-pin SOICs
8、兼容TTL (5.0V)
9、兼容DS1202较DS1202增加的功能:
1. 可通过Vcc1进行涓流充电2. 双重电源补给
3. 备用电源可采用电池或者超级电容(0.1F以上),可以用老式电脑主板上的3.6V充电电池。
其工作原理为:在进行任何数据传输时,必须被制高电平(注意虽然将它置为高电平,内部时钟还是在晶振作用下走时的,此时,允许外部读写数据),在每个SCLK上升沿时数据被输入,下降沿时数据被输出,一次只能读写一位,适度还是写需要通过串行输入控制指令来实现(也是一个字节),通过8个脉冲便可读取一个字节从而实现串行输入与输出。
图10 DS1302工作原理图
如果控制指令选择的是单字节模式,连续的8个时钟脉冲可以进行8位数据的写和8位数据的读操作,SCLK时钟的上升沿时,数据被写入DS1302,SCLK脉冲的下降沿读出DS1302的数据。8个脉冲便可读写一个字节。在突发模式,通过连续的脉冲一次性读写完7个字节的时钟/日历寄存器(注意时钟/日历寄存器要读写完),其原理图如上所示。
控制指令:每个字节的传输是有控制字节指定的,控制字节的最高位Bit7
图11DS1302控制指令
必须是‘1’,如果是‘0’,写入将被禁止,因此我们如果将这位置一,可以禁止写入。bit6为‘0’则指定对时钟/日历寄存器控制读写操作,为‘1’则为RAM区数据的控制读写操作,bir1~bit5指定相关寄存器待进行输入输出操作,最低位bit0指定是输入还是输出,为‘0’则为输入,相反则输入有效,输入输出根据脉冲的上升沿和下降沿串行进行。
四、电路设计及程序设计
1、系统组成原理框图
图12 系统组成原理框图
2、各部分电路图
图13 控制电路模块原理图
图14 接口电路图图155V直流转换为3.3V直流电路图
图16 12V交流转换为5V直流的原理图
图17 录音放音原理图
3、各部分PCB图:
图18 控制电路模块PCB图
图19 电源模块PCB图
图20 语音模块PCB图
4、软件设计与流程图
开始
LCD1602初始化
SD1302初始化
否
ISD1730初始化
是
报时
是否整点
各项初始化完成,时钟扫描
否
执行键是否按下安县
按键扫描
否
运行时钟
是否选择键按下
是
否
否
标准位被选择
是
是
加按键是否按下
减按键是否按下
数值减并显示,写回SD1302
数值加并显示,写回SD1302
部分程序:
#include<reg52.h>
#include"ISD1730.h"
uchar a=0,miao=0,shi=0,fen=0,ri=0,yue=0,nian=0,week=0,key1n=0,temp=0;
uchar flag=0;
#define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)
#define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)
//液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)
sbit rs=P2^5;
sbit rw=P2^6; //如果硬件上rw接地,就不用写这句和后面的rw=0了
sbit en=P2^7;
sbit SCLK =P1^6; /*实时时钟时钟线引脚 */
sbit IO = P3^5; /*实时时钟数据线引脚 */
sbit RST = P1^7; /*实时时钟复位线引脚 */
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
//校时按键与C51的引脚连接定义
sbit key1=P3^0; //设置键
sbit key2=P3^1; //加键
sbit key3=P3^2; //减键
sbit key4=P3^3;
/**************************************************************/
uchar code tab1[]={"20 - - "}; //年显示的固定字符
uchar code tab2[]={" : : "};//时间显示的固定字符
void write_1602com(uchar com)//****液晶写入指令函数****
{
rs=0;//数据/指令选择置为指令
rw=0; //读写选择置为写
P0=com;//送入数据
delay(1);
en=1;//拉高使能端,为制造有效的下降沿做准备
delay(1);
en=0;//en由高变低,产生下降沿,液晶执行命令
}
void write_1602dat(uchar dat)//***液晶写入数据函数****
{
rs=1;//数据/指令选择置为数据
rw=0; //读写选择置为写
P0=dat;//送入数据
delay(1);
en=1; //en置高电平,为制造下降沿做准备
delay(1);
en=0; //en由高变低,产生下降沿,液晶执行命令
}
void lcd_init()//***液晶初始化函数****
{
write_1602com(0x38);
write_1602com(0x0c);
write_1602com(0x06);
write_1602com(0x01);
write_1602com(0x80);
write_1602com(yh+2);
for(a=0;a<14;a++)
{
write_1602dat(tab1[a]);
}
delay(5);
write_1602com(er+2);
for(a=0;a<8;a++)
{
write_1602dat(tab2[a]);
}
}
void write_byte(uchar dat)
{
ACC=dat;
RST=1;
for(a=8;a>0;a--)
{
IO=ACC0;
SCLK=0;
SCLK=1;
ACC=ACC>>1;
}
}
uchar read_byte()
{
RST=1;
for(a=8;a>0;a--)
{
ACC7=IO;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
return (ACC);
}
void write_1302(uchar add,uchar dat)
{
RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
uchar read_1302(uchar add)
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
uchar BCD_Decimal(uchar bcd)
{
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F));
}
void ds1302_init()
{
RST=0;
SCLK=0;
write_1302(0x8e,0x00);
write_1302(0x8e,0x80);
}
void write_sfm(uchar add,uchar dat)
{
uchar gw,sw;
gw=dat%10;
sw=dat/10;
write_1602com(er+add);
write_1602dat(0x30+sw);
write_1602dat(0x30+gw);
}
void write_nyr(uchar add,uchar dat)
{
uchar gw,sw;
gw=dat%10;
sw=dat/10;
write_1602com(yh+add);
write_1602dat(0x30+sw);
write_1602dat(0x30+gw);
}
//-------------------------------------------
void write_week(uchar week)//写星期函数
{
write_1602com(yh+0x0c);//星期字符的显示位置
switch(week)
{
case 1:write_1602dat('M');//星期数为1时,显示
write_1602dat('O');
write_1602dat('N');
break;
case 2:write_1602dat('T');//星期数据为2时显示
write_1602dat('U');
write_1602dat('E');
break;
case 3:write_1602dat('W');//星期数据为3时显示
write_1602dat('E');
write_1602dat('D');
break;
case 4:write_1602dat('T');//星期数据为4是显示
write_1602dat('H');
write_1602dat('U');
break;
case 5:write_1602dat('F');//星期数据为5时显示
write_1602dat('R');
write_1602dat('I');
break;
case 6:write_1602dat('S');//星期数据为6时显示
write_1602dat('T');
write_1602dat('A');
break;
case 7:write_1602dat('S');//星期数据为7时显示
write_1602dat('U');
write_1602dat('N');
break;
}
}
void keyscan()
{
if(key1==0)
{
delay(10);
if(key1==0)
{
write_1302(0x80,0x80);
delay(5);
write_1602com(0x0f);
flag=1;
while(key1==0);
key1n++;
if(key1n==8)
key1n=1;
switch(key1n)
{
case 1: write_1602com(er+9);
break;
case 2: write_1602com(er+6);
break;
case 3: write_1602com(er+3);
break;
case 4: write_1602com(yh+0x0e);
break;
case 5: write_1602com(yh+0x0a);
break;
case 6: write_1602com(yh+0x07);
break;
case 7: write_1602com(yh+0x04);
break;
}
}
}
if(key4==0)
{
delay(10);
if(key4==0)
{ flag=0;
key1n=0;
write_1602com(0x0c);
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);
write_1302(0x8e,0x80);
}
while(key4==0);
}
if(key1n!=0)
{
if(key2==0)
{
delay(10);
if(key2==0)
{
while(key2==0);
switch(key1n)
{
case 1:miao++;
if(miao==60)
miao=0;
write_sfm(0x08,miao);
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(er+0x09);
break;
case 2:fen++;
if(fen==60)
fen=0;
write_sfm(0x05,fen);
temp=(fen)/10*16+(fen)%10;
write_1302(0x8e,0x00);
write_1302(0x82,temp);
write_1302(0x8e,0x80);
write_1602com(er+6);
break;
case 3:shi++;
if(shi==24)
shi=0;
write_sfm(2,shi);
temp=(shi)/10*16+(shi)%10;
write_1302(0x8e,0x00);
write_1302(0x84,temp);
write_1302(0x8e,0x80);
write_1602com(er+3);
break;
case 4:week++;
if(week==8)
week=1;
write_1602com(yh+0x0C);
write_week(week);
temp=(week)/10*16+(week)%10;
write_1302(0x8e,0x00);
write_1302(0x8a,temp);
write_1302(0x8e,0x80);
write_1602com(yh+0x0e);
break;
case 5:ri++;
if(ri==32)
ri=1;
write_nyr(9,ri);
temp=(ri)/10*16+(ri)%10;
write_1302(0x8e,0x00);
write_1302(0x86,temp);
write_1302(0x8e,0x80);
write_1602com(yh+10);
break;
case 6:yue++;
if(yue==13)
yue=1;
write_nyr(6,yue);
temp=(yue)/10*16+(yue)%10;
write_1302(0x8e,0x00);
write_1302(0x88,temp);
write_1302(0x8e,0x80);
write_1602com(yh+7);
break;
case 7:nian++;
if(nian==100)
nian=0;
write_nyr(3,nian);
temp=(nian)/10*16+(nian)%10;
write_1302(0x8e,0x00);
write_1302(0x8c,temp);
write_1302(0x8e,0x80);
write_1602com(yh+4);
break;
}
}
if(key3==0)
{
delay(10);
if(key3==0)
{
while(!key3);
switch(key1n)
{
case 1:miao--;
if(miao==-1)
miao=59;
write_sfm(0x08,miao);
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,temp);
write_1302(0x8e,0x80);
write_1602com(er+0x09);
break;
case 2:fen--;
if(fen==-1)
fen=59;
write_sfm(5,fen);
temp=(fen)/10*16+(fen)%10;
write_1302(0x8e,0x00);
write_1302(0x82,temp);
write_1302(0x8e,0x80);
write_1602com(er+6);
break;
case 3:shi--;
if(shi==-1)
shi=23;
write_sfm(2,shi);
temp=(shi)/10*16+(shi)%10;
write_1302(0x8e,0x00);
write_1302(0x84,temp);
write_1302(0x8e,0x80);
write_1602com(er+3);
break;
case 4:week--;
if(week==0)
week=7;
write_1602com(yh+0x0C);
write_week(week);
temp=(week)/10*16+(week)%10;
write_1302(0x8e,0x00);
write_1302(0x8a,temp);
write_1302(0x8e,0x80);
write_1602com(yh+0x0e);
break;
case 5:ri--;
if(ri==0)
ri=31;
write_nyr(9,ri);
temp=(ri)/10*16+(ri)%10;
write_1302(0x8e,0x00);
write_1302(0x86,temp);
write_1302(0x8e,0x80);
write_1602com(yh+10);
break;
case 6:yue--;
if(yue==0)
yue=12;
write_nyr(6,yue);
temp=(yue)/10*16+(yue)%10;
write_1302(0x8e,0x00);
write_1302(0x88,temp);
write_1302(0x8e,0x80);
write_1602com(yh+7);
break;
case 7:nian--;
if(nian==-1)
nian=99;
write_nyr(3,nian);
temp=(nian)/10*16+(nian)%10;
write_1302(0x8e,0x00);
write_1302(0x8c,temp);
write_1302(0x8e,0x80);
write_1602com(yh+4);
break;
}
}
}
}
}
void zhixing()
{
write_1302(0x8f,0x00);
miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83));
shi = BCD_Decimal(read_1302(0x85));
ri = BCD_Decimal(read_1302(0x87));
yue = BCD_Decimal(read_1302(0x89));
nian=BCD_Decimal(read_1302(0x8d));
week=BCD_Decimal(read_1302(0x8b));
write_sfm(8,miao);
write_sfm(5,fen);
write_sfm(2,shi);
write_nyr(9,ri);
write_nyr(6,yue);
write_nyr(3,nian);
write_week(week);
if((fen==0)&&(miao==0)&&(shi!=0))
{
fangyin=shi*2;
duanfangyin(fangyin);
delay(30);
}
if((shi==0)&&(fen==0)&&(miao==1))
{
fangyin=shi*2;
duanfangyin(fangyin);
delay(30);
}
}
void main()
{
lcd_init();
ds1302_init();
//ISD_Init();
while(1)
{
//LEDxianshi();
keyscan();
if(flag==0)
zhixing();
}
}
五:小结
本次校级电子竞赛采用的是全开放的模式,竞赛时间也比较充足。在这次竞赛中,我们这个队在选题上就做好了大量的工作,经过对比题目,并根据队员对题目的熟悉程度,最终确定了这个题目。做的过程中,首先在PROTUS上进行仿真,然后才能确定方案是否可行,也才能列出所要购买材料的清单,买好材料之后就是做电路了,由于ISD1730语音芯片不能在PROTUES在进行仿真,所以只能根据经典电路图做出电路板,这样做板容易造成不必要的错误。在做ISD 1730语音芯片电路时候,要注意区分数据地和模拟地,如果不区分数据地和模拟地,语音芯片录放音可能会混进很大的噪声,甚至会造成语音芯片不能使用。在做好电路板之后就是写程序和调试了,程序和调试和占用大部分的时间。经过队员们的努力工作,我们顺利地做出了符合要求的电子时钟。在做电子竞赛的过程中,我们查阅了大量了这方面的资料,并学习到了很多东西。在此感谢给我们提供竞赛舞台的各位领导和老师!
参考文献:
(1) 余孟尝. 高等教育出版社 《数字电子技术基础简明教程》
(2) 杨素行. 高等教育出版社 《模拟
展开阅读全文