當前位置:編程學習大全網 - 源碼下載 - 跪求單片機c51壹個多功能時鐘設計。要鬧鐘。調整時間、秒表、就行了。急求。。。C語言編寫

跪求單片機c51壹個多功能時鐘設計。要鬧鐘。調整時間、秒表、就行了。急求。。。C語言編寫

//給妳發壹個數碼管輸出的可調節時鐘的程序,<DS1302.H>在最後

#include <at89x52.h>

#include <DS1302.h>

//定義***陽極字型碼0123456789-

unsigned char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};

unsigned char time[]={0,0,0,0,0,0,0,0};//用來儲存時間

unsigned char date[]={0,0,0,0,0,0,0,0};//用來儲存日期

SYSTEMTIME time1; //在ds1302.h文件中已經定義了壹個名字為SYSTEMTIME的結構體,在這裏我們定義壹個變量名

//為time的SYSTEMTIME結構體

void delay(unsigned char i) //延時子程序

{

unsigned char j;

while((i--)!=0)

{

for(j=123;j>0;j--);

}

}

unsigned char button_time(n,x,y) //時鐘調整子程序

unsigned char n,x,y;

{

if(P1_7==0)

{

delay(50);

if(P1_7==0)

{

n++;

if(n==x)

n=0;

while(P1_7==0);

}

}

if(P1_5==0)

{

delay(50);

if(P1_5==0)

{

if(n==0)

n=y;

else

n--;

while(P1_5==0);

}

}

return n;

}

unsigned char button_date(n,x,y) //日期調整子程序

unsigned char n,x,y;

{

if(P1_7==0)

{

delay(50);

if(P1_7==0)

{

n++;

if(n==x)

n=1;

while(P1_7==0);

}

}

if(P1_5==0)

{

delay(50);

if(P1_5==0)

{

if(n==1)

n=y;

else

n--;

while(P1_5==0);

}

}

return n;

}

void display(second10,second1,minute10,minute1,hour10,hour1) //顯示子程序

unsigned char second10,second1,minute10,minute1,hour10,hour1;

{

P2=0xfe;

P0=dispcode[second10];//顯示秒的十位

delay(1);

P2=0xfd;

P0=dispcode[second1]; //顯示秒的個位

delay(1);

P2=0xfb;

P0=dispcode[10]; //顯示"-"

delay(1);

P2=0xf7;

P0=dispcode[minute10];//顯示分的十位

delay(1);

P2=0xef;

P0=dispcode[minute1]; //顯示分的個位

delay(1);

P2=0xdf;

P0=dispcode[10]; //顯示"-"

delay(1);

P2=0xbf;

P0=dispcode[hour10]; //顯示時的十位

delay(1);

P2=0x7f;

P0=dispcode[hour1]; //顯示時的個位

delay(1);

}

void main()

{

unsigned char flag;

Initial_DS1302(); //初始化DS1302這個時鐘芯片,

while(1)

{

DS1302_GetTime(&time1); //讀取時間參數

time[5]=(time1.Second)%10; //把秒的個位數據存入time[5]

time[4]=(time1.Second)/10; //把秒的十位數據存入time[4]

time[3]=(time1.Minute)%10; //把分的個位數據存入time[3]

time[2]=(time1.Minute)/10; //把分的十位數據存入time[2]

time[1]=(time1.Hour)%10; //把時的個位數據存入time[1]

time[0]=(time1.Hour)/10; //把時的十位數據存入time[0]

date[5]=(time1.Day)%10;

date[4]=(time1.Day)/10;

date[3]=(time1.Month)%10;

date[2]=(time1.Month)/10;

date[1]=(time1.Year)%10;

date[0]=(time1.Year)/10;

if(P1_4==0) //如果按下Time Start鍵壹下,時鐘開始正常顯示時間,再按壹下,顯示日期

{

delay(50);

if(P1_4==0)

{

flag++;

if(flag>1)

{

flag=0;

}

}

while(P1_4==0);

}

if(P1_6==0) //如果按下Time Set鍵壹下,開始顯示日期,再按壹下進入日期跟時鐘的調節模式

{

delay(50);

if(P1_6==0)

{

flag++;

if(flag>7)

{

flag=0;

}

}

while(P1_6==0);

}

switch(flag)

{

case 0:display(time[0],time[1],time[2],time[3],time[4],time[5]); //調用子函數display,把存入數組time的數據給顯示出來

break;

case 1:display(date[0],date[1],date[2],date[3],date[4],date[5]); //調用子函數display,把存入數組date的數據給顯示出來

break;

case 2:time1.Year=button_date(time1.Year,100,99); //調整年

DS1302_SetTime(0x8c,time1.Year);

display(date[0],date[1],10,10,10,10);

break;

case 3:time1.Month=button_date(time1.Month,13,12); //調整月

DS1302_SetTime(0x88,time1.Month);

display(10,10,date[2],date[3],10,10);

break;

case 4:time1.Day=button_date(time1.Day,32,31); //調整日

DS1302_SetTime(0x86,time1.Day);

display(10,10,10,10,date[4],date[5]);

break;

case 5:time1.Hour=button_time(time1.Hour,24,23); //調整時

DS1302_SetTime(0x84,time1.Hour);

display(time[0],time[1],10,10,10,10);

break;

case 6:time1.Minute=button_time(time1.Minute,60,59); //調整分

DS1302_SetTime(0x82,time1.Minute);

display(10,10,time[2],time[3],10,10);

break;

case 7:time1.Second=button_time(time1.Second,60,59); //調整秒

DS1302_SetTime(0x80,time1.Second);

display(10,10,10,10,time[4],time[5]);

break;

}

}

}

//DS1302.H

#ifndef _REAL_TIMER_DS1302_2003_7_21_

#define _REAL_TIMER_DS1302_2003_7_21_

#include <at89x52.h>

sbit DS1302_CLK = P1^0; //實時時鐘時鐘線引腳

sbit DS1302_IO = P1^1; //實時時鐘數據線引腳

sbit DS1302_RST = P1^2; //實時時鐘復位線引腳

sbit ACC0 = ACC^0;

sbit ACC7 = ACC^7;

typedef struct __SYSTEMTIME__

{

unsigned char Second;

unsigned char Minute;

unsigned char Hour;

unsigned char Week;

unsigned char Day;

unsigned char Month;

unsigned char Year;

unsigned char DateString[9];

unsigned char TimeString[9];

}SYSTEMTIME; //定義的時間類型

#define AM(X) X

#define PM(X) (X+12) // 轉成24小時制

#define DS1302_SECOND 0x80 //秒寄存器

#define DS1302_MINUTE 0x82 //分寄存器

#define DS1302_HOUR 0x84

#define DS1302_WEEK 0x8A

#define DS1302_DAY 0x86

#define DS1302_MONTH 0x88

#define DS1302_YEAR 0x8C

#define DS1302_RAM(X) (0xC0+(X)*2) //用於計算 DS1302_RAM 地址的宏

void DS1302InputByte(unsigned char d) //實時時鐘寫入壹字節(內部函數)

{

unsigned char i;

ACC = d;

for(i=8; i>0; i--)

{

DS1302_IO = ACC0; //相當於匯編中的 RRC

DS1302_CLK = 1;

DS1302_CLK = 0; //發壹個高跳變到低的脈沖

ACC = ACC >> 1;

}

}

unsigned char DS1302OutputByte(void) //實時時鐘讀取壹字節(內部函數)

{

unsigned char i;

for(i=8; i>0; i--)

{

ACC = ACC >>1; //相當於匯編中的 RRC

ACC7 = DS1302_IO;

DS1302_CLK = 1;

DS1302_CLK = 0; //發壹個高跳變到低的脈沖

}

return(ACC);

}

void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要寫的數據

{

DS1302_RST = 0;

DS1302_CLK = 0;

DS1302_RST = 1;

DS1302InputByte(ucAddr); // 地址,命令

DS1302InputByte(ucDa); // 寫1Byte數據

DS1302_CLK = 1;

DS1302_RST = 0; //RST 0->1->0,CLK 0->1

}

unsigned char Read1302(unsigned char ucAddr) //讀取DS1302某地址的數據

{

unsigned char ucData;

DS1302_RST = 0;

DS1302_CLK = 0;

DS1302_RST = 1; //enable

DS1302InputByte(ucAddr|0x01); // 地址,命令

ucData = DS1302OutputByte(); // 讀1Byte數據

DS1302_CLK = 1; //RST 0->1->0,CLK 0->1

DS1302_RST = 0;

return(ucData);

}

void DS1302_SetProtect(bit flag) //是否寫保護

{

if(flag)

Write1302(0x8E,0x10); //WP=1,不能寫入

else

Write1302(0x8E,0x00);//WP=0,可以寫入

}

void DS1302_SetTime(unsigned char Address, unsigned char Value) // 設置時間函數

{

DS1302_SetProtect(0);

Write1302(Address, ((Value/10)<<4 | (Value%10))); //高4位為十位,低4位為個位

}

void DS1302_GetTime(SYSTEMTIME *Time)

{

unsigned char ReadValue;

ReadValue = Read1302(DS1302_SECOND);

Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//轉換成10進制的秒

ReadValue = Read1302(DS1302_MINUTE);

Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);

ReadValue = Read1302(DS1302_HOUR);

Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);

ReadValue = Read1302(DS1302_DAY);

Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);

ReadValue = Read1302(DS1302_WEEK);

Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);

ReadValue = Read1302(DS1302_MONTH);

Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);

ReadValue = Read1302(DS1302_YEAR);

Time->Year = ((ReadValue&0xf0)>>4)*10 + (ReadValue&0x0F);

}

/*

void DateToStr(SYSTEMTIME *Time)

{

Time->DateString[0] = Time->Year/10 + '0'; //數字類型轉化為字符類型

Time->DateString[1] = Time->Year%10 + '0';

Time->DateString[2] = '-';

Time->DateString[3] = Time->Month/10 + '0';

Time->DateString[4] = Time->Month%10 + '0';

Time->DateString[5] = '-';

Time->DateString[6] = Time->Day/10 + '0';

Time->DateString[7] = Time->Day%10 + '0';

Time->DateString[8] = '\0';

}

void TimeToStr(SYSTEMTIME *Time)

{

Time->TimeString[0] = Time->Hour/10 + '0'; //數字類型轉化為字符類型

Time->TimeString[1] = Time->Hour%10 + '0';

Time->TimeString[2] = ':';

Time->TimeString[3] = Time->Minute/10 + '0';

Time->TimeString[4] = Time->Minute%10 + '0';

Time->TimeString[5] = ':';

Time->TimeString[6] = Time->Second/10 + '0';

Time->TimeString[7] = Time->Second%10 + '0';

Time->DateString[8] = '\0';

}

*/

void Initial_DS1302(void)

{

unsigned char Second=Read1302(DS1302_SECOND);

if(Second&0x80) //如果第七為1(表明沒有啟動), 則啟動時鐘

DS1302_SetTime(DS1302_SECOND,0);

}

/********************************************************************************

void BurstWrite1302(unsigned char *pWClock) //往DS1302寫入時鐘數據(多字節方式)

{

unsigned char i;

Write1302(0x8e,0x00); // 控制命令,WP=0,寫操作?

DS1302_RST = 0;

DS1302_CLK = 0;

DS1302_RST = 1;

DS1302InputByte(0xbe); // 0xbe:時鐘多字節寫命令

for (i = 8; i>0; i--) //8Byte = 7Byte 時鐘數據 + 1Byte 控制

{

DS1302InputByte(*pWClock); // 寫1Byte數據

pWClock++;

}

DS1302_CLK = 1;

DS1302_RST = 0;

}

void BurstRead1302(unsigned char *pRClock) //讀取DS1302時鐘數據(時鐘多字節方式)

{

unsigned char i;

DS1302_RST = 0;

DS1302_CLK = 0;

DS1302_RST = 1;

DS1302InputByte(0xbf); // 0xbf:時鐘多字節讀命令

for (i=8; i>0; i--)

{

*pRClock = DS1302OutputByte(); // 讀1Byte數據

pRClock++;

}

DS1302_CLK = 1;

DS1302_RST = 0;

}

void DS1302_TimeStop(bit flag) // 是否將時鐘停止

{

unsigned char Data;

Data=Read1302(DS1302_SECOND);

DS1302_SetProtect(0);

if(flag)

Write1302(DS1302_SECOND, Data|0x80);//停止

else

Write1302(DS1302_SECOND, Data&0x7F);不停止

}

********************************************************************************/

#endif

  • 上一篇:linux系統制作制作linux的軟件
  • 下一篇:本人想買捷豹XF,有幾個問題想請教有XF的朋友們!(有分答得滿意追加分!)
  • copyright 2024編程學習大全網