時鍾晶元編程
Ⅰ ds1302時鍾晶元怎麼連單片機
ds1302時鍾晶元採用I2C匯流排和單片機連接,如果 單 片機沒有I2C匯流排介面,可以用普通IO口模擬
Ⅱ 有沒有人用過可編程鎖相環合成時鍾晶元
隨著數字電路技術的發展,數字鎖相環在調制解調、頻率合成、FM 立體聲解碼、彩色副載波同步、圖象處理等各個方面得到了廣泛的應用。數字鎖相環不僅吸收了數字電路可靠性高、體積小、價格低等優點,還解決了模擬鎖相環的直流零點漂移、器件飽和及易受電源和環境溫度變化等缺點,此外還具有對離散樣值的實時處理能力,已成為鎖相技術發展的方向。鎖相環是一個相位反饋控制系統,在數字鎖相環中,由於誤差控制信號是離散的數字信號,而不是模擬電壓,因而受控的輸出電壓的改變是離散的而不是連續的;此外,環路組成部件也全用數字電路實現,故而這種鎖相環就稱之為全數字鎖相環(簡稱DPLL)。
基本原理:
傳統的數字鎖相環是利用輸人信號與其輸出信號之間的相位差別來跟蹤輸人信號,但由於鎖相環具有一定的捕捉時間,採用這種數字鎖相環不能准確提取輸人信號的每一周期的相位改變,不能用於數顯裝置的動態測量。針對這些問題,設計出一種新型的全數字鎖相環
全數字鎖相環主要由數字鑒相器、可逆計數器、頻率切換電路及N分頻器四部分組成。其中可逆計數器及N分頻器的時鍾由外部晶振提供。不用VCO,可大大減輕溫度及電源電壓變化對環路的影響。同時,採用在系統可編程晶元實現有利於提高系統的集成度和可靠性。
現狀和發展
目前,已有單片集成全數字鎖相環的商用產品,但作為某一個實際項目設計,需要的鎖相電路特性不盡相同,有些現成的產品,不是成本高、體積大、資源浪費多,就是不能完全滿足設計性能的要求。根據位移檢測的特點,採用高密度可編程邏輯器件,可根據實際要求,充分利用器件資源,同時把一些相關的數字電路組合在一起,不僅提高了系統的集成度和可靠性,降低了功耗,降低了成本。而且使電路性能得到明顯改善。
Ⅲ 怎麼讀時鍾晶元DS1302的時間
我的DS1302剛剛弄好。也遇到過你說的問題,原因是沒有DS1302沒有啟動。首先你在開機時候如果DS1302處於掉電狀態,則要在8EH輸入00H,也就是初始化。否則不能對它進行操作,之後你就可以隨意操作了。注意:1.如果是往DS1302里邊寫數據,在寫之前要先將CLK置低電平,然後才能將RST置高。之後在前8個上升沿發送地址,下8個上升沿發送你要寫的數據。完了RST置低,禁止操作。2.讀的時候也是要先將CLK置低電平,然後才能將RST置高。之後在前8個上升沿發送地址,特別注意,在最後一個數據發送完了後,該脈沖的下降沿就會輸出數據的第一位。所以實際上只有15個脈沖。3.另外數據的讀寫都是從低位發送和接收的。4.網上中文資料很多,你可以下來看看,但以上問題是往往被忽略的,和你一起分享下。
Ⅳ 只想用8563日歷時鍾晶元的定時器功能,請問對51單片機用C語言編程,SCL,SDA這兩個引腳要用嗎怎麼用
您好! 程式如下,編譯運行確認過沒問題了:
#include<stdio.h>
void main()
{
int N, i, j;
int *elements;
int **diffTriangle;
printf("Please input N:");
scanf("%d", &N);
// 動態申請一維數據內存來存儲輸入數據
elements = (int*)malloc(N*sizeof(int));
// 動態申請二維數據內存來存儲間差數據
diffTriangle = (int**)malloc((N - 1)*sizeof(int*));
for (i = 0; i < N - 1; i++)
diffTriangle[i] = (int*)malloc((N - 1)*sizeof(int));
// 輸入數據
printf("Please input %d numbers:", N);
for (i = 0; i < N; i++)
scanf("%d", &elements[i]);
// 計算間差
for (i = 0; i < N - 1; i++)
for (j = 0; j <= i; j++)
diffTriangle[i][j] = elements[i+1] - elements[i-j];
// 輸出
for (i = 0; i < N - 1; i++)
{
for (j = 0; j <= i; j++)
printf("%d\t", diffTriangle[i][j]);
printf("\n");
}
// 清空內存
free(elements);
for (i = 0; i < N - 1; i++)
free(diffTriangle[i]);
free(diffTriangle);
}
Ⅳ 有木有大佬幫我解釋一下這段ds1302時鍾晶元程序是什麼意思
在前面的課程中我們已經了解到了不少關於時鍾的概念,比如我們用的單片機的主時鍾是11.0592M、I2C匯流排有一條時鍾信號線SCL等,這些時鍾本質上都是一個某一頻率的方波信號。那麼除了這些在前面新學到的時鍾概念外,還有一個我們早已熟悉的不能再熟悉的時鍾概念——年-月-日 時:分:秒,就是我們的鍾表和日歷給出的時間,它的重要程度我想就不需要多說了吧,在單片機系統里我們把它稱作實時時鍾,以區別於前面提到的幾種方波時鍾信號。實時時鍾,有時也被稱作牆上時鍾,很形象的一個名詞,對吧,大家知道他們講的一回事就行了。本章,我們將學習實時時鍾的應用,有了它,你的單片機系統就能在漫漫歷史長河中找到自己的時間定位啦,可以在指定時間干某件事,或者記錄下某事發生的具體時間,等等。除此之外,本章還會學習到C語言的結構體,它也是C語言的精華部分,我們通過本章先來了解它的基礎,後面再逐漸達到熟練、靈活運用它,你的編程水平會提高一個檔次哦。 15.1 BCD碼的學習 在我們日常生產生活中用的最多的數字是十進制數字,而單片機系統的所有數據本質上都是二進制的,所以聰明的前輩們就給我們創造了BCD碼。
BCD碼(Binary-Coded Decimal)亦稱二進碼十進制數或二-十進制代碼。用4位二進制數來表示1位十進制數中的0~9這10個數字。是一種二進制的數字編碼形式,用二進制編碼的十進制代碼。BCD碼這種編碼形式利用了四個位元來儲存一個十進制的數碼,使二進制和十進制之間的轉換得以快捷的進行。我們前邊講過十六進制和二進制本質上是一回事,十六進制僅僅是二進制的一種縮寫形式而已。而十進制的一位數字,從0到9,最大的數字就是9,再加1就要進位,所以用4位二進製表示十進制,就是從0000到1001,不存在1010、1011、1100、1101、1110、1111這6個數字。BCD碼如果到了1001,再加1的話,數字就變成了0001 0000這樣的數字了,相當於用了8位的二進制數字表示了2位的十進制數字。關於BCD碼更詳細的介紹請點擊 www.51hei.com 的基礎教程欄目裡面有很多相關文章.
BCD碼的應用還是非常廣泛的,比如我們這節課要學的實時時鍾,日期時間在時鍾晶元中的存儲格式就是BCD碼,當我們需要把它記錄的時間轉換成可以直觀顯示的ASCII碼時(比如在液晶上顯示),就可以省去一步由二進制的整型數到ASCII的轉換過程,而直接取出表示十進制1位數字的4個二進制位然後再加上0x30就可組成一個ASCII碼位元組了,這樣就會方便的多,在後面的實際常式中將看到這個簡單的轉換。
15.2 SPI時序初步認識 UART、I2C和SPI是單片機通信中最常用的三種通信協議。前邊我們已經學了UART和I2C通信協議,這節課我們來學習剩下的SPI通信協議。SPI是英語Serial Peripheral Interface的縮寫,顧名思義就是串列外圍設備介面。SPI是一種高速的、全雙工、同步通信匯流排,標準的SPI也僅僅使用4個引腳,常用於單片機和EEPROM、FLASH、實時時鍾、數字信號處理器等器件的通信。SPI通信原理比I2C要簡單,它主要是主從方式通信,這種模式通常只有一個主機和一個或者多個從機,標準的SPI是4根線,分別是SSEL(片選,也寫作SCS)、SCLK(時鍾,也寫作SCK)、MOSI(主機輸出從機輸入Master Output/Slave Input)和MISO(主機輸入從機輸出Master Input/Slave Output)。
SSEL:從設備片選使能信號。如果從設備是低電平使能的話,當拉低這個引腳後,從設備就會被選中,主機和這個被選中的從機進行通信。
SCLK:時鍾信號,由主機產生,和I2C通信的SCL有點類似。
MOSI:主機給從機發送指令或者數據的通道。
MISO:主機讀取從機的狀態或者數據的通道。
在某些情況下,我們也可以用3根線的SPI或者2根線的SPI進行通信。比如主機只給從機發送命令,從機不需要回復數據的時候,那MISO就可以不要;而在主機只讀取從機的數據,不需要給從機發送指令的時候,那MOSI可以不要;當一個主機一個從機的時候,從機的片選有時可以固定為有效電平而一直處於使能狀態,那麼SSEL可以不要;此時如果再加上主機只給從機發送數據,那麼SSEL和MISO都可以不要;如果主機只讀取從機送來的數據,SSEL和MOSI都可以不要。 3線和2線的SPI大家要知道怎麼回事,實際使用也是有應用的,但是當我們提及SPI的時候,一般都是指標准SPI,都是指4根線的這種形式。
SPI通信的主機也是我們的單片機,在讀寫數據時序的過程中,有四種模式,要了解這四種模式,首先我們得學習一下2個名詞。
CPOL:Clock Polarity,就是時鍾的極性。
時鍾的極性是什麼概念呢?通信的整個過程分為空閑時刻和通信時刻,SCLK在數據發送之前和之後的空閑狀態是高電平那麼CPOL=1,如果空閑狀態SCLK是低電平,那麼CPOL=0。
CPHA:Clock Phase,就是時鍾的相位。
主機和從機要交換數據,就牽涉到一個問題,即主機在什麼時刻輸出數據到MOSI上而從機在什麼時刻采樣這個數據,或者從機在什麼時刻輸出數據到MISO上而主機什麼時刻采樣這個數據。同步通信的一個特點就是所有數據的變化和采樣都是伴隨著時鍾沿進行的,也就是說數據總是在時鍾的邊沿附近變化或被采樣。而一個時鍾周期必定包含了一個上升沿和一個下降沿,這是周期的定義所決定的,只是這兩個沿的先後並無規定。又因為數據從產生的時刻到它的穩定是需要一定時間的,那麼,如果主機在上升沿輸出數據到MOSI上,從機就只能在下降沿去采樣這個數據了。反之如果一方在下降沿輸出數據,那麼另一方就必須在上升沿采樣這個數據。
CPHA=1,就表示數據的輸出是在一個時鍾周期的第一個沿上,至於這個沿是上升沿還是下降沿,這要是CPOL的值而定,CPOL=1那就是下降沿,反之就是上升沿。那麼數據的采樣自然就是在第二個沿上了。
CPHA=0,就表示數據的采樣是在一個時鍾周期的第一個沿上,同樣它是什麼沿由CPOL決定。那麼數據的輸出自然就在第二個沿上了。仔細想一下,這里會有一個問題:就是當一幀數據開始傳輸第一bit時,在第一個時鍾沿上就采樣該數據了,那麼它是在什麼時候輸出來的呢?有兩種情況:一是SSEL使能的邊沿,二是上一幀數據的最後一個時鍾沿,有時兩種情況還會同時生效。
我們以CPOL=1/CPHA=1為例,把時序圖畫出來給大家看一下,如圖15-1所示,。
Ⅵ 單片機編程的時鍾,跟專業的時鍾晶元做的時鍾有什麼區別
幾乎沒有區別。
專業的時鍾晶元可以用電池很小的電流維持時鍾工作,有些晶元還可以給電池涓流充電。
很多單片機也有節電模式,同樣可以很省電,還可以做出很多其他功能,只是要自己設計實現,比較麻煩,體積也比較大。
說到底,「專業的時鍾晶元」內部也是一個單片機系統,不過是別人做好了的、功能已經固定了的專用系統罷了。
Ⅶ DS1302晶元如何進行12/24 制顯示時間轉換的編程(C語言)
修改DS1302晶元的(85h、84h)寄存的BIT7進行12/24小時模式切換,BIT7=1是12小時模式,BIT7=0是24小時模式。
Ⅷ 求一份用74ls192晶元做的數字時鍾電路圖
如圖所示:

主要突出計數和進位,略去預置和校時,及簡化了七段碼顯示電路。
(8)時鍾晶元編程擴展閱讀:
現在流行的串列時鍾電路很多,如DS1302、DS1307、PCF8485等。這些電路的介面簡單、價格低廉、使用方便,被廣泛地採用。
實時時鍾電路DS1302是DALLAS公司的一種具有涓細電流充電能力的電路,主要特點是採用串列數據傳輸,可為掉電保護電源提供可編程的充電功能,並且可以關閉充電功能。採用普通32.768kHz晶振。
時鍾晶元DS1302的各引腳功能如下:
Vcc1:主電源;Vcc2:備份電源。當Vcc2>Vcc1+0.2V時,由Vcc2
向DS1302供電,當Vcc2< Vcc1時,由Vcc1向DS1302供電。
SCLK:串列時鍾,輸入,控制數據的輸入與輸出;
I/O:三線介面時的雙向數據線;
RST為復位引腳,在讀、寫數據期間,必須為高,
X1 X2為32.768Hz晶振管腳,為晶元提供時鍾脈沖。
Ⅸ 用單片機設計一個時鍾,可顯示時和分,可以調時間,也要有鬧鍾功能,要有設計的電路圖
其實不用定時中斷也能實現功能:
#include<reg51.h> 主函數
unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};定義0-9數組
unsigned int tmp;定義變數
void delay(unsigned int xms)定義延時函數
{unsigned int j,i;
for(i=0;i<xms;i++)
for(j=0;j<100;j++);
}
void disp()定義子函數
{
P1=tmp;
delay(1);
P2=0xff;
tmp=tmp<<1;
}
void main( )
{
unsigned char z,s=00,m=00,h=00;給時鍾初始值
while(1)
{
for(z=0;z<100;z++)
{
tmp=0x01;
P2=tab[h/10];小時顯示
disp();
P2=tab[h%10];
disp();
P2=tab[m/10];分鍾顯示
disp();
P2=tab[m%10];
disp();
P2=tab[s/10];秒顯示
disp();
P2=tab[s%10];
disp();
}
s++;
while(s==60)秒進一位,到60清0
{
m++;
s=00;
}
while(m==60)分鍾進一位,到60清0
{
h++;
m=00;
}
while(h==24)小時進一位,到24清0
{
h=00;
}
}
}
