日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導讀]DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數據。DS1302內部有一個31×8的用于臨時性存放數據的RAM寄存器。DS1302是DS1202的升級產品,與DS1202兼容,但增加了主電源/后備電源雙電源引腳,同時提供了對后備電源進行涓細電流充電的能力。

 DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數據。DS1302內部有一個31×8的用于臨時性存放數據的RAM寄存器。DS1302是DS1202的升級產品,與DS1202兼容,但增加了主電源/后備電源雙電源引腳,同時提供了對后備電源進行涓細電流充電的能力。

DS1302的引腳排列,其中Vcc1為后備電源,VCC2為主電源。在主電源關閉的情況下,也能保持時鐘的連續(xù)運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當Vcc2大于Vcc1+0.2V時,Vcc2給DS1302供電。當Vcc2小于Vcc1時,DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768kHz晶振。RST是復位/片選線,通過把RST輸入驅動置高電平來啟動所有的數據傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數據傳送的方法。當RST為高電平時,所有的數據傳送被初始化,允許對DS1302進行操作。如果在傳送過程中RST置為低電平,則會終止此次數據傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運行時,在Vcc>2.0V之前,RST必須保持低電平。只有在SCLK為低電平時,才能將RST置為高電平。I/O為串行數據輸入輸出端(雙向),后面有詳細說明。SCLK為時鐘輸入端。 下圖為DS1302的引腳功能圖

本程序只顯示時間,沒有年份和月份

C代碼

#include "my51.h"

#include "smg.h"

#include "ds1302.h"

void main() //ds1302顯示時鐘

{

ds1302_initSet();//初始化

//ds1302_stop(); 停掉1302,進入省電模式

while(1)

{

ds1302_readRTC();_nop_(); //讀取時鐘數據

displaySMG(ds1302_processTimeData());//處理數據并送數碼管顯示

}

}

C代碼

 

 

#ifndef _DS1302_H

#define _DS1302_H

#include "my51.h"

sbit rst=P3^4; //片選總線

sbit sda=P3^5; //數據總線

sbit scl=P3^6; //時鐘線

extern u8 data smgWela[7]; //數碼管顯示參數

extern u8 data timeData[7]; //年,周,月,日,時,分,秒的初值

//void ds1302_setUnCharger() //充電控制,禁止充電

//void ds1302_stop() ; //暫停ds1302,進入超低功耗模式

u8* ds1302_processTimeData(); //處理時鐘數據,送給數碼管顯示

void ds1302_readRTC(); //讀取所有時鐘數據的BCD碼

void ds1302_initSet() ; //設置初始化數據

u8 ds1302_readData(u8 addr); //從ds1302讀一個字節(jié),讀的時候會先寫地址

void ds1302_writeByte(u8 dat); //寫一個字節(jié)

void ds1302_writeData(u8 addr,u8 dat); //向指定地址寄存器寫數據

#endif

C代碼

 

 

#include "ds1302.h"

data u8 timeData[7]={10,6,4,17,11,20,55};

code u8 writeAddr[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//寫年周月日時分秒寄存器地址指令

code u8 readAddr[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//讀的指令地址

void ds1302_writeData(u8 addr,u8 dat) //向指定地址寄存器寫數據

{

rst=0; _nop_();

scl=0; _nop_();

rst=1; _nop_();

ds1302_writeByte(addr); //先寫入地址

ds1302_writeByte(dat);

rst=0;_nop_(); //關閉

sda=1; //釋放

scl=1;

}

void ds1302_writeByte(u8 dat) //寫一個字節(jié)

{

u8 i=0;

for(i=0;i<8;i++)

{

scl=0; //時鐘線拉低

sda=dat&0x01; //數據從最低位開始賦值

dat>>=1;

scl=1;_nop_(); //上升沿寫入一位

}

}

u8 ds1302_readData(u8 addr) //從ds1302讀一個字節(jié),讀的時候會先寫地址

{

u8 i,value=0;

rst=0;_nop_();

scl=0;_nop_();

sda=1;_nop_();

rst=1;_nop_();

ds1302_writeByte(addr); //先寫入要讀的地址

_nop_();

sda=1;_nop_();

for(i=0;i<8;i++)

{

value>>=1;

scl=0;_nop_(); //下降沿開始后提取有效數據

if(sda) //讀數據

{

value|=0x80;//高電平手動置位保存數據,

} //低電平數據value最高位默認已經是0

scl=1; //為下一次讀取數據做準備

}

rst=0;

return value;

}

void ds1302_initSet() //設置初始化數據

{

u8 i,j;

for(i=0;i<7;i++)//將初始化數據處理成BCD碼

{

j = timeData[i] / 10;

timeData[i]=timeData[i]%10;

timeData[i]=timeData[i]+j*16;

}

ds1302_writeData(0x8e,0x00); //清除寫保護

for(i=0;i<7;i++)

{ //將時鐘日歷數據經過轉換后的BCD碼寫到7個時鐘日歷寄存器中

ds1302_writeData(writeAddr[i],timeData[i]);

}

ds1302_writeData(0x90,0x5c); //禁止充電,降低功耗,針對不可充電電池

//ds1302_writeData(0x90, 0xa6);//開啟充電,用一個二極管,用4k電阻

ds1302_writeData(0x8e,0x80); //使能寫保護

}

void ds1302_readRTC() //讀取所有時鐘數據的BCD碼

{

u8 i;

for(i=0;i<7;i++)

{ //讀取的時候會把時鐘日歷的7個寄存器中的數據全部讀取,并保存到timeData[]

timeData[i]=ds1302_readData(readAddr[i]);

}

}

u8* ds1302_processTimeData() //顯示時鐘,暫時只顯示時間

{

smgWela[5]

smgWela[5]=timeData[6] & 0x0f;//提取低4位

smgWela[4]=timeData[6] >> 4;//提取高4位

smgWela[3]=timeData[5]& 0x0f;

smgWela[2]=timeData[5]>> 4;

smgWela[1]=timeData[4]& 0x0f;

smgWela[0]=timeData[4]>> 4;

smgWela[6]=0xf5; //0xf5是小數點的位置

return smgWela;

}

/*

void ds1302_stop() //暫停ds1302

{

ds1302_writeData(0x8e,0x00); //清除寫保護

ds1302_writeData(writeAddr[6],0x80); //暫停ds1302,進入超低功耗模式

ds1302_writeData(0x8e,0x80); //使能寫保護

} */

/*

void ds1302_setUnCharger() //充電控制,禁止充電

{

ds1302_writeData(0x8e,0x00); //清除寫保護

ds1302_writeData(0x90,0x5c); //禁止充電,降低功耗

ds1302_writeData(0x8e,0x80); //使能寫保護

}*/

C代碼

 

 

#ifndef _51SMG_H_

#define _51SMG_H_

#include "my51.h"

sbit dula =P2^6; //段選鎖存器控制 控制筆段

sbit wela =P2^7; //位選鎖存器控制 控制位置

extern u8 data smgWela[7]; //第一位到第六位,最后一個是小數點位置控制

#define dark 0x11//在段中,0x11是第17號元素,0x00是低電平,數碼管不亮,即table[17]

#define dotDark 0xff//小數點全暗

void displaySMG(u8* pWela); //數碼管顯示函數,參數是數組指針

#endif

C代碼

 

 

#include "smg.h"

#include "my51.h"

static u8 code table[]= { //0~F外加小數點和空輸出的數碼管編碼

0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 3

0x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 7

0x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B

0x39 , 0x5e , 0x79 , 0x71 , // C D E F

0x80 , 0x00 ,0x40 // . 空 負號 空為第17號元素

};

/* 由于此表只能一次顯示一個小數點,故已注釋掉,僅供查詢

例如想要第一個和第六個數碼管小數點同時點亮,

則執(zhí)行 pWela->dot = 0xfe & 0xdf 即可

u8 code dotTable[]={ //小數點位置,某一位置0時,小數點亮

0xff , //全暗

0xfe , 0xfd , 0xfb , //1 2 3

0xf7 , 0xef , 0xdf //4 5 6

};*/

u8 data smgWela[7]={0,0,0,0,0,0,0}; //第一位到第六位,最后一個是小數點位置控制

//P0口的數碼管位選控制鎖存器只用了低6位,我們保留高2位的數據,留作它用

void displaySMG(u8* pWela)

{

u8 i=0;

//控制6位數碼管顯示函數,不顯示的位用參數dark

u8 preState=P0|0x3f; //保存高2位狀態(tài),其中最高位是ADC0804的片選信號

wela=0;dula=0;_nop_();//先鎖定數據,防止吳亮及位選鎖存器高2位數據被改變

P0=0; //由于數碼管是共陰極的,陽極送低電平,燈不亮

dula=1;_nop_();

dula=0; //段選數據清空并鎖定

P0=preState; //共陰極數碼管是陰極置高不亮,低6位置1,高2位保留

wela=1;_nop_(); //注:wela和dula上電默認為1

wela=0; //位選鎖定,初始保留高2位的數據,低6位置高不亮

for(i=0;i<6;i++) //顯示6位數碼管

{

P0=table[pWela[i]]|(((1<

dula=1;_nop_(); //送段數據,疊加小數點的顯示,0x00點亮小數點

dula=0;

P0=preState&~(1<

wela=1; _nop_(); //送位選號

wela=0;

delayms(1); //稍作延時,讓燈管亮起來

{ //消除疊影及誤亮,陰極置1不亮,低6位置1,高2位保留并鎖定

P0=preState;

wela=1; _nop_();

wela=0;

}

}

}

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
換一批
延伸閱讀

采用51單片機最小開發(fā)板,由8位自制獨立按鍵控制。單片機芯片為STC89C52RC,晶振為@12.000 mhz。8X8LED點陣屏模塊由MAX7219驅動,MAX7219包含一個自動掃描電路。你只需要把要顯示的數據發(fā)送...

關鍵字: 51單片機 MAX7219 寄存器

在嵌入式系統(tǒng)開發(fā)的廣闊領域,51單片機和STM32無疑是兩種極具代表性的微控制器。對于初學者而言,選擇學習路徑時往往會面臨一個抉擇:是直接跨越51單片機,挑戰(zhàn)更高層次的STM32,還是從51開始,逐步進階?本文旨在探討直...

關鍵字: 51單片機 STM32

在嵌入式系統(tǒng)開發(fā)中,特別是在使用8051系列單片機(簡稱C51)進行編程時,數據類型的選擇與定義對程序的性能和可讀性至關重要。C51語言在標準C語言的基礎上進行了擴展,以適應單片機特有的硬件結構和操作需求。本文將深入探討...

關鍵字: C51數據 51單片機

在嵌入式系統(tǒng)領域,51單片機作為一種經典的微控制器,廣泛應用于各種自動化控制系統(tǒng)中。其外部引腳作為單片機與外界交互的接口,承載著數據傳輸、控制信號輸出等重要功能。本文將通過對51單片機外部引腳的案例分析,結合實際代碼,深...

關鍵字: 51單片機 單片機

在電子技術的浩瀚星空中,LED(發(fā)光二極管)以其獨特的魅力成為了一顆璀璨的明星。而結合51單片機這一經典的嵌入式開發(fā)平臺,LED的應用更是被賦予了無限可能,其中,花樣流水燈便是一個生動而富有創(chuàng)意的實例。本文將帶您深入探索...

關鍵字: 51單片機 LED

在現代嵌入式系統(tǒng)設計中,51單片機作為一種經典的微控制器,憑借其豐富的功能和廣泛的應用領域,仍然受到工程師們的青睞。定時器中斷是51單片機中一個非常實用的功能,它可以在特定的時間間隔內自動觸發(fā)中斷,執(zhí)行預設的操作,從而提...

關鍵字: 51單片機 定時器

STM32與51單片機之間有什么差異呢?兩者可以說是一場科技與性能的較量了。在科技飛速發(fā)展的今天,微控制器(MCU)已廣泛應用于各類電子設備和系統(tǒng)中,發(fā)揮著舉足輕重的作用。其中,STM32和51單片機作為兩種常見的微控制...

關鍵字: STM32 51單片機 MCU

51單片機將是下述內容的主要介紹對象,通過這篇文章,小編希望大家可以對51單片機的相關情況以及信息有所認識和了解,詳細內容如下。

關鍵字: 單片機 51單片機

在嵌入式系統(tǒng)開發(fā)中,單片機是不可或缺的重要組成部分。其中,STM32單片機和51單片機是兩種常見的單片機芯片。本文將對比分析這兩種單片機的區(qū)別,并探討STM32單片機的優(yōu)勢。

關鍵字: stm32單片 51單片機

51單片機是指由美國INTEL公司生產的一系列單片機的總稱,這一系列單片機包括了許多品種,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的產品,該系列其它單片機都是在8051的基...

關鍵字: 51單片機 串行通信
關閉