時鍾系統設計
① 時鍾程序設計
#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,不知你初始化時是否給它賦值?另外你的按鍵檢測程序沒加入到循環程序中,剛上電時若沒有按鍵按下,則很快跳過兩個按鍵檢測語句,然後進入循環顯示程序中,這是一個死循環,只有中斷才可打斷其運行,所以再按什麼鍵也沒反應了,建議把按鍵檢測放入顯示循環中,它對顯示效果不會有什麼影響,或在初始化後加一個循環,若兩個按鍵都沒有按下,一直檢測按鍵