时钟系统设计
① 时钟程序设计
#include<graphics.h>
#include<math.h>
#include<dos.h>
#define PI 3.1415926
//屏幕中心的坐标(640X480模式下)
#define mid_x 320
#define mid_y 240
int main()
{ int graphdriver=DETECT,graphmode;
int end_x,end_y;
struct time curtime;
float th_hour,th_min,th_sec;
initgraph(&graphdriver,&graphmode,"C:\\TC2"); //初始化VGA屏幕模式
setbkcolor(BLACK); //使用黑色的背景色
while(!kbhit(0)) //若有键盘输入,则跳出,即是结束程序
{ setcolor(GREEN); //把画笔设为绿色
circle(mid_x,mid_y,180); //钟的外圆
circle(mid_x,mid_y,150); //钟的内圆
circle(mid_x,mid_y,1); //画出钟的圆心
gettime(&curtime); //取得系统当前时间
th_sec=(float)curtime.ti_sec*0.1047197551; //把秒针的角度化为弧度,为以后绘制时方便,下同
th_min=(float)curtime.ti_min*0.1047197551+th_sec/60.0; //分针的弧度
th_hour=(float)curtime.ti_hour*0.5235987755+th_min/12.0; //时度的弧度,注意整时是12等分的,所时乘的是3.14/180*5
//计算出时针的尾的坐标(时针长70)
end_x=mid_x+70*sin(th_hour);
end_y=mid_y-70*cos(th_hour);
setcolor(RED);
line(mid_x,mid_y,end_x,end_y); //用红色线画出时针
//计算出分针坐标(分针长110)
end_x=mid_x+110*sin(th_min);
end_y=mid_y-110*cos(th_min);
setcolor(RED);
line(mid_x,mid_y,end_x,end_y); //用红色画出分针
end_x=mid_x+140*sin(th_sec);
end_y=mid_y-140*cos(th_sec);
setcolor(RED);
line(mid_x,mid_y,end_x,end_y); //同上,画出秒针,长为140
//画出钟盘上的刻度,刻度长20
line(140,240,160,240); //9点对应的大刻度
line(320,60,320,80); //12点对应的大刻度
line(500,240,480,240); //3点的刻度
line(320,420,320,400); //6点的刻度
line(410,395.7,400,378.4); //5点
line(475.7,330,458.4,320); //4点
line(475.7,150,458.4,160); //2点
line(410,84.3,400,101.6); //1点
line(230,84.3,240,101.6); //11点
line(164.3,150,181.6,160); //10点
line(164.3,330,181.6,320); //8点
line(230,395.7,240,378.4); //7点
sleep(BLUE); //这里应该是打错,停止一秒,应为sleep(1000)
cleardevice(); //清除屏幕上的显示
}
closegraph(); //关闭VGA屏幕,即返回文本方式
return 0;
}
② 求课程设计“基于MCS51的时钟系统设计”
http://www.xuehi.com/docs/195560.html,这个上面有
③ 急求!!!!!数字系统设计技术--数字时钟设计!!!
同求这个答案....
④ 什么是时钟对准系统(集成电路设计)
一种基于锁相环的时钟系统设计
上网时间 : 2003年09月13日
打 印 版 推 荐 给 同 仁 发 送 查 询
本文介绍了一种基于CMOS工艺的高性能处理器时钟系统设计,设计频率为200MHz,VCO的相位噪声为-110dBC/Hz@100kHz。作者详细分析了锁相环路的结构及组成,并介绍了消除噪声的设计方法。VSPACE=12 HSPACE=12 ALT="图1:锁相环在时钟产生中应用。">
锁相环广泛应用于时钟系统设计中,其中包括相位同步以及时钟倍频等应用。通常,当芯片工作频率高于一定频率时,就需要消除由于芯片内时钟驱动所引起的片内时钟与片外时钟间的相位差,嵌入在芯片内部的PLL可以消除这种时钟延时。此外,很多芯片控制链逻辑需要占空比为50%的时钟,因此需要一个2倍于此的时钟源,集成在芯片内部的PLL可以将外部时钟合成为此时钟源。
系统集成PLL可以从内部触发,比从外部触发更快且更准确,能有效地避免一些与信号完整性相关的问题。系统集成PLL的另一个显著特点是通过调节位于锁相环反馈回路中的时钟树缓冲区中的参数,锁相环能够产生相对于参考输入时钟频率不同倍率的内核时钟,这种调节能确保芯片和外部接口电路之间快速同步和有效的数据传输。
在高性能处理器时钟系统设计中,通常需要锁相环产生片上时钟。本文以一种200MHz的时钟系统设计为实例介绍一种基于锁相环的时钟系统设计,其中输入参考频率是25MHz,相位噪声为-100dBc/Hz@100kHz,压控振荡器增益为380MHz/V,工作电压为5V。仿真和测试结果表明该设计能满足系统要求。
环路结构
以锁相环为基础的时钟产生结构如图1所示:外部25MHz的参考时钟信号或总线时钟(BusCLK)先进入到一个接收缓冲器,在进入鉴频鉴相器(PFD)之前要经过一个分频器,分频系数为M1,得到图1中φi,然后与从分频器M6来的内部反馈信号Фo在PFD中比较,得到误差信号Фe,它将作为电荷泵以及滤波网络的输入,用以控制压控振荡器(VCO)。VSPACE=12 HSPACE=12 ALT="图2:鉴相器结构。">
VCO的输出先经过M3分频,再通过缓冲以后产生系统的主时钟PClk。同时,主时钟在进入分频器M6之前先通过H树形时钟分布网络,最后返回鉴相器,这样就形成了整个反馈回路。从平衡的角度来看, PFD的两个输入必须在频率和相位上保持一致,因此所得到的芯片内核时钟和输入的总线时钟的比值fpclk/fbus必须与M6/M1相等。通过改变M6以及M1的值,可以得到输入时钟频率的整数倍或者分数倍值。由于芯片要求时钟不能出现漂移,所以输出时钟占空比以及系统的相位调整能力必须对环境以及工艺参数变化不敏感。VCO的输出也可以切换到分频器M5上,得到的输出可作为二级高速缓存(L2)的时钟。同理,fvco=M3×fpclk =M5×fL2CLK,二级缓存的输出频率也可以通过调整M3以及M1来得到理想的值。
环路构成分析
整个环路中包括鉴相器、滤波器、压控振荡器、分频器、共模抑制和锁定检测等模块,以下介绍主要模块的结构:
1. 鉴相器VSPACE=12 HSPACE=12 ALT="图3:压控振荡器结构。">
数字鉴频鉴相器产生的输出信号能够表达频率及相位相对超前或者滞后信息,然后送到电荷泵。复位信号到达以后,θi的每一个上升沿都触发“UP”信号,直到θo的一个上升沿到达,这样就结束UP的置位状态转入系统复位状态。同样,如果θo上升沿先于θi到达, “DOWN”被置位,直到θi的一个上升沿到达,继而转入复位状态。除非两个输入相位以及频率非常接近,即进入所谓的“鉴相死区”,一般脉冲的宽度正比于两个输入之间的相差大小。鉴相器结构如图2所示。
2. 压控振荡器
压控振荡器是锁相环中关键部件,在实际应用中有很多种结构,图3是一种常用的结构。其中D延迟单元是整个环路的关键部件,选择单元M负责选择不同的数据通道。
从图3中可以看出,整个压控振荡器是建立在一个带有内部延迟单元的环形振荡器基础上。与灌电流型以及电流调制型压控振荡器相比较,此类差分环形振荡器非常广泛地用在芯片时钟发生电路中,同时内嵌延时单元的压控振荡器有相对较低的VCO增益,所以非常适合于差分控制以及信号路径上电路的实现。实验表明,具有低增益内嵌延时单元的振荡器的“抖动”明显比高增益环小很多,因为在低增益结构中噪声很容易解耦。振荡器内嵌延迟环节的工作频率一般有一定限制,为确保环路单调性,一般上下限之比必须小于2:1,但也可以通过选择适当的分频器比例系数,或者在VCO的信号路径上增加编程能力来有效提高其工作频率范围。VSPACE=12 HSPACE=12 ALT="图4:VCO的噪声曲线。">
压控振荡器的频率范围取决于路径上最长、最短延时,如图3所示,外围虚线框表示最大频率fh的路由,它历经3个延时单元D以及一个选择单元M,内虚线框表示最小频率fl的路由,它的路径包括6个延时单元D以及一个选择单元M,不同单元的选择同时会影响压控振荡器的增益以及环路中心频率。频率范围可以用多路开关来选择不同延时路径来单独确定,从而非常灵活地调节VCO的频率范围,远超于由VCO增益所决定的频率范围。
图3中的延迟单元及选择单元可以建立在PMOS型源耦合差分放大器基础上,该类型放大器带有NMOS型负载,它同时能实现压控摆幅调整,主要通过调整电压及改变有效负载线来实现。电流源的高阻态增加了对源耦合部件的电源噪声抑制,同时,N阱也有效地隔离了P型衬底上的大量噪声,增加系统噪音抑制性能。
仿真结果
使用Cadence中的SpectreRF对所设计电路进行仿真,利用0.6μm,3V/5V,双多晶(Double Poly)、双铝(Double Metal)CMOS工艺参数。VCO是锁相环中关键模块,对VCO做PSS以及PNoise分析,可得到其相位噪声图形,如图4所示,在100kHz处相位噪声近似为-110dBc/Hz。图5是VCO的增益曲线,增益约为380MHz/V,有较好的线性度。
设计总结
由于锁相环中包含模拟电路,噪声干扰也是设计中需要克服的问题。大型数字电路翻转所产生的电源噪声影响锁相环中模拟电路的工作,输出的时钟周期将会因为电源噪声或者其它干扰源(例如MOS管的热噪声)的影响而改变,通常把它称为输出“抖动”。时钟抖动将直接影响到集成电路最高的运行频率,因为它将减少可用的时钟周期。随着可用时钟周期减少,在关键路径上的数字电路在一个周期内得不到足够长的时间来处理数据,直接导致所谓 “关键路径错误”。此外,有大功率芯片干扰或者数模混合电路共衬底时,电源噪声的影响更加明显。VSPACE=12 HSPACE=12 ALT="图5:VCO的增益曲线。">
频率为fm的噪声源在输出端引起的频率偏差Δfout以及相位偏差Δθout可以表示为:
Δθout=Δfout/fm
高频噪声和低频噪声因产生机理不同而体现出来的性能也相差很大,所以在不同的应用场合对其采取的抑制方式也不一样。低频噪声一般包括电源纹波、电阻和晶体管随机热噪声、晶体管随机闪变噪声等。高频噪声主要是来自数字电路的高速翻转以及芯片控制部件的快速切换,在芯片时钟设计中,该类型噪声占主导地位。高频噪声因为其频率比较高,所产生的相位偏移Δθout比较小,一般高频噪声用周期性的“抖动”来描述。
经典的锁相环路中包含有模拟电路,因此对噪声非常敏感,对于片上集成的锁相环路一般采用以下措施来消除噪声:
1. 用电源和地线包围整个锁相环。地线圈能够使锁相环周围的衬底电位保持稳定,恒定的衬底电位能够抑制噪声,而输入输出单元以及其它逻辑电路引入的噪声大部分是通过衬底耦合引入的。
2. 将锁相环路的电源线与芯片其它系统的电源线分离。因为经常在逻辑电路部分或者接口电路部分出现瞬间大电流,导致主电源的电位不断变化。电源电压不断变化将影响锁相环噪声抑制功能,所以在设计锁相环路的电源以及地时,应该考虑将主电源部分与锁相环电源部分分离,并且都用单独的引脚给出。
3. 把锁相环路的输入引脚放置在锁相环路旁边,以免其受到电源波动以及其它干扰的影响。
⑤ 基于51单片机的时钟系统设计
设计题目:基于51单片机的时钟系统设计,我可以按你的要求设计。具体加我说
⑥ 数字电子钟计时系统设计
看以容易做起来却难.单片机可以实现,但做出来很大,不实际.这种电路版市面上不知有没.
⑦ 设计系统中时钟自动跳动是如何做到的
在系统设计当中时钟进行自动跳动主要是通过系统以上电或者系统一开启的时候就自动启动时钟进行设置
⑧ 电子日历时钟系统程序设计
(一) 项目名称:八路温度测量检测系统
(二) 项目要求:
1.手动查询每一点的温度值
2.自动轮流显示每一点温度值
3. 可以设定每一点的温度值,超过温度
上下限时,系统自动报警
(三) 项目内容:
系统组成部分:温度采集电路、A/D转换、单片机、8155扩展单元、液晶显示、按键等。
采用的方式:手动或自动循环选择一条通道,单片机对采集到的信息进行数据处理,送给液晶显示电路,显示电路显示此通道号及此通道的温度。当温度超过设定的温度上下限时自动报警,通过调整相应通道温度,使温度在设定范围内,系统会自动退出报警状态
1. 系统框图:
2. 系统原理图:
(1) 温度采集电路
(2) A/D转换电路
(3) 显示电路
3. 程序框图
(1)程序流程图
(2)键盘扫描流程图
(4) 显示报警流程图
#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
#include <wen.h>
//主函数
void main()
{
Port_Com=0x03;
lcd_init();
while(1)
{
if(model==1)
{
for(z=0;z<8;z++)
{
ad_sz=read1543(z);
ad_data=(5.0*ad_sz)/1024;
rt=ad_data/16+5.0/11;
r=(1000*rt)/(5-rt)-100;
ti=200/75.8*r;
display();
delayms(500);
key_scan();
}
}
if(model==2)
{
ad_sz=read1543(s);
ad_data=(5.0*ad_sz)/1024;
rt=ad_data/16+5.0/11;
r=(1000*rt)/(5-rt)-100;
ti=200/75.8*r;
display();
delayms(5);
key_scan();
}
if(model==3)
{
ad_sz=read1543(t);
ad_data=(5.0*ad_sz)/1024;
rt=ad_data/16+5.0/11;
r=(1000*rt)/(5-rt)-100;
ti=200/75.8*r;
display();
key_scan();
sound();
}
}
}
#define uint unsigned int
#define uchar unsigned char
#define Port_Com XBYTE[0xfd00]
#define Port_A XBYTE[0xfd01]
#define Port_B XBYTE[0xfd02]
#define Port_C XBYTE[0xfd03]
sbit RS=P1^5;
sbit RW=P1^6;
sbit EN=P1^7;
sbit ad_out=P2^4;
sbit ad_addr=P2^5;
sbit cs=P2^6;
sbit clk=P2^7;
sbit speaker=P1^0;
uchar z,s,t;
uchar key_value;
uchar model=1;
uchar ad[16],f1[16];
uchar f=0;
uchar =1;
uint ted1,teu1;
uint ad_dat;
uint ad_sz;
float ad_data,rt,r,ti;
float teu=40.0;
float ted=10.0;
void change();
void fun();
void add();
void dec();
void tem_();
void sound();
void delay(uint t)
{
while(t--);
}
//m毫秒延时函数
void delayms(uint m)
{
uchar i;
while(m--)
for(i=0;i<125;i++) ;
}
//1602写命令函数
void lcd_wricmd(uchar c)
{
delay(500);
RS=0;
RW=0;
EN=1;
Port_A=c;
EN=0;
}
//1602写数据函数
void lcd_wridata(uchar d)
{
delay(500);
RS=1;
RW=0;
EN=1;
Port_A=d;
EN=0;
}
//1602初始化函数
void lcd_init()
{
lcd_wricmd(0x38); //8位数据端口,2行显示,5*7点阵
lcd_wricmd(0x0c);
lcd_wricmd(0x06);
lcd_wricmd(0x01);
}
//1602子符串输出函数
void lcd_putstr(uchar *p,bit flag)
{ uchar ad;
if(flag==0)
{
ad=0x80;
while(*p!='\0')
{
lcd_wricmd(ad); ad++;
lcd_wridata(*p); p++;
}
}
if(flag==1)
{
ad=0xc0;
while(*p!='\0')
{
lcd_wricmd(ad); ad++;
lcd_wridata(*p); p++;
}
}
}
void change()
{
ad_dat=ti*100;
ad[0]=ad_dat/10000+0x30;
ad[1]=ad_dat/1000%10+0x30;
ad[2]=ad_dat/100%10+0x30;
ad[3]='.';
ad[4]=ad_dat%100/10+0x30;
ad[5]=ad_dat%10+0x30;
ad[6]=0xdf;
ad[7]='C';
ad[8]=' ';
ad[9]=' ';
ad[10]=' ';
ad[11]=' ';
ad[12]=' ';
ad[13]=' ';
ad[14]=' ';
ad[15]=' ';
}
void change3()
{
ted1=ted*10;
teu1=teu*10;
ad_dat=ti*100;
ad[0]=ad_dat/10000+0x30;
ad[1]=ad_dat/1000%10+0x30;
ad[2]=ad_dat/100%10+0x30;
ad[3]='.';
ad[4]=ad_dat%100/10+0x30;
ad[5]=ad_dat%10+0x30;
ad[6]=0xdf;
ad[7]='C';
ad[9]='>';
ad[10]=ted1/100+0x30;
ad[11]=ted1/10%10+0x30;
ad[13]='<';
ad[14]=teu1/100+0x30;
ad[15]=teu1/10%10+0x30;
}
uint read1543(uchar addr)
{
uchar i;
uchar ah,al;
uint ad;
clk=0;
cs=0;
addr<<=4;
for(i=0;i<4;i++)
{
ad_addr=(bit)(addr&0x80);
clk=1;
clk=0;
addr<<=1;
}
for(i=0;i<6;i++)
{
clk=1;
clk=0;
}
cs=1;
delay(25);
cs=0;
_nop_();
_nop_();
_nop_();
for(i=0;i<2;i++)
{
ad_out=1;
clk=1;
ah<<=1;
if(ad_out)
ah=ah+0x01;
clk=0;
}
for(i=0;i<8;i++)
{
ad_out=1;
clk=1;
al<<=1;
if(ad_out)
al=al+0x01;
clk=0;
}
cs=1;
ad=(uint)ah;
ad<<=8;
ad=ad+(uint)al;
return(ad);
}
void display()
{
if(model==1)
{
change();
switch(z)
{
case 0: lcd_putstr("ZI DONG NO.1 : ",0);
lcd_putstr(ad,1);
break;
case 1: lcd_putstr("ZI DONG NO.2 : ",0);
lcd_putstr(ad,1);
break;
case 2: lcd_putstr("ZI DONG NO.3 : ",0);
lcd_putstr(ad,1);
break;
case 3: lcd_putstr("ZI DONG NO.4 : ",0);
lcd_putstr(ad,1);
break;
case 4: lcd_putstr("ZI DONG NO.5 : ",0);
lcd_putstr(ad,1);
break;
case 5: lcd_putstr("ZI DONG NO.6 : ",0);
lcd_putstr(ad,1);
break;
case 6: lcd_putstr("ZI DONG NO.7 : ",0);
lcd_putstr(ad,1);
break;
case 7: lcd_putstr("ZI DONG NO.8 : ",0);
lcd_putstr(ad,1);
break;
}
}
if(model==2)
{
change();
switch(s)
{
case 0: lcd_putstr("SHOU DONG NO.1 :",0);
lcd_putstr(ad,1);
break;
case 1: lcd_putstr("SHOU DONG NO.2 :",0);
lcd_putstr(ad,1);
break;
case 2: lcd_putstr("SHOU DONG NO.3 :",0);
lcd_putstr(ad,1);
break;
case 3: lcd_putstr("SHOU DONG NO.4 :",0);
lcd_putstr(ad,1);
break;
case 4: lcd_putstr("SHOU DONG NO.5 :",0);
lcd_putstr(ad,1);
break;
case 5: lcd_putstr("SHOU DONG NO.6 :",0);
lcd_putstr(ad,1);
break;
case 6: lcd_putstr("SHOU DONG NO.7 :",0);
lcd_putstr(ad,1);
break;
case 7: lcd_putstr("SHOU DONG NO.8 :",0);
lcd_putstr(ad,1);
break;
}
}
if(model==3)
{
change3();
switch(t)
{
case 0: lcd_putstr("TIAO ZHENG NO.1:",0);
lcd_putstr(ad,1);
break;
case 1: lcd_putstr("TIAO ZHENG NO.2:",0);
lcd_putstr(ad,1);
break;
case 2: lcd_putstr("TIAO ZHENG NO.3:",0);
lcd_putstr(ad,1);
break;
case 3: lcd_putstr("TIAO ZHENG NO.4:",0);
lcd_putstr(ad,1);
break;
case 4: lcd_putstr("TIAO ZHENG NO.5:",0);
lcd_putstr(ad,1);
break;
case 5: lcd_putstr("TIAO ZHENG NO.6:",0);
lcd_putstr(ad,1);
break;
case 6: lcd_putstr("TIAO ZHENG NO.7:",0);
lcd_putstr(ad,1);
break;
case 7: lcd_putstr("TIAO ZHENG NO.8:",0);
lcd_putstr(ad,1);
break;
}
}
}
void key_scan() //键盘扫描
{
key_value=Port_C|0xe0;
if(key_value!=0xff)
{
delayms(20);
key_value=Port_C|0xe0;
if(key_value!=0xff)
{
switch(key_value)
{
case 0xfe: fun(); break;
case 0xfd: add(); break;
case 0xfb: dec(); break;
case 0xf7: tem_(); break;
}
}
}
}
void fun() //功能键
{
//delayms(20);
model++;
if(model==4)
model=1;
}
void add() //加1键
{
//delayms(20);
if(model==2)
{
s++;
if(s==8)
s=0;
}
if(model==3)
{
if(==1)
{
t++;
if(t==8)
t=0;
}
if(==2)
ted++;
if(==3)
teu++;
}
}
void dec() //减1键
{
//delayms(20);
if(model==2)
{
if(s==0)
s=8;
s--;
}
if(model==3)
{
if(==1)
{
if(t==0)
t=8;
t--;
}
if(==2)
ted--;
if(==3)
teu--;
}
}
void tem_() //设定温度上下限数值
{
++;
if(==4)
=1;
}
void sound()
{
if(ti<=ted)
{
lcd_wricmd(0xc9);
lcd_wridata('L');
lcd_wridata('O');
lcd_wridata('W');
lcd_wridata(' ');
speaker=0;
}
if(ti>=teu)
{
lcd_wricmd(0xcc);
lcd_wridata('H');
lcd_wridata('I');
lcd_wridata('G');
lcd_wridata('H');
speaker=0;
}
}
⑨ 设计一个可设定初始时间电子时钟,描述起功能,画出系统框图并给出说
刚开始上电时, system_mode不是1也不是2,不知你初始化时是否给它赋值?另外你的按键检测程序没加入到循环程序中,刚上电时若没有按键按下,则很快跳过两个按键检测语句,然后进入循环显示程序中,这是一个死循环,只有中断才可打断其运行,所以再按什么键也没反应了,建议把按键检测放入显示循环中,它对显示效果不会有什么影响,或在初始化后加一个循环,若两个按键都没有按下,一直检测按键