當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]//串行數(shù)碼管顯示 年-月-日 時(shí)-分-秒//芯片 ATMEGA16L //時(shí)鐘 4MHz 內(nèi)部 // DS1302 上升沿讀寫(xiě)數(shù)據(jù) // DS1302 讀數(shù)據(jù)時(shí) IO口上拉無(wú)效 //短延時(shí) 2us wait(); 長(zhǎng)延時(shí) n ms delay_nms(); #include//164數(shù)據(jù)線置1

//串行數(shù)碼管顯示 年-月-日 時(shí)-分-秒

//芯片 ATMEGA16L
//時(shí)鐘 4MHz 內(nèi)部
// DS1302 上升沿讀寫(xiě)數(shù)據(jù)
// DS1302 讀數(shù)據(jù)時(shí) IO口上拉無(wú)效
//短延時(shí) 2us wait(); 長(zhǎng)延時(shí) n ms delay_nms();
#include

//164數(shù)據(jù)線置1
#define hc164_data_SET PORTD |= 0x01
//164數(shù)據(jù)線清0
#define hc164_data_CLR PORTD &= ~0x01
//164時(shí)鐘線置1
#define hc164_clk_SET PORTD |= 0x02
//164時(shí)鐘線清0
#define hc164_clk_CLR PORTD &= ~0x02

void hc164_send_byte (unsigned char byte); //164發(fā)送數(shù)據(jù)子程序
void delay_nms(unsigned int); //延時(shí) n ms
void wait(void); //短延時(shí) 2us

/*--------------------------DS1302程序開(kāi)始----------------------------------*/
#define SCLK1302 4 // 時(shí)鐘
#define DATA1302 5 // 數(shù)據(jù)
#define RST1302 6 // 復(fù)位
//時(shí)鐘線置1
#define SET_SCLK1302 PORTD |= (1<//時(shí)鐘線清0
#define CLR_SCLK1302 PORTD &= ~(1<//數(shù)據(jù)線置1
#define SET_DATA1302 PORTD |= (1<TA1302)
//數(shù)據(jù)線清0
#define CLR_DATA1302 PORTD &= ~(1<TA1302)
//復(fù)位線置1
#define SET_RST1302 PORTD |= (1<//復(fù)位線清0
#define CLR_RST1302 PORTD &= ~(1<//DS1302的數(shù)據(jù)線DATA置為輸出
#define DATA1302_OUT DDRD |= (1<TA1302)
//DS1302的數(shù)據(jù)線DATA置為輸入
#define DATA1302_IN DDRD &= ~(1<TA1302)

void wr1302(unsigned char dat); //向1302寫(xiě)1個(gè)字節(jié)
unsigned char rd1302(void); //從1302讀1個(gè)字節(jié)
void v_wr1302(unsigned char add,unsigned char dat); //先寫(xiě)地址,后寫(xiě)1字節(jié)數(shù)據(jù)
unsigned char v_rd1302(unsigned char add); //先寫(xiě)地址,后讀1字節(jié)數(shù)據(jù)
void v_set1302(unsigned char *p2); //設(shè)置初始時(shí)間
void v_get1302(void); //讀取DS1302當(dāng)前時(shí)間
/* --------------------DS1302程序結(jié)束-------------------------------------- */
char ledxs[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
// 年-月-日 或 時(shí)-分-秒 LED顯示
char time[7]; //當(dāng)前時(shí)間,格式: 秒 分 時(shí) 日 月 星期 年
char settime[7]={0x00,0x39,0x21,0x28,0x01,0x04,0x10};
//時(shí)間初始值: 秒 分 時(shí) 日 月 星期 年
const char tab[]={0xb7,0x12,0x67,0x76,0xd2,0xf4,0xf5,0x16,0xf7,0xf6,0xd7,0xf1,0xa5,0x73,0xe5,0xc5,0,0xff,0x40};
//共陰極代碼 0-F, 全滅,全亮,‘-’
void main(void)
{
unsigned char i,k;
wait();
wait();
delay_nms(200);
DDRD = 0xff;
v_set1302(settime); // 設(shè)置初始時(shí)間
while(1)
{
k=30;
while(k>0) //年-月-日 顯示3秒 (例 09-06-04 )
{
v_get1302(); //取得當(dāng)前時(shí)間
ledxs[0]=time[6]>>4;
ledxs[1]=time[6]&0x0f; // 年
ledxs[2]=18; // -
ledxs[3]=time[4]>>4;
ledxs[4]=time[4]&0x0f; // 月
ledxs[5]=18; // -
ledxs[6]=time[3]>>4;
ledxs[7]=time[3]&0x0f; // 日
for(i=0;i<8;i++) //串行顯示
{
hc164_send_byte ( tab[ledxs[i]] );
wait();
}
k--;
delay_nms(100);
}
k=100;
while(k>0) //時(shí)-分-秒 顯示10秒 (例 16-30-00 )
{
v_get1302(); //取得當(dāng)前時(shí)間
ledxs[0]=time[2]>>4;
ledxs[1]=time[2]&0x0f; // 時(shí)
ledxs[2]=18; // -
ledxs[3]=time[1]>>4;
ledxs[4]=time[1]&0x0f; // 分
ledxs[5]=18; // -
ledxs[6]=time[0]>>4;
ledxs[7]=time[0]&0x0f; // 秒
for(i=0;i<8;i++) //串行顯示
{
hc164_send_byte ( tab[ledxs[i]] );
wait();
}
k--;
delay_nms(100);
}
}
}
void wait(void) //短延時(shí) 2us
{
asm("nop");
asm("nop");
}
void delay_nms(unsigned int k) //延時(shí) n ms
{
while(k) //4M晶振,一個(gè)循環(huán)1ms
{
int i;
i=700;
while(i--);
k=k-1;
}
}
void hc164_send_byte (unsigned char byte) //164發(fā)送數(shù)據(jù)子程序
{
unsigned char i;
for(i=0;i<8;i++)
{
if( byte & ( 1 << i ))
hc164_data_SET;
else
hc164_data_CLR;
hc164_clk_SET;
hc164_clk_CLR;
}
}
void wr1302(unsigned char dat0) //向1302寫(xiě)1個(gè)字節(jié)
{
unsigned char i;
for(i=0;i<8;i++) //從最低位開(kāi)始發(fā)送
{
if(dat0&0x01)
SET_DATA1302;
else
CLR_DATA1302; //位傳送至數(shù)據(jù)總線
wait();
SET_SCLK1302; //時(shí)鐘上升沿,發(fā)送數(shù)據(jù)有效
wait();
CLR_SCLK1302; //清時(shí)鐘總線
wait();
dat0 >>= 1;
}
}
unsigned char rd1302(void) //從1302讀1個(gè)字節(jié)
{
unsigned char i,dat=0;
for(i=0;i<8;i++) //從最低位開(kāi)始接收
{
dat >>= 1;
if((PIND&(1<TA1302))==(1<TA1302)) dat |= 0x80; //接收1位數(shù)據(jù)
SET_SCLK1302;;//時(shí)鐘置高電平 ,時(shí)鐘上降沿,接收數(shù)據(jù)有效
wait();
CLR_SCLK1302;//清時(shí)鐘總線
wait();
}
return dat;
}
void v_wr1302(unsigned char add,unsigned char dat)//先寫(xiě)地址,后寫(xiě)1字節(jié)數(shù)據(jù)
{ // 地址或命令 數(shù)據(jù)

DATA1302_OUT; //DATA1302置為輸出
CLR_RST1302;//復(fù)位引腳低電平,所有數(shù)據(jù)傳送終止
wait();
CLR_SCLK1302;//清時(shí)鐘總線
wait();
SET_RST1302;//復(fù)位引腳高電平,控制邏輯有效
wait();
wr1302(add); //寫(xiě)地址或命令
wait();
wr1302(dat); //寫(xiě)1個(gè)數(shù)據(jù)
wait();
CLR_RST1302; //復(fù)位引腳低電平,所有數(shù)據(jù)傳送終止
wait();
DATA1302_IN; // DATA1302置為輸入
}
unsigned char v_rd1302(unsigned char add) //先寫(xiě)地址,后讀1字節(jié)數(shù)據(jù)
{ // 地址
unsigned char i;
DATA1302_OUT; //DATA1302置為輸出
CLR_RST1302;//復(fù)位引腳低電平,所有數(shù)據(jù)傳送終止
wait();
CLR_SCLK1302;//清時(shí)鐘總線
wait();
SET_RST1302;//復(fù)位引腳高電平,控制邏輯有效
wait();
wr1302(add); //寫(xiě)地址或命令
wait();
PORTD &= ~(1 << DATA1302); //上拉無(wú)效
DATA1302_IN; // DATA1302置為輸入
wait();
i=rd1302(); //讀取數(shù)據(jù)
wait();
CLR_RST1302; //復(fù)位引腳低電平,所有數(shù)據(jù)傳送終止
wait();
return i; //返回讀取的數(shù)據(jù)
}

/********************************************************************
* 名稱: v_set1302
* 功能: 設(shè)置初始時(shí)間
* 調(diào)用: v_wr1302()
* 輸入: *p2: 初始時(shí)間地址。初始時(shí)間格式為: 秒 分 時(shí) 日 月 星期 年
* 7Byte (BCD碼)
***********************************************************************/
void v_set1302(unsigned char *p2)
{
unsigned char i;
unsigned char addr=0x80;
v_wr1302(0x8e,0x00); //控制命令,WP=0,允許寫(xiě)
for(i=0;i<7;i++)
{
v_wr1302(addr,*p2); // 秒 分 時(shí) 日 月 星期 年
p2++;
addr=addr+2;
}
v_wr1302(0x8e,0x80); // 控制命令,WP=1,寫(xiě)保護(hù)
}
/********************************************************************
* 名稱: v_get1302
* 功能: 讀取DS1302當(dāng)前時(shí)間
* 調(diào)用: v_rd1302()
* 輸入: time: 保存當(dāng)前時(shí)間地址。當(dāng)前時(shí)間格式為: 秒 分 時(shí) 日 月 星期 年
* 7Byte (BCD碼)
***********************************************************************/
void v_get1302(void)
{
unsigned char i;
unsigned char addr=0x81;
for(i=0;i<7;i++)
{
time[i]=v_rd1302(addr); //格式為: 秒 分 時(shí) 日 月 星期 年
addr=addr+2;
}
}

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

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉