数字电子石英钟设计

数字电子石英钟设计,第1张

数字电子钟的设计(由数字IC构成)一、设计目的
1 熟悉集成电路的引脚安排。
2 掌握各芯片的逻辑功能及使用方法。
3 了解面包板结构及其接线方法。
4 了解数字钟的组成及工作原理。
5 熟悉数字钟的设计与制作。二、设计要求
1.设计指标时间以24小时为一个周期;显示时、分、秒;有校时功能,可以分别对时及分进行单独校时,使其校正到标准时间;计时过程具有报时功能,当时间到达整点前5秒进行蜂鸣报时;为了保证计时的稳定及准确须由晶体振荡器提供表针时间基准信号。2.设计要求画出电路原理图(或仿真电路图);元器件及参数选择;电路仿真与调试;PCB文件生成与打印输出。
3.制作要求 自行装配和调试,并能发现问题和解决问题。
4.编写设计报告 写出设计与制作的全过程,附上有关资料和图纸,有心得体会。
三、设计原理及其框图
1.数字钟的构成
数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路。由于计数的起始时间不可能与标准时间(如北京时间)一致,故需要在电路上加一个校时电路,同时标准的1HZ时间信号必须做到准确稳定。通常使用石英晶体振荡器电路构成数字钟。图 3-1所示为数字钟的一般构成框图。
图3-1 数字钟的组成框图
⑴晶体振荡器电路
晶体振荡器电路给数字钟提供一个频率稳定准确的32768Hz的方波信号,可保证数字钟的走时准确及稳定。不管是指针式的电子钟还是数字显示的电子钟都使用了晶体振荡器电路。
⑵分频器电路
分频器电路将32768Hz的高频方波信号经32768( )次分频后得到1Hz的方波信号供秒计数器进行计数。分频器实际上也就是计数器。
⑶时间计数器电路
时间计数电路由秒个位和秒十位计数器、分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器、分个位和分十位计数器为60进制计数器,而根据设计要求,时个位和时十位计数器为12进制计数器。
⑷译码驱动电路
译码驱动电路将计数器输出的8421BCD码转换为数码管需要的逻辑状态,并且为保证数码管正常工作提供足够的工作电流。
⑸数码管
数码管通常有发光二极管(LED)数码管和液晶(LCD)数码管,本设计提供的为LED数码管。
2.数字钟的工作原理
1)晶体振荡器电路
晶体振荡器是构成数字式时钟的核心,它保证了时钟的走时准确及稳定。
图3-2所示电路通过CMOS非门构成的输出为方波的数字式晶体振荡电路,这个电路中,CMOS非门U1与晶体、电容和电阻构成晶体振荡器电路,U2实现整形功能,将振荡器输出的近似于正弦波的波形转换为较理想的方波。输出反馈电 阻R1为非门提供偏置,使电路工作于放大区域,即非门的功能近似于一个高增益的反相放大器。电容C1、C2与晶体构成一个谐振型网络,完成对振荡频率的控制功能,同时提供了一个180度相移,从而和非门构成一个正反馈网络,实现了振荡器的功能。由于晶体具有较高的频率稳定性及准确性,从而保证了输出频率的稳定和准确。
晶体XTAL的频率选为32768HZ。该元件专为数字钟电路而设计,其频率较低,有利于减少分频器级数。
从有关手册中,可查得C1、C2均为30pF。当要求频率准确度和稳定度更高时,还可接入校正电容并采取温度补偿措施。
由于CMOS电路的输入阻抗极高,因此反馈电阻R1可选为10MΩ。较高的反馈电阻有利于提高振荡频率的稳定性。
非门电路可选74HC00。
图3-2 COMS晶体振荡器
2)分频器电路
通常,数字钟的晶体振荡器输出频率较高,为了得到1Hz的秒信号输入,需要对振荡器的输出信号进行分频。
通常实现分频器的电路是计数器电路,一般采用多级2进制计数器来实现。例如,将32768Hz的振荡信号分频为1HZ的分频倍数为32768(215),即实现该分频功能的计数器相当于15极2进制计数器。常用的2进制计数器有74HC393等。
本实验中采用CD4060来构成分频电路。CD4060在数字集成电路中可实现的分频次数最高,而且CD4060还包含振荡电路所需的非门,使用更为方便。
CD4060计数为14级2进制计数器,可以将32768HZ的信号分频为2HZ,其内部框图如图3-3所示,从图中可以看出,CD4060的时钟输入端两个串接的非门,因此可以直接实现振荡和分频的功能。
图3-3 CD4046内部框图
3)时间计数单元
时间计数单元有时计数、分计数和秒计数等几个部分。
时计数单元一般为12进制计数器计数器,其输出为两位8421BCD码形式;分计数和秒计数单元为60进制计数器,其输出也为8421BCD码。
一般采用10进制计数器74HC390来实现时间计数单元的计数功能。为减少器件使用数量,可选74HC390,其内部逻辑框图如图 23所示。该器件为双2—5-10异步计数器,并且每一计数器均提供一个异步清零端(高电平有效)。
图3-4 74HC390(1/2)内部逻辑框图
秒个位计数单元为10进制计数器,无需进制转换,只需将QA与CPB(下降沿有效)相连即可。CPA(下降没效)与1HZ秒输入信号相连,Q3可作为向上的进位信号与十位计数单元的CPA相连。
秒十位计数单元为6进制计数器,需要进制转换。将10进制计数器转换为6进制计数器的电路连接方法如图3-5所示,其中Q2可作为向上的进位信号与分个位的计数单元的CPA相连。
图3-5 10进制——6进制计数器转换电路
分个位和分十位计数单元电路结构分别与秒个位和秒十位计数单元完全相同,只不过分个位计数单元的Q3作为向上的进位信号应与分十位计数单元的CPA相连,分十位计数单元的Q2作为向上的进位信号应与时个位计数单元的CPA相连。
时个位计数单元电路结构仍与秒或个位计数单元相同,但是要求,整个时计数单元应为12进制计数器,不是10的整数倍,因此需将个位和十位计数单元合并为一个整体才能进行12进制转换。利用1片74HC390实现12进制计数功能的电路如图3-6所示。
另外,图3-6所示电路中,尚余-2进制计数单元,正好可作为分频器2HZ输出信号转化为1HZ信号之用。
图3-6 12进制计数器电路
4)译码驱动及显示单元
计数器实现了对时间的累计以8421BCD码形式输出,选用显示译码电路将计数器的输出数码转换为数码显示器件所需要的输出逻辑和一定的电流,选用CD4511作为显示译码电路,选用LED数码管作为显示单元电路。
5)校时电源电路
当重新接通电源或走时出现误差时都需要对时间进行校正。通常,校正时间的方法是:首先截断正常的计数通路,然后再进行人工出触发计数或将频率较高的方波信号加到需要校正的计数单元的输入端,校正好后,再转入正常计时状态即可。
根据要求,数字钟应具有分校正和时校正功能,因此,应截断分个位和时个位的直接计数通路,并采用正常计时信号与校正信号可以随时切换的电路接入其中。图3-7所示即为带有基本RS触发器的校时电路,
图3-7 带有消抖动电路的校正电路
6)整点报时电路
一般时钟都应具备整点报时电路功能,即在时间出现整点前数秒内,数字钟会自动报时,以示提醒。其作用方式是发出连续的或有节奏的音频声波,较复杂的也可以是实时语音提示。
根据要求,电路应在整点前10秒钟内开始整点报时,即当时间在59分50秒到59分59秒期间时,报时电路报时控制信号。报时电路选74HC30,选蜂鸣器为电声器件。
四、元器件
1.实验中所需的器材:5V电源。面包板1块。示波器。万用表。镊子1把。剪刀1把。网络线2米/人。
共阴八段数码管6个。CD4511集成块6块。CD4060集成块1块。74HC390集成块3块。
74HC51集成块1块。74HC00集成块5块。74HC30集成块1块。10MΩ电阻5个。
500Ω电阻14个。30p电容2个。32768k时钟晶体1个。蜂鸣器。
2.芯片内部结构图及引脚图
图4-1 7400 四2输入与非门 图4-2 CD4511BCD七段译码/驱动器
图4-3 CD4060BD 图4-4 74HC390D
图4-5 74HC51D 图4-6 74HC30
3.面包板内部结构图
面包板右边一列上五组竖的相通,下五组竖的相通,面包板的左边上下分四组,每组中X、Y列(0-15相通,16-40相通,41-55相通,ABCDE相通,FGHIJ相通,E和F之间不相通。
五、个功能块电路图
1. 一个CD4511和一个LED数码管连接成一个CD4511驱动电路,数码管可从0---9显示,以次来检查数码管的好坏,见附图5-1。图5-1 4511驱动电路2. 利用一个LED数码管,一块CD4511,一块74HC390,一块74HC00连接成一个十进制计数器,电路在晶振的作用下数码管从0—9显示,见附图5-2。
图5-2 74390十进制计数器3. 利用一个LED数码管,一块CD4511,一块74HC390,一块74HC00和一个晶振连接成一个六进制计数器,数码管从0—6显示,见附图5-3。图5-3 74390六进制计数器4. 利用一个六进制电路和一个十进制连接成一个六十进制电路,电路可从0—59显示,见附图5-4。
图5-4 六十进制电路5. 利用两个六十进制的电路合成一个双六十进制电路,两个六十进制之间有进位,见附图5-5。
图5-5 双六十进制电路6. 利用CD4060、电阻及晶振连接成一个分频——晶振电路,见附图5-6。
图5-6 分频—晶振电路7. 利用74HC51D和74HC00及电阻连接成一个校时电路,见附图5-7。
图5-7 校时电路
8. 利用74HC30和蜂鸣器连接成整点报时电路。见附图5-8。
图5-8 整点报时电路
9. 利用两个六十进制和一个十二进制连接成一个时、分、秒都会进位的电路总图,见附图5-9。
用ttl集成电路构成的“二十四小时数字钟”,具有校时和整点报时功能,555定时器接成多谐振荡器产生秒脉冲信号,调节rw即可校准秒信告,计数器7416 i、ii组成60进制“秒”计数电路,iii、iv组成“分”计数电路,v、vi组成24进制“时”计数电路,校时电路由与非门7400构成的双稳态触发路构成,可消除开关抖动的影响,整点报时 电路 由与非门7430和d触发器7474构成 ,1秒钟响一声、直至整点为止。
有关用晶振电路产生秒脉冲电路的“12小时数字钟,请看下回贴 数字电子钟参考电路(24小时数字钟)
[upload=jpg,32583,450,915,822]/58474-1-2-9489
上面的电路图是用ttl集成电路构成的“二十四小时数字钟”,具有校时和整点报时功能,555定时器接成多谐振荡器产生秒脉冲信号,调节rw即可校准秒信告,计数器7416 i、ii组成60进制“秒”计数电路,iii、iv组成“分”计数电路,v、vi组成24进制“时”计数电路,校时电路由与非门7400构成的双稳态触发路构成,可消除开关抖动的影响,整点报时 电路 由与非门7430和d触发器7474构成 ,1秒钟响一声、直至整点为止。
有关用晶振电路产生秒脉冲电路的“12小时数字钟,请看下回贴图。

DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的,也就是你要做的是配置寄存器。
根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的 *** 作。复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功

/============================================================
1602液晶显示DS1302时钟
=============================================================/
#include <AT89x51h>
#include <stringh>
#include < intrinsh >
#define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;
#define LCM_RW P2_1 //定义引脚
#define LCM_RS P2_0
#define LCM_E P2_2
#define LCM_Data P0
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
#define uchar unsigned char
sbit T_CLK=P1^0;
sbit T_IO =P1^1;
sbit T_RST=P1^2;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit LED=P1^4; //背光灯输出 (因本实验板无此功能 所以此项功能用P14LED灯作为指示)
sbit system=P3^2; //模式 对应实验板K1按键
sbit TimerUp=P3^3; //时间减 对应实验板K2按键
sbit TimerDown=P3^4; //时间加 对应实验板K3按键
sbit BEEP=P3^6; //蜂鸣器
void Set(uchar,uchar); //根据选择调整相应项目
void RTInputByte(uchar); //输入 1Byte /
uchar RTOutputByte(void); //输出 1Byte /
void W1302(uchar, uchar); //向DS1302写入一个字节
uchar R1302(uchar); //从DS1302读出一个字节
void Set1302(uchar ); //设置时间
void KeySound(); //按键音
void ClockSound(); //闹铃蜂鸣声
uchar id,msec,model,LedTime,d;
bit a,b; //闪烁标志位
uchar inittime[7]={0x50,0x59,0x23,0x24,0x07,0x05,0x09}; //初始化后设置为:09年7月24日星期5 23点59分50秒
void Out_LCM(void); //显示屏幕
void model0(void); //显示输出
void model1(void);
void model2(void);
void model3(void);
void model4(void);
void model5(void);
void model6(void);
void id_case1_key(); //项目调整
void Modset(); //模式键处理
void WriteDataLCM(uchar WDLCM);
void WriteCommandLCM(uchar WCLCM,BuysC);
uchar ReadStatusLCM(void);
void LCMInit(void);
void OutputInformation(uchar X, uchar Y, uchar DData);
void DisplayListChar(uchar X, uchar Y, uchar code DData);
void Delay5Ms(void);
void Delay400Ms(void);
void systemsetup(void); //进入系统设置
uchar code systemp[]={"Systemsetup"}; //字符串输出(系统设定)
uchar code TIMER[]={"Time"}; //字符串输出(时间)
uchar code DATE[]={"Date"}; //字符串输出(日期)
uchar code alarmclock[]={"Clock"}; //字符串输出(闹铃)
uchar code lamp[]={"Lamp"}; //字符串输出(背光灯)
uchar code reset[]={"Reset"}; //字符串输出(时间归零)
uchar code exit[]={"Exit"}; //字符串输出(退出)
uchar code set[]={"Set"}; //字符串输出(设置)
uchar code sec[]={"sec"}; //字符串输出(秒)
uchar code ClockSet[]={"ClockSet"}; //字符串输出(闹铃设置)
uchar code ClockOn[]={"ON"}; //字符串输出(ON)
uchar code ClockOff[]={"OFF"}; //字符串输出(OFF)
void timesetup(void); //时间设置
void datesetup(void); //日期设置
void alarmclockset(void); //闹铃设置
void lampsetup(void); //背光灯设置
void timereset(void); //时间清零
//
void delay1(int ms)
{
unsigned char y ;
while(ms--)
{
for(y = 0 ; y<250 ; y++)
{
_nop_() ;
_nop_() ;
_nop_() ;
_nop_() ;
}
}
}
/ 延时子程序/
void delay11(uchar x)
{ uchar j;
while((x--)!=0)
{ for(j=0;j<125;j++)
{;}
}
}
//--------------------------------------------------
//--------------------------------------------------
void delay0(uchar x) //x014MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
//
void beep() //蜂鸣器响一声函数
{
unsigned char i;
for (i=0;i<100;i++)
{
delay0(4);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
delay11(250); //延时
}
void main(void)
{
LED=0; //打开LED ,低电平有效,外接9012驱动
Delay400Ms(); //启动等待,等LCM讲入工作状态
Delay400Ms();
LCMInit(); //LCM初始化
TMOD=0x01; //16位定时
TH0=0x3c; //50ms
TL0=0xb0;
EA=1;
TR0=1;
ET0=1;

while(1)
{
if(TimerDown==0) //左移键按下后把背光灯打开
{Delay5Ms();
if(TimerDown==0)
{KeySound(); //蜂鸣声
LED=0; //打开背光灯
LedTime=R1302(0xc1)/1610+R1302(0xc1)%16;} //取出背光灯时间并转换为十进制数
}
b=1; //模式键是否动作标志。为1时不动作,为0时动作。
Modset(); //调用模式键处理程序判断按键是否按下。
if(b==0)
{
KeySound(); //蜂鸣声
LED=0; //打开背光灯
systemsetup(); //进入系统设置模式
LedTime=R1302(0xc1)/1610+R1302(0xc1)%16; //取出背光灯时间并转换为十进制数
}
if((LED==0)&&LedTime==0) //延时间是否到
LED=1; //关闭背光灯
if(R1302(0xc3)==1) //闹铃是否打开,0xc3为读闹铃寄存器地址。
{if((R1302(0x85)==R1302(0xc5))&&(R1302(0x83)==R1302(0xc7))) //判断闹铃时间是否到,
ClockSound(); //发出闹铃蜂鸣声,无按键动作蜂鸣一分钟。
}
model0(); //输出显示屏幕
}
}
void KeySound() //按键音
{
beep(); //开蜂鸣声
}
void ClockSound() //闹铃蜂鸣声
{
if(a==0)
{
beep();
}
}
void Modset() //模式键处理
{ if(system==0)
{
Delay5Ms();
if(system==0)
{while(system==0);
KeySound(); //蜂鸣声
a=0;msec=0;b=0; //a、msec为闪烁标志,按键有动作时清零,不闪烁。
} //b为模式键确认动作。其它程判断b是否为零时来确定模式键是否动作。
}
}
void systemsetup(void) //系统设置
{
model=1;
while(model!=0)
{
Out_LCM();
if (TimerUp==0) //设置项目左移
{Delay5Ms();
if(TimerUp==0)
{a=0;msec=0;KeySound();//蜂鸣声
if(model--==1) //6种系统设置项目
model=6;
}
while(TimerUp==0);
}
if (TimerDown==0) //设置项目右移
{
Delay5Ms();
if(TimerDown==0)
{a=0;msec=0;KeySound();//蜂鸣声
if(model++==6)
model=1;
}
while(TimerDown==0);
}
b=1; //模式键是否动作标志。为1时不动作,为0时动作。
Modset(); //调用模式键处理程序判断按键是否按下。
if(b==0)
{KeySound(); //蜂鸣声
switch(model) //进入进个项目设置
{
case 1:
timesetup(); break; //时间设置
case 2:
datesetup();break; //日期设置
case 3:
alarmclockset();break;//闹铃设置
case 4:
lampsetup();break; //背光灯设置
case 5:
timereset();break; //时间清零
case 6:
model=0;break; //退出系统设置
}
}
}
}
void timesetup() //时间调整
{
id=6;
while(model==1) //model为1时进入时间调整
{
b=1;
Modset();
if(b==0)
{KeySound(); //蜂鸣声
if(id++==9) //69为时分秒调。
id=6;
}
id_case1_key(); //调用按键处理
Out_LCM(); //显示输出
}
}
void datesetup() //对日期进行调整
{
id=1;
while(model==2) //model为2时进入日期调整
{b=1;
Modset(); //模式键是否动作
if(b==0)
{KeySound(); //蜂鸣声
if(id++==5) //15为年月日星期 exit
id=1;
}
id_case1_key(); //日期调整
Out_LCM(); //显示输出
}
}
void alarmclockset(void) //闹铃调整
{id=12;
while(model==3) //进入闹铃设置
{b=1;
Modset(); //模式键是否动作
if(b==0)
{KeySound(); //蜂鸣声
if(R1302(0xc3)%16==0)
{id=0;model++;} //0xc2为闹铃开关寄存器。当为关时按下模式键时将退出闹铃设置,当开时进入闹铃时间设置

else if(id++==15) //1215为闹铃开关和时间设置 exit
id=12;
}
id_case1_key(); //调整
Out_LCM(); //显示输出
}
}

void lampsetup(void) //背光灯时间设置
{id=10; //背光灯存储空间DS1302(0xc0)
while(model==4) //model为3时进入背光灯调整
{b=1;
Modset(); //模式键是否动作
if(b==0)
{KeySound(); //蜂鸣声
if(id++==11) //10为背光灯 exit
id=10;
}
id_case1_key();
Out_LCM(); //显示输出
}
}
void timereset() //时间清零
{
Set1302(inittime); //清时间
W1302(0x90,0xa5); //打开充电二级管 一个二级管串联一个2K电阻
model++;
}
//对相应的项目进行加、减调整。
void id_case1_key() //按键处理
{
if (TimerUp==0) //增加
{
Delay5Ms();
if(TimerUp==0)
{a=0;msec=0;KeySound(); //蜂鸣声
if((id==9)||(id==5)||(id==11)||(id==15)) //当ID为9、5时按下加、减键将退出调整
{ model++; //退出时间、日期设置
id=0;
}
else
Set(id,1);
}
while(TimerUp==0);
}
if (TimerDown==0) //减少
{
Delay5Ms();
if(TimerDown==0)
{a=0;msec=0;KeySound(); //蜂鸣声
if((id==9)||(id==5)||(id==11)||(id==15)) //当ID为9、5时按下加、减键将退出调整
{ model++; //退出时间、日期设置
id=0;
}
else
Set(id,0); //调用DS1302写入函数
}
while(TimerDown==0);
}
}

void timer_1(void) interrupt 1 //中断入口,闪烁
{
TH0=0x3c; //50ms定时
TL0=0xb0;
if(msec++==10) //500ms
{msec=0;a=~a; //闪烁标志反转
if(a==0) //1秒后背光时间减一秒。
LedTime--;
}
}
//根据选择调整相应项目并写入DS1302
void Set(uchar sel,uchar sel_1)
{
uchar address,item;
uchar max,min;
if(sel==1) {address=0x8c; max=99;min=0;} //年
if(sel==2) {address=0x88; max=12;min=1;} //月
if(sel==3) {address=0x86; max=31;min=1;} //日
if(sel==4) {address=0x8a; max=7; min=1;} //星期
if(sel==6) {address=0x84; max=23;min=0;} //小时
if(sel==7) {address=0x82; max=59;min=0;} //分钟
if(sel==8) {address=0x80; max=59;min=0;} //秒
if(sel==10) {address=0xc0; max=59;min=0;} //背光时间,最长1分钟
if(sel==12) {address=0xc2; max=1;min=0;} //闹铃开关寄存器
if(sel==13) {address=0xc4; max=23;min=0;} //闹铃时寄存器
if(sel==14) {address=0xc6; max=59;min=0;} //闹铃分寄存器
item=R1302(address+1)/1610+R1302(address+1)%16;
if (sel_1==0) item++; else item--;
if(item>max) item=min;
if(item<min) item=max;

W1302(0x8e,0x00); //允许写 *** 作
W1302(address,item/1016+item%10); //写入DS1302 //转成BCD码
W1302(0x8e,0x80); //写保护,禁止写 *** 作
}
//屏幕显示
void Out_LCM(void)
{ switch(model)
{
case 0: model0(); break;
case 1: model1(); break;
case 2: model2(); break; //在不同的条件下显示不同的字符
case 3: model3(); break;
case 4: model4(); break;
case 5: model5(); break;
case 6: model6(); break;
}
}
/model为零时第一行显示时间,不为零时显示system setup/
void model0()
{
DisplayListChar(0,0,TIMER); //显示固定字符串(Time)
OutputInformation(13,0,0x20); //不显示
OutputInformation(4,0,0x20); //不显示
OutputInformation(4,1,0x20); //不显示
OutputInformation(15,1,0x20); //不显示
OutputInformation(7,1,0x2f); //显示固定字符 "/"
OutputInformation(10,1,0x2f); //显示固定字符 "/"
OutputInformation(13,1,0x2f); //显示固定字符 "/"
DisplayListChar(0,1,DATE); //显示固定字符串Date(日期)
if(a==1) //冒号闪烁
{OutputInformation(7,0,0x3a); OutputInformation(10,0,0x3a);}
else
{OutputInformation(7,0,0x20); OutputInformation(10,0,0x20);}
/model为零时第二行显示日期,不为零显示设置项目/

OutputInformation(5,1,R1302(0x8d)/16+0x30); //显示年
OutputInformation(6,1,R1302(0x8d)%16+0x30);

OutputInformation(8,1,R1302(0x89)/16+0x30); //显示月
OutputInformation(9,1,R1302(0x89)%16+0x30);

OutputInformation(11,1,R1302(0x87)/16+0x30); //显示日
OutputInformation(12,1,R1302(0x87)%16+0x30);
OutputInformation(14,1,R1302(0x8b)%16+0x30); //显示星期
OutputInformation(5,0,R1302(0x85)/16+0x30); //显示小时
OutputInformation(6,0,R1302(0x85)%16+0x30);

OutputInformation(8,0,R1302(0x83)/16+0x30); //显示分钟
OutputInformation(9,0,R1302(0x83)%16+0x30);

OutputInformation(11,0,R1302(0x81)/16+0x30); //显示秒
OutputInformation(12,0,R1302(0x81)%16+0x30);
}

/model不为零时显示系统设置/
//model为1时time闪烁,按下模式键后进入时间调整
void model1()
/判断ID的值来显示项目/
{ OutputInformation(0,0,0x20); //不显示
OutputInformation(1,0,0x20);
DisplayListChar(2,0,systemp); //第一行显示system setup
if(id==0) //为0时显示TIME date lalcak
{OutputInformation(9,1,0x20); //不显示
OutputInformation(4,1,0x20); //不显示
OutputInformation(15,1,0x20); //不显示
DisplayListChar(5,1,DATE); //显示date
DisplayListChar(10,1,alarmclock);//显示lalcak

if(a==1)
{OutputInformation(0,1,0x20); //不显示
OutputInformation(1,1,0x20); //不显示
OutputInformation(2,1,0x20); //不显示
OutputInformation(3,1,0x20); //不显示
}
else
DisplayListChar(0,1,TIMER); //显示time
}
else
{ //id不为零进入时间调整项目
OutputInformation(3,1,0x3a); //显示固定字符 ":"
OutputInformation(6,1,0x3a); //显示固定字符 ":"
OutputInformation(9,1,0x20); //不显示
OutputInformation(10,1,0x20); //不显示
OutputInformation(0,1,0x20); //不显示

目录
1 设计目的 3
2 设计要求指标 3
21 基本功能 3
22 扩展功能 4
3.方案论证与比较 4
4 总体框图设计 4
5 电路原理分析 4
51数字钟的构成 4
511 分频器电路 5
512 时间计数器电路 5
513分频器电路 6
514振荡器电路 6
515数字时钟的计数显示电路 6
52 校时电路 7
53 整点报时电路 8
6系统仿真与调试 8
7结论 8
参考文献 9
实验作品附图 10
数字钟
摘要:
数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
数字钟从原理上讲是一种典型的数字电路,其中包括了组合逻辑电路和时序电路。目前,数字钟的功能越来越强,并且有多种专门的大规模集成电路可供选择。
从有利于学习的角度考虑,这里主要介绍以中小规模集成电路设计数字钟的方法。
经过了数字电路设计这门课程的系统学习,特别经过了关于组合逻辑电路与时序逻辑电路部分的学习,我们已经具备了设计小规模集成电路的能力,借由本次设计的机会,充分将所学的知识运用到实际中去。
本次课程设计要求设计一个数字钟,基本要求为数字钟的时间周期为24小时,数字钟显示时、分、秒,数字钟的时间基准一秒对应现实生活中的时钟的一秒。供扩展的方面涉及到定时自动报警、按时自动打铃、定时广播、定时启闭路灯等。因此,研究数字钟及扩大其应用,有着非常现实的意义。
1 设计目的
1.掌握数字钟的设计、组装与调试方法。
2.熟悉集成元器件的选择和集成电路芯片的逻辑功能及使用方法。
3.掌握面包板结构及其接线方法
4.熟悉仿真软件的使用。
2 设计要求及指标
2.1基本功能
1)时钟显示功能,能够正确显示“时”、“分”、“秒”。
2)具有快速校准时、分、秒的功能。
3)用555定时器与RC组成的多谐振荡器产生一个标准频率(1Hz)的方波脉冲信号。
2.2扩展功能
1)用晶体振荡器产生一个标准频率(1Hz)的脉冲信号。
2)具有整点报时的功能。
3)具有闹钟的功能。
4)……
3、方案论证与比较
本设计方案使用555多谐振荡器来产生1HZ的信号。通过改变相应的电阻电容值可使频率微调,不必使用分频器来对高频信号进行分频使电路繁复。虽然此振荡器没有石英晶体稳定度和精确性高,由于设计方便, *** 作简单,成为了设计时的首选,但是由于与实验中使用的555芯片产生的脉冲相比较,利用晶振产生的脉冲信号更加的稳定,同过电压表的测量能很好的观察到这一点,同时在显示上能够更加接进预定的值,受外界环境的干扰较少,一定程度上优于使用555芯片产生信号方式。我们组依然同时设计了555和晶振两个信号产生电路。(本实验报告中着重按照原方案设计的555电路进行说明)
4、 系统设计框图
数字式计时器一般由振荡器、分频器、计数器、译码器、显示器等几部分组成。在本设计中555振荡器及其相应外部电路组成标准秒信号发生器,由不同进制的计数器、译码器和显示器组成计时系统。秒信号送入计数器进行计数,把累计的结果以‘时’、‘分’、‘秒’的数字显示出来。‘时’显示由二十四进制计数器、译码器、显示器构成,‘分’、‘秒’显示分别由六十进制计数器、译码器、显示器构成。其原理框图如图11所示。
5、电路原理分析
51数字钟的构成
数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路由于计数的起始时间不可能与标准时间一致,故需要在电路上加一个校时电路,同时标准的1HZ时间信号必须做到准确稳定在此使用555振荡器组成1Hz的信号。
数字钟原理框图(11)
5.11振荡器电路
555定时器组成的振荡器电路给数字钟提供一个频率为1Hz的方波信号。其中OUT为输出。

512时间计数器电路
时间计数电路由秒个位和秒十位计数器,分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器、分个位和分十位计数器为60进制计数器,而根据设计要求,时个位和时十位计数器为24进制计数器
513分频器电路
通常,数字钟的晶体振荡器输出频率较高,为了得到1Hz的秒信号输入,需要对振荡器的输出信号进行分频。
通常实现分频器的电路是计数器电路,一般采用多级2进制计数器来实现。例如,将32768Hz的振荡信号分频为1HZ的分频倍数为32768( ),即实现该分频功能的计数器相当于15级2进制计数器。
514振荡器电路
利用555定时器组成的多谐振荡器接通电源后,电容C1被充电,当电压上升到一定数值时里面集成的三极管导通,然后通过电阻和三极管放电,不断的充放电从而产生一定周期的脉冲,通过改变电路上器件的值可以微调脉冲周期。
515数字时钟的计数显示控制
在设计中,我们使用的是74160十进制计数器,来实现计数的功能,实验中主要用到了160的置数清零功能(特点:消耗一个时钟脉冲),清零功能(特点:不耗时钟脉冲),在上级160控制下级160时候通过组合电路(主要利用与非门)实现,在连接电路的时候要注意并且强调使能端的连接,其将影响到整一个电路的是否工作。

电路的控制原理如下:
秒钟由个位向十位进位:0000—0001—0010—0011—0100—0101—0110—0111—1000—1001实现个位的计数,采用的是置数的方式(利用RCO端口),当电路计数到1001的时候采用一个二输入与非门接上级输入的高位和低位输出作为下级的信号,实现了秒区的个位和十位的显示与控制。设计中注意到接的是一个与非门而不是与门,目标在产生一个时钟脉冲。实现正确的显示。
由秒区向分区的显示控制:
基本原理同上,在秒区十位向时区个位显示的时:0000—0001—0010—0011—0100—0101产生了六个脉冲的时候向下级输出一个时钟脉冲,利用的还是与非门,目标仍是实现正确的计时显示。
分区的显示及整体电路反馈清零:
当数值显示达到:23:59的时候要实现清零的工作,采用CLR清零的方式反馈清零。具体设计接出控制端的9,5,3,2用十六进制表示后高电平对应引脚接与非,将非门输出信号的值反馈给各个160芯片的清零端(CLR)既可以实现清零了。
52 校时功能的实现
当重新接通电源或走时出现误差时都需要对时间进行校正通常,校正时间的方法是:首先截断正常的计数通路,然后再进行人工出触发计数或将频率较高的方波信号加到需要校正的计数单元的输入端,校正好后,再转入正常计时状态即可
根据要求,数字钟应具有分校正功能,因此,应截断分个位的直接计数通路,并采用正常计时信号与校正信号可以随时切换的电路接入其中
在实验实现过程中使用的是通过开关(普通开关)来实现高低电平的切换,手动赋予需要的高低电平来实现脉冲的供给,将脉冲提供到所需要的输入(CLK)端口,实现校时,仿真过程中能够正常校时并且在校时的时候达到了预定的效果;而在我们进入实际电路连接的时候,利用开关(手控导线点触实现)来实现校时再不像仿真那样的精确了,原因分析是由于使用的是普通的开关同时利用的是手动的对CLK端口赋予脉冲信号,在实现手动生成脉冲信号的过程中产生了扰动,即相当于产生了多个的脉冲信号对需要的数码管进行校时,如此,并没有达到仿真的精确效果,但是在实验中通过改进电路的校时方式,不是用手触开关产生脉冲信号(如若需用手触则需要使用一个锁存器实现去抖动,才能够在脉冲生成时候不产生干扰的脉冲,实现正常的校时),而是使用信号发生器实现信号的提供,对需要校时的数码管在相对应的CLK端口提供脉冲信号实现校时,利用此方式实现校时则比手触开关方式效果要好。
53 报时的实现
报时功能的实现原理较为简单,即对所需要报时的输出量进行控制,并对控制产生的信号作为LED显示的信号源,电路连接中要注意到的是在实现LED显示的时候最好连接上一个保护电阻对LED灯器到保护的作用。例如我们的校时时间是 23:59,0010—0011—0101—1001;利用相应的门电路实现满足端口输出是上述条件的时候进行报时即可。
6、系统仿真与调试
7、结论
学贵以致用,通过几天的数字钟设计过程,将从书本上学到的知识应用于实践,学会了初步的电子电路仿真设计,虽然过程中遇到了一些困难,但是在解决这些问题的过程无疑也是对自己自身专业素质的一种提高。当最终调试成功的时候也是对自己的一种肯定。在当前金融危机大的社会背景下,能够增加自身砝码的不仅仅是一纸文凭证书,更为重要的是毕业生是否能够适应社会大潮流的需要,契合企业的要求即又较硬的动手 *** 作及设计能力。此次的设计作业不仅增强了自己在专业设计方面的信心,鼓舞了自己,更是一次兴趣的培养,为自己以后的学习方向的明确了重点。
另外在这次实验中我们遇到了不少的问题针对不同的问题我们采取不同的解决方法,最终一一解决设计中遇到的问题。还有在实验设计中我们曾遇到多块芯片以及数码管损坏的情况造成了数字钟的显示没有达到预期的效果,或是根本不显示,通过错误排除最终确认是元件问题,并向老师咨询跟换元件最终的到解决。在我们曾经遇到不懂的问题时,利用网上的资源,搜索查找得到需要的信息。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/13148115.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-12
下一篇 2023-06-12

发表评论

登录后才能评论

评论列表(0条)

保存