加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入

基于51單片機(jī)的實(shí)時(shí)時(shí)鐘設(shè)計(jì)

09/13 08:11
2548
服務(wù)支持:
技術(shù)交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗(yàn)、收獲成長和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購買后不支持退換且無法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論
放大
實(shí)物圖
相關(guān)方案
  • 方案介紹
  • 相關(guān)文件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

功能:

通過8位數(shù)碼管實(shí)現(xiàn)實(shí)時(shí)時(shí)鐘,可以設(shè)置時(shí)間,切換顯示模式,顯示年月日,時(shí)分秒信息;可通過按鍵修改信息,增加、減少、確定、取消、上一個(gè)、下一個(gè)、切換模式、設(shè)置等功能。

時(shí)分秒

3ef97254e9aa404cb42226dbc4659700.png

年月日:

bbbd5c778d7c4769b1c8d4c2f3829e32.png

部分程序:

#include <reg51.h>

#include "MAX7221.h"

#include "DS1302.h"

void InitTimer0(void);?????????? //定時(shí)器T0初始化函數(shù)

void Disp(void);???????????????? //時(shí)間顯示函數(shù)

void SSetTime(unsigned char n,unsigned char m,unsigned char *readvalue,unsigned char *Cflag);? //用戶設(shè)置時(shí)間函數(shù)

void Delay(unsigned char time);? //延時(shí)函數(shù)

void SDisp(unsigned char n);???? //設(shè)置時(shí)間,數(shù)碼管閃爍函數(shù)

sbit Next=P1^0;????????????????? //“下一個(gè)”按鈕

sbit Pre=P1^1;?????????????????? //“上一個(gè)”按鈕

sbit ADD=P1^2;?????????????????? //“增加”按鈕

sbit SUB=P1^3;?????????????????? //“減少”按鈕

sbit SET=P1^4;?????????????????? //“確定”按鈕

sbit Cancel=P1^5;???? ???????????//“取消”按鈕

sbit LED=P2^6;?????????????????? //設(shè)置指示燈

SYSTEMTIME CurrentTime;????????? //時(shí)間日期類型

signed char DispBuf[16];???????? //存放時(shí)間日期的個(gè)位與十位

unsigned char DISPCODE[]={0,1,2,3,4,5,6,7,8,9,0x0A,0x0F};?? //數(shù)碼管顯示數(shù)組,0x0A數(shù)碼管顯示“-”,0x0F數(shù)碼管不顯示

unsigned int? count=1200;???????? //用于設(shè)定時(shí)間/日期在數(shù)碼管上的顯示時(shí)間

unsigned char DisFlag=0;???????? //顯示標(biāo)志,0位時(shí)間顯示,1位日期顯示

unsigned char SetFlag=0;???????? //設(shè)置標(biāo)志

void main(void)

{

InitTimer0();????????????????? //定時(shí)器初始化

Init_Max7221(0xFF,0x0A,0x07,0x01);//MAX7221初始化

Init_DS1302();???????????????? //DS1302初始化;注:1 Warning,由于在中斷0中也調(diào)用了SetTime()函數(shù),所以有一個(gè)警告,可忽略警告;如果你將其注釋掉,會出現(xiàn)新的警告,因?yàn)槟阍贒S1302中寫了Init_DS1302()函數(shù),而你沒有調(diào)用;標(biāo)準(zhǔn)是一定要調(diào)用Init_DS1302()函數(shù)的

IT0=1;???????????????????????? //設(shè)置中斷INT0

EX0=1;

IT1=1;???????????????????????? //設(shè)置中斷INT1

EX1=1;

EA=1;

LED=0;???????????????????????? //設(shè)置指示燈為滅的狀態(tài)

while(1)

{

Disp();????????????????????? //顯示時(shí)間/日期

Delay(10);

}

return;

}

//時(shí)間/日期顯示函數(shù)

void Disp(void)

{

GetTime(&CurrentTime);?????????????????? //獲取時(shí)間/日期

if(DisFlag==0)???????? ??????????????????//判斷是不是顯示時(shí)間

{

DispBuf[7]=(CurrentTime.Second)%10;??? //秒的個(gè)位

DispBuf[6]=(CurrentTime.Second)/10;??? //秒的十位

DispBuf[5]=10;???????????????????????? //“-”

DispBuf[4]=(CurrentTime.Minute)%10;??? //分的個(gè)位

DispBuf[3]=(CurrentTime.Minute)/10;??? //分的十位

DispBuf[2]=10;?????????????????????? //“-”

DispBuf[1]=(CurrentTime.Hour)%10;????? //時(shí)的個(gè)位

DispBuf[0]=(CurrentTime.Hour)/10;????? //時(shí)的十位

}

else if(DisFlag==1)

{

DispBuf[7]=(CurrentTime.Day)%10;?????? //日的個(gè)位

DispBuf[6]=(CurrentTime.Day)/10;?????? //日的十位

DispBuf[5]=10;???????????????????????? //“-”

DispBuf[4]=(CurrentTime.Month)%10;???? //月的個(gè)位

DispBuf[3]=(CurrentTime.Month)/10;???? //月的十位

DispBuf[2]=10;???????????????????????? //“-”

DispBuf[1]=(CurrentTime.Year)%10;????? //年的個(gè)位

DispBuf[0]=(CurrentTime.Year)/10;?????? ???? //年的十位

}

Wr_Max7221(0x08,DISPCODE[DispBuf[7]]);?? //顯示秒的個(gè)位或日的個(gè)位

Wr_Max7221(0x07,DISPCODE[DispBuf[6]]);?? //顯示秒的十位或日的十位

Wr_Max7221(0x06,DISPCODE[DispBuf[5]]);?? //顯示“-”

Wr_Max7221(0x05,DISPCODE[DispBuf[4]]);?? //顯示分的個(gè)位或月的個(gè)位

Wr_Max7221(0x04,DISPCODE[DispBuf[3]]);?? //顯示分的十位或月的十位

Wr_Max7221(0x03,DISPCODE[DispBuf[2]]);?? //顯示“-”

Wr_Max7221(0x02,DISPCODE[DispBuf[1]]);?? //顯示時(shí)的個(gè)位或年的個(gè)位

Wr_Max7221(0x01,DISPCODE[DispBuf[0]]);?? //顯示時(shí)的十位或年的十位

}

//T0定時(shí)器初始化子程序

void InitTimer0(void)

{

TMOD=0x01;???????????????? //工作方式1

TH0=(65536-50000)/256;???? //定時(shí)時(shí)間為0.5ms

TL0=(65536-50000)%256;

EA=1;????????????????????? //開總中斷

ET0=1;???????????????????? //允許定時(shí)器T0中斷

TR0=1;???????? ????????????//打開定時(shí)器T0

}

//T0定時(shí)器服務(wù)子程序

void Timer0(void) interrupt 1

{

TR0=0;???????????????????? //關(guān)定時(shí)器T0

TH0=(65536-50000)/256;???? //重載初值

TL0=(65536-50000)%256;

count--;

if(count==0)?????????????? //count*0.5ms定時(shí)到

{

if(DisFlag==0)?????????? //如果上一個(gè)是顯示時(shí)間

{

DisFlag=1;?????????? //改為顯示日期

count=100;?????????? //顯示5s

}

else if(DisFlag==1)

{

count=1200;???????????? //顯示60s

DisFlag=0;???????????? //改為顯示時(shí)間

}

}

TR0=1;???????????????????? //打開定時(shí)器T0

}

SetFlag=0;???????????????????????? //清除設(shè)置標(biāo)志

break;???????????????????????????? //退出設(shè)置模式

}

if(Next==0)? n=n-1;?????????????????? //“下一個(gè)”按鈕按下時(shí),某數(shù)據(jù)設(shè)置位標(biāo)志減1

if(n<=0)???? n=6;???????????????????? //若到達(dá)0時(shí),回到6設(shè)置

if(Pre==0)?? n=n+1;?????????????????? //“上一個(gè)”按鈕按下時(shí),某數(shù)據(jù)設(shè)置位標(biāo)志加1

if(n>=7)???? n=1;???????????????????? //若到達(dá)0時(shí),回到6設(shè)置

if(ADD==0)?? m=1;???????????????????? //“增加”按鈕按下時(shí),設(shè)置增加標(biāo)志

if(SUB==0)?? m=2;???????????????????? //“減少”按鈕按下時(shí),設(shè)置減少標(biāo)志

if((Next==0)||(ADD==0)||(SUB==0))???? //判斷是否有“下一個(gè)”按鈕或“增加”按鈕或“減少”按鈕按下

{

Delay(50);???????????????????????? //延時(shí)(給一定的釋放按鈕時(shí)間)

SSetTime(n,m,readvalue,&Cflag);??? //進(jìn)入相關(guān)的設(shè)置

}

SDisp(n); ????????????????????????????//顯示

m=0;????????????????????????????????? //清除“增加”或“減少”標(biāo)志

}

LED=0;?????????????????????????????????? //設(shè)置完畢,關(guān)設(shè)置指示燈

count=1200;?????????????????????????????? //設(shè)置完畢后,“時(shí)間”顯示的60s

DisFlag=0;?????????????????????????????? //顯示“時(shí)間”

EA=1;??????????????????????????????????? //開總中斷

}

//時(shí)間日期變化子函數(shù)

void SSetTime(unsigned char n,unsigned char m,signed char *readvalue,signed char* Cflag)

{

if(m==1)?????????????????????????????????????? //設(shè)置值增加

{

if(n==6)?????????????????????? ??????????????//年增加

{

*Cflag|=0x01;???????????????????????????? //年值變化標(biāo)志

readvalue[5]=readvalue[5]+1;????????????? //年值加1

if(readvalue[5]>=100)? readvalue[5]=00;?? //判斷是否大于99,若是,將其設(shè)置為0

DispBuf[0]=readvalue[5]/10;?????????????? //保存年的十位

DispBuf[1]=readvalue[5]%10;????????????? ?????????? //保存年的個(gè)位

}

else if(n==5)??????????????????????????????? //月增加

{

 

  • 有需要資料的可了解一下.docx

相關(guān)推薦

電子產(chǎn)業(yè)圖譜