国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

51單片機(jī)——DS1302可調(diào)時(shí)鐘

這篇具有很好參考價(jià)值的文章主要介紹了51單片機(jī)——DS1302可調(diào)時(shí)鐘。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

一、功能介紹

二、主要模塊介紹

2.1 DS1302模塊

2.1.1 DS1302芯片介紹

2.1.2? DS1302的使用

三、程序匯總

3.1測(cè)試文件test.c

3.2 LCD1602模塊程序

3.2.1 LCD1602.h

3.2.2 LCD1602.c

3.3 DS1302模塊程序

3.3.1 DS1302.h

3.3.2 DS1302.c

3.4 獨(dú)立按鍵模塊程序

3.4.1?Independentkey.h

3.4.2?Independentkey.c

3.5 T0定時(shí)器模塊

3.5.1 Timer0_Iint.h

3.5.2?Timer0_Iint.c

3.6 延時(shí)函數(shù)

3.6.1 Delay.h

3.6.2?Delay.c

四、效果演示


一、功能介紹

?????在LCD1602上顯示時(shí)鐘,其中的年,月,日和時(shí)鐘,分鐘,秒鐘還有星期都是可調(diào)的。

二、主要模塊介紹

2.1 DS1302模塊

為什么要用DS1302芯片來(lái)計(jì)時(shí)呢?定時(shí)器不可以嗎?

  • 首先,用單獨(dú)的芯片完成計(jì)時(shí)功能比用定時(shí)器中斷更加的精準(zhǔn)。DS1302內(nèi)置了單獨(dú)的晶振,頻率為32.769KHz,32769=2^15,經(jīng)過(guò)15次2分頻,得到1Hz頻率,也就是每計(jì)數(shù)一次就是1秒鐘。
  • 再者,不影響CPU的性能。只需要把設(shè)置的時(shí)間寫入到DS1302的寄存器中,就可以開始計(jì)時(shí)了,獲取時(shí)間也是一樣,只需要通過(guò)DS1302的I/O口把時(shí)間數(shù)據(jù)讀到單片機(jī)的內(nèi)存中就可以了。

2.1.1 DS1302芯片介紹

? ? ? ?單片機(jī)的CPU三個(gè)引腳分別連接DS1302的使能端CE、數(shù)據(jù)輸入/輸出端I/O、串行時(shí)鐘端SCLK三個(gè)端口。

  • VCC2:主電源引腳
  • VCC1:備用電源
  • X1、X2:DS1302 外部晶振引腳,通常需外接 32.768K 晶振
  • GND:電源地
  • CE:使能引腳,也是復(fù)位引腳(新版本功能變)。
  • I/O:串行數(shù)據(jù)引腳,數(shù)據(jù)輸出或者輸入都從這個(gè)引腳
  • SCLK:串行時(shí)鐘引腳?

51單片機(jī)——DS1302可調(diào)時(shí)鐘

2.1.2? DS1302的使用

????????操作 DS1302 的大致過(guò)程,就是將各種數(shù)據(jù)寫入 DS1302 的寄存器,以設(shè)置 它當(dāng)前的時(shí)間的格式。然后使 DS1302 開始運(yùn)作,DS1302 時(shí)鐘會(huì)按照設(shè)置情況 運(yùn)轉(zhuǎn),再用單片機(jī)將其寄存器內(nèi)的數(shù)據(jù)讀出。

1.日歷/時(shí)鐘寄存器

????????DS1302 共有 12 個(gè)寄存器,其中有 7 個(gè)與日歷、時(shí)鐘相關(guān),存放的數(shù)據(jù)為 BCD 碼形式。

51單片機(jī)——DS1302可調(diào)時(shí)鐘

2.控制命令字

????????命令字簡(jiǎn)單來(lái)說(shuō)就是,控制時(shí)鐘寄存器的讀寫。比如要寫入秒鐘,那么操作的命令字就是0x80對(duì)應(yīng)上面圖中的80h;要讀出秒鐘,操作的命令字是0x81,對(duì)應(yīng)81h。以此類推,可以控制所有時(shí)鐘數(shù)據(jù)的讀寫。

51單片機(jī)——DS1302可調(diào)時(shí)鐘

?3.時(shí)序圖

????????上面是單字節(jié)讀,下面是單字節(jié)寫。根據(jù)時(shí)序圖來(lái)寫入數(shù)據(jù)和讀出數(shù)據(jù)。

????????單字節(jié)寫,是把單片機(jī)內(nèi)存里的數(shù)據(jù),也就是把定義的變量寫入DS1302的寄存器中。有兩個(gè)變量,一個(gè)是要操作的命令字(寫秒鐘還是寫分鐘...),另一個(gè)是要寫入的數(shù)據(jù)。

  1. 初始化時(shí)CE=0;SCLK=0。
  2. 使能端CE=1;先SCLK=1由0->1,再SCLK=0由1->0,模擬一個(gè)寫入脈沖周期。
  3. 命令字和數(shù)據(jù)寫入完成后要把使能端CE=0;SCLK=0。

????????單字節(jié)讀,分兩個(gè)過(guò)程,一個(gè)是寫入命令字,一個(gè)是讀出數(shù)據(jù)。

  1. 初始化時(shí)CE=0;SCLK=0。
  2. 同樣也是使能端CE=1;SCLK先置0(因?yàn)槌跏蓟臅r(shí)候SCLK=0,這里置0是方便循環(huán)),再置1,模擬上升沿信號(hào),寫入控制字。讀出數(shù)據(jù)時(shí)SCLK先置1(這里也是方便循環(huán)),再置0,模擬下降沿信號(hào)。
  3. 命令字和數(shù)據(jù)寫入完成后要把使能端CE=0;SCLK=0。

????????單字節(jié)讀寫中,SCLK的設(shè)置方式不同,主要是因?yàn)闀r(shí)序脈沖的不同,單字節(jié)讀只有15個(gè)脈沖,單字節(jié)寫有16個(gè)脈沖,平均分成命令字寫和數(shù)據(jù)的讀/寫兩部分。

51單片機(jī)——DS1302可調(diào)時(shí)鐘

三、程序匯總

3.1測(cè)試文件test.c

#include <REGX52.H>
#include"LCD1602.h"
#include"DS1302.h"
#include"Independentkey.h"
#include"Timer0_Init.h"
unsigned char count;
unsigned char flash;
void showtime()
{
		LCD_ShowNum(1,1,DS1302_time[0],2);
		LCD_ShowString(1,3,"-");
		LCD_ShowNum(1,4,DS1302_time[1],2);
		LCD_ShowString(1,6,"-");
		LCD_ShowNum(1,7,DS1302_time[2],2);
		LCD_ShowNum(2,1,DS1302_time[3],2);
		LCD_ShowString(2,3,":");
		LCD_ShowNum(2,4,DS1302_time[4],2);
		LCD_ShowString(2,6,":");
		LCD_ShowNum(2,7,DS1302_time[5],2);
		LCD_ShowString(2,10,"week:");
		LCD_ShowNum(2,15,DS1302_time[6],1);
}
void num_flash()
{
		if(count==0){if(flash==0){LCD_ShowString(1,1,"  ");}
					if(flash!=0){LCD_ShowNum(1,1,DS1302_time[count],2);}
					LCD_ShowNum(2,15,DS1302_time[6],1);}
		if(count==1){if(flash==0){LCD_ShowString(1,4,"  ");}
					if(flash!=0){LCD_ShowNum(1,4,DS1302_time[count],2);}
					LCD_ShowNum(1,1,DS1302_time[0],2);}
		if(count==2){if(flash==0){LCD_ShowString(1,7,"  ");}
					if(flash!=0){LCD_ShowNum(1,7,DS1302_time[count],2);}
					LCD_ShowNum(1,4,DS1302_time[1],2);}
		if(count==3){if(flash==0){LCD_ShowString(2,1,"  ");}
					if(flash!=0){LCD_ShowNum(2,1,DS1302_time[count],2);}
					LCD_ShowNum(1,7,DS1302_time[2],2);}
		if(count==4){if(flash==0){LCD_ShowString(2,4,"  ");}
					if(flash!=0){LCD_ShowNum(2,4,DS1302_time[count],2);}
					LCD_ShowNum(2,1,DS1302_time[3],2);}
		if(count==5){if(flash==0){LCD_ShowString(2,7,"  ");}
					if(flash!=0){LCD_ShowNum(2,7,DS1302_time[count],2);}
					LCD_ShowNum(2,4,DS1302_time[4],2);}
		if(count==6){if(flash==0){LCD_ShowString(2,15," ");}
					if(flash!=0){LCD_ShowNum(2,15,DS1302_time[count],1);}
					LCD_ShowNum(2,7,DS1302_time[5],2);}	
}
//定時(shí)500ms中斷
void Timer0_ISR() interrupt 1
{	
	static int num=0;
	num++;
	TH0=0xfc;
	TL0=0x18;
	if(num==500)//每隔500ms閃爍一下
	{
		num=0;
		flash=!flash;	
	} 
}
void setlimit()
{
	//年:2000-2099年
	if(DS1302_time[0]>99){DS1302_time[0]%=100;}
	if(DS1302_time[0]<0){DS1302_time[0]=99;}
	//月:1-12月
	if(DS1302_time[1]>12){DS1302_time[1]%=13;DS1302_time[1]++;}
	if(DS1302_time[1]<1){DS1302_time[1]=12;}
	//日:分閏年二月,分大小月
	if(DS1302_time[0]%4==0)//閏年二月 1-29號(hào)
		{
			if(DS1302_time[1]==2)
			{
				if(DS1302_time[2]>29){DS1302_time[2]%=30;DS1302_time[2]++;}
				if(DS1302_time[2]<1){DS1302_time[2]=29;}
			}
		}
	if(DS1302_time[0]%4!=0)//不是閏年的二月 1-28號(hào)
		{
			if(DS1302_time[1]==2)
			{
				if(DS1302_time[2]>28){DS1302_time[2]%=29;DS1302_time[2]++;}
				if(DS1302_time[2]<1){DS1302_time[2]=28;}
			}
		}
		//大月: 1,3,5,7,8,10,12	  1-31號(hào)
	if(DS1302_time[1]==1||DS1302_time[1]==3||DS1302_time[1]==5||DS1302_time[1]==7||DS1302_time[1]==8||DS1302_time[1]==10||DS1302_time[1]==12)
		{
			 if(DS1302_time[2]>31){DS1302_time[2]%=32;DS1302_time[2]++;}
			 if(DS1302_time[2]<1){DS1302_time[2]=31;}
		}
		//小月:4,6,9,11	 1-30號(hào)
	if(DS1302_time[1]==4||DS1302_time[1]==6||DS1302_time[1]==9||DS1302_time[1]==11)
	{
		if(DS1302_time[2]>30){DS1302_time[2]%=31;DS1302_time[2]++;}
		if(DS1302_time[2]<1){DS1302_time[2]=30;}
	}
	//時(shí)鐘  0-23
	if(DS1302_time[3]>23){DS1302_time[3]%=24;}
	if(DS1302_time[3]<0){DS1302_time[3]=23;}
	//分鐘  0-59
	if(DS1302_time[4]>59){DS1302_time[4]%=60;}
	if(DS1302_time[4]<0){DS1302_time[4]=59;}
	//秒鐘  0-59
	if(DS1302_time[5]>59){DS1302_time[5]%=60;}
	if(DS1302_time[5]<0){DS1302_time[5]=59;}
	//星期  1-7
	if(DS1302_time[6]>7){DS1302_time[6]%=7;}
	if(DS1302_time[6]<1){DS1302_time[6]=7;}
}
int main()
{
	unsigned char keynum=0;
	unsigned char mode=0;
	LCD_Init();
	DS1302_Init();
	settime();
	Timer0_Init();
	while(1)
	{	
		keynum=Independentkey();		
		if(keynum!=0)
		{
			if(keynum==1)//選擇位
			{
				count++;
				if(count>=7)
				{
					count=0;
				}
			}
			if(keynum==2)//加一
			{
				DS1302_time[count]++;
				setlimit();//對(duì)DS1302_time[count]進(jìn)行調(diào)整
				settime();	
			}
			if(keynum==3)//減一
			{
				DS1302_time[count]--;
				setlimit();
				settime();
			}
			if(keynum==4)//設(shè)置時(shí)間和走時(shí)顯示切換 
			{
				mode=!mode;
			}	
		}
		if(mode==0)//走時(shí)模式
		{	
			readtime();
			showtime();		
		}
		if(mode==1)//設(shè)置時(shí)間模式
		{
			num_flash();
		}
	}
}

3.2 LCD1602模塊程序

3.2.1 LCD1602.h

#ifndef __LCD1602_H__
#define __LCD1602_H__

//用戶調(diào)用函數(shù):
void LCD_Init();
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);

#endif

3.2.2 LCD1602.c

#include <REGX52.H>

//引腳配置:
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
#define LCD_DataPort P0

//函數(shù)定義:
/**
  * @brief  LCD1602延時(shí)函數(shù),12MHz調(diào)用可延時(shí)1ms
  * @param  無(wú)
  * @retval 無(wú)
  */
void LCD_Delay()
{
	unsigned char i, j;

	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
}

/**
  * @brief  LCD1602寫命令
  * @param  Command 要寫入的命令
  * @retval 無(wú)
  */
void LCD_WriteCommand(unsigned char Command)
{
	LCD_RS=0;
	LCD_RW=0;
	LCD_DataPort=Command;
	LCD_EN=1;
	LCD_Delay();
	LCD_EN=0;
	LCD_Delay();
}

/**
  * @brief  LCD1602寫數(shù)據(jù)
  * @param  Data 要寫入的數(shù)據(jù)
  * @retval 無(wú)
  */
void LCD_WriteData(unsigned char Data)
{
	LCD_RS=1;
	LCD_RW=0;
	LCD_DataPort=Data;
	LCD_EN=1;
	LCD_Delay();
	LCD_EN=0;
	LCD_Delay();
}

/**
  * @brief  LCD1602設(shè)置光標(biāo)位置
  * @param  Line 行位置,范圍:1~2
  * @param  Column 列位置,范圍:1~16
  * @retval 無(wú)
  */
void LCD_SetCursor(unsigned char Line,unsigned char Column)
{
	if(Line==1)
	{
		LCD_WriteCommand(0x80|(Column-1));
	}
	else if(Line==2)
	{
		LCD_WriteCommand(0x80|(Column-1+0x40));
	}
}

/**
  * @brief  LCD1602初始化函數(shù)
  * @param  無(wú)
  * @retval 無(wú)
  */
void LCD_Init()
{
	LCD_WriteCommand(0x38);//八位數(shù)據(jù)接口,兩行顯示,5*7點(diǎn)陣
	LCD_WriteCommand(0x0c);//顯示開,光標(biāo)關(guān),閃爍關(guān)
	LCD_WriteCommand(0x06);//數(shù)據(jù)讀寫操作后,光標(biāo)自動(dòng)加一,畫面不動(dòng)
	LCD_WriteCommand(0x01);//光標(biāo)復(fù)位,清屏
}

/**
  * @brief  在LCD1602指定位置上顯示一個(gè)字符
  * @param  Line 行位置,范圍:1~2
  * @param  Column 列位置,范圍:1~16
  * @param  Char 要顯示的字符
  * @retval 無(wú)
  */
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
{
	LCD_SetCursor(Line,Column);
	LCD_WriteData(Char);
}

/**
  * @brief  在LCD1602指定位置開始顯示所給字符串
  * @param  Line 起始行位置,范圍:1~2
  * @param  Column 起始列位置,范圍:1~16
  * @param  String 要顯示的字符串
  * @retval 無(wú)
  */
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=0;String[i]!='\0';i++)
	{
		LCD_WriteData(String[i]);
	}
}

/**
  * @brief  返回值=X的Y次方
  */
int LCD_Pow(int X,int Y)
{
	unsigned char i;
	int Result=1;
	for(i=0;i<Y;i++)
	{
		Result*=X;
	}
	return Result;
}

/**
  * @brief  在LCD1602指定位置開始顯示所給數(shù)字
  * @param  Line 起始行位置,范圍:1~2
  * @param  Column 起始列位置,范圍:1~16
  * @param  Number 要顯示的數(shù)字,范圍:0~65535
  * @param  Length 要顯示數(shù)字的長(zhǎng)度,范圍:1~5
  * @retval 無(wú)
  */
void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{
		LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');
	}
}

/**
  * @brief  在LCD1602指定位置開始以有符號(hào)十進(jìn)制顯示所給數(shù)字
  * @param  Line 起始行位置,范圍:1~2
  * @param  Column 起始列位置,范圍:1~16
  * @param  Number 要顯示的數(shù)字,范圍:-32768~32767
  * @param  Length 要顯示數(shù)字的長(zhǎng)度,范圍:1~5
  * @retval 無(wú)
  */
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
{
	unsigned char i;
	unsigned int Number1;
	LCD_SetCursor(Line,Column);
	if(Number>=0)
	{
		LCD_WriteData('+');
		Number1=Number;
	}
	else
	{
		LCD_WriteData('-');
		Number1=-Number;
	}
	for(i=Length;i>0;i--)
	{
		LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');
	}
}

/**
  * @brief  在LCD1602指定位置開始以十六進(jìn)制顯示所給數(shù)字
  * @param  Line 起始行位置,范圍:1~2
  * @param  Column 起始列位置,范圍:1~16
  * @param  Number 要顯示的數(shù)字,范圍:0~0xFFFF
  * @param  Length 要顯示數(shù)字的長(zhǎng)度,范圍:1~4
  * @retval 無(wú)
  */
void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
	unsigned char i,SingleNumber;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{
		SingleNumber=Number/LCD_Pow(16,i-1)%16;
		if(SingleNumber<10)
		{
			LCD_WriteData(SingleNumber+'0');
		}
		else
		{
			LCD_WriteData(SingleNumber-10+'A');
		}
	}
}

/**
  * @brief  在LCD1602指定位置開始以二進(jìn)制顯示所給數(shù)字
  * @param  Line 起始行位置,范圍:1~2
  * @param  Column 起始列位置,范圍:1~16
  * @param  Number 要顯示的數(shù)字,范圍:0~1111 1111 1111 1111
  * @param  Length 要顯示數(shù)字的長(zhǎng)度,范圍:1~16
  * @retval 無(wú)
  */
void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
{
	unsigned char i;
	LCD_SetCursor(Line,Column);
	for(i=Length;i>0;i--)
	{
		LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');
	}
}

3.3 DS1302模塊程序

3.3.1 DS1302.h

#ifndef __DS1302_H__
#define __DS1302_H__

#define Year_command 0x8C
#define Day_command 0x8A
#define Month_command 0x88
#define Date_command 0x86
#define Hour_command 0x84
#define Minute_command 0x82
#define Second_command 0x80
#define Wp_command 0x8E

extern char DS1302_time[];
void DS1302_Init();
void DS1302_writebyte(unsigned char command,unsigned char byte);
unsigned char DS1302_readbyte(unsigned char command);
void settime();
void readtime();
	
#endif

3.3.2 DS1302.c

這里要注意的是:

  • 設(shè)置要寫入的時(shí)間時(shí)要16進(jìn)制轉(zhuǎn)10進(jìn)制。
  • 讀出時(shí)間時(shí)要記得8421BCD碼轉(zhuǎn)10進(jìn)制,因?yàn)镈S1302寄存器存的是數(shù)據(jù)的BCD碼。
#include <REGX52.H>
#include"DS1302.h"
sbit DS1302_SCLK=P3^6;
sbit DS1302_IO=P3^4;
sbit DS1302_CE=P3^5;

char DS1302_time[]={23,2,24,12,0,0,5};//2023/2/24,12:00:00,星期5
/*
	*函數(shù)名:  DS1302_Init()
	*函數(shù)功能:初始化DS1302
	*輸入:	   無(wú)
	*輸出:	   無(wú)
*/
void DS1302_Init()
{
	DS1302_CE=0;
	DS1302_SCLK=0;
}
/*
	*函數(shù)名:  DS1302_writebyte(unsigned char command,unsigned char byte)
	*函數(shù)功能:DS1302的單字節(jié)寫
	*輸入:	   command:命令字   byte:要寫入的數(shù)據(jù)
	*輸出:	   無(wú)
*/
void DS1302_writebyte(unsigned char command,unsigned char byte)
{
	unsigned char i=0;
	DS1302_CE=1;
	for(i=0;i<8;i++)
	 {
	 	 DS1302_IO=command&(0x01<<i);
		 DS1302_SCLK=1;
		 DS1302_SCLK=0;
	 }
	 	for(i=0;i<8;i++)
	 {
	 	 DS1302_IO=byte&(0x01<<i);
		 DS1302_SCLK=1;
		 DS1302_SCLK=0;
	 }
	 DS1302_CE=0;
}
/*
	*函數(shù)名:  DS1302_readbyte(unsigned char command)
	*函數(shù)功能:DS1302的單字節(jié)讀
	*輸入:	   command:命令字
	*輸出:	   byte:要讀出的數(shù)據(jù)
*/
unsigned char DS1302_readbyte(unsigned char command)
{	
	unsigned char i=0;
	unsigned char byte=0x00;
	DS1302_CE=1;
	command++;
	for(i=0;i<8;i++)
	 {
	 	 DS1302_IO=command&(0x01<<i);
		 DS1302_SCLK=0;
		 DS1302_SCLK=1;
	 }
	for(i=0;i<8;i++)
	{
		DS1302_SCLK=1;
		DS1302_SCLK=0;
		if(DS1302_IO)
		{
			byte|=(0x01<<i);
		}
	}
	DS1302_CE=0;
	DS1302_IO=0;
	return byte;
}
/*
	*函數(shù)名:  settime()
	*函數(shù)功能:把命令字和DS1302_time[]數(shù)組中的年、月、日、時(shí)鐘、分鐘、秒鐘、星期一起寫入DS1302
	*輸入:	   無(wú)
	*輸出:	   無(wú)
*/
void settime()
{
	DS1302_writebyte(Wp_command,0x00);
	DS1302_writebyte(Year_command,DS1302_time[0]/10*16+DS1302_time[0]%10);//16進(jìn)制0x23轉(zhuǎn)十進(jìn)制23
	DS1302_writebyte(Day_command,DS1302_time[6]/10*16+DS1302_time[6]%10);
	DS1302_writebyte(Month_command,DS1302_time[1]/10*16+DS1302_time[1]%10);
	DS1302_writebyte(Date_command,DS1302_time[2]/10*16+DS1302_time[2]%10);
	DS1302_writebyte(Hour_command,DS1302_time[3]/10*16+DS1302_time[3]%10);
	DS1302_writebyte(Minute_command,DS1302_time[4]/10*16+DS1302_time[4]%10);
	DS1302_writebyte(Second_command,DS1302_time[5]/10*16+DS1302_time[5]%10);
}
/*
	*函數(shù)名:  readtime()
	*函數(shù)功能:把年、月、日、時(shí)鐘、分鐘、秒鐘、星期一起讀出到數(shù)組DS1302_time[]中
	*輸入:	   無(wú)
	*輸出:	   無(wú)
*/
void readtime()
{
	unsigned char tmp=0;
	tmp=DS1302_readbyte(Year_command);//BCD碼轉(zhuǎn)十進(jìn)制數(shù)
	DS1302_time[0]=tmp/16*10+tmp%16;
	tmp=DS1302_readbyte(Month_command);
	DS1302_time[1]=tmp/16*10+tmp%16;
	tmp=DS1302_readbyte(Date_command);
	DS1302_time[2]=tmp/16*10+tmp%16;
	tmp=DS1302_readbyte(Hour_command);
	DS1302_time[3]=tmp/16*10+tmp%16;
	tmp=DS1302_readbyte(Minute_command);
	DS1302_time[4]=tmp/16*10+tmp%16;
	tmp=DS1302_readbyte(Second_command);
	DS1302_time[5]=tmp/16*10+tmp%16;
	tmp=DS1302_readbyte(Day_command);
	DS1302_time[6]=tmp/16*10+tmp%16;
} 

3.4 獨(dú)立按鍵模塊程序

3.4.1?Independentkey.h

#ifndef __INDEPENDENTKEY_H__
#define	__INDEPENDENTKEY_H__

unsigned char Independentkey();
#endif

3.4.2?Independentkey.c

#include <REGX51.H>
#include"Delay.h"
unsigned char Independentkey()
{
	unsigned char keynum=0;
	if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);keynum=1;}
	if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);keynum=2;}
	if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);keynum=3;}
	if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);keynum=4;}

	return keynum;
}

3.5 T0定時(shí)器模塊

3.5.1 Timer0_Iint.h

#ifndef __TIMER0_INIT_H__
#define __TIMER0_INIT_H__

void Timer0_Init();

#endif

3.5.2?Timer0_Iint.c

#include <REGX51.H>
void Timer0_Init()//定時(shí)器0,工作方式1
{
	TMOD=0x01;
	TH0=0xfc;//1ms
	TL0=0x18;
	EA=1;
	ET0=1;
	TR0=1;
}
//定時(shí)1s中斷
//void Timer0_ISR() interrupt 1
//{	
//	static int count=0;
//	count++;
//	TH0=0xfc;
//	TL0=0x18;
//	if(count==1000)
//	{
//		count=0;
//			
//	} 
//}

3.6 延時(shí)函數(shù)

3.6.1 Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int Xms);
#endif

3.6.2?Delay.c

?
void Delay(unsigned int Xms)		//@12.000MHz
{
	unsigned char i, j;
	while(Xms--)
	{
		i = 12;
		j = 169;
		do
		{
			while (--j);
		} while (--i);
	}
}

?

四、效果演示

? ? ? ? 把23年2月24日12:00:00 星期5 改成23年3月1日13:55:00 星期3。

DS1302可調(diào)時(shí)鐘演示文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-431848.html

到了這里,關(guān)于51單片機(jī)——DS1302可調(diào)時(shí)鐘的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 基于51單片機(jī)、DS1302時(shí)鐘模塊的電子鬧鐘設(shè)計(jì)

    基于51單片機(jī)、DS1302時(shí)鐘模塊的電子鬧鐘設(shè)計(jì)

    提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 DS1302 是美國(guó)DALLAS公司推出的一種高性能、低功耗、帶RAM的實(shí)時(shí)時(shí)鐘電路,它可以對(duì)年、月、日、周、時(shí)、分、秒進(jìn)行計(jì)時(shí),具有閏年補(bǔ)償功能,工作

    2024年02月02日
    瀏覽(37)
  • 使用51單片機(jī)和DS1302時(shí)鐘芯片做一個(gè)簡(jiǎn)易的電子時(shí)鐘

    使用51單片機(jī)和DS1302時(shí)鐘芯片做一個(gè)簡(jiǎn)易的電子時(shí)鐘

    今天給大家推薦一個(gè)51單片機(jī)小實(shí)驗(yàn),帶你使用51單片機(jī)做一款簡(jiǎn)易的電子時(shí)鐘,其中計(jì)時(shí)模塊采用DS1302硬件模塊,顯示采用LCD顯示屏,具體怎么實(shí)現(xiàn)開來(lái)一起看看吧! DS1302 是 DALLAS 公司推出的涓流充電時(shí)鐘芯片,內(nèi)含有一個(gè)實(shí)時(shí)時(shí)鐘和31字節(jié)靜態(tài) RAM,通過(guò)簡(jiǎn)單的串行接口與

    2024年02月11日
    瀏覽(27)
  • 【單片機(jī)】13-實(shí)時(shí)時(shí)鐘DS1302

    【單片機(jī)】13-實(shí)時(shí)時(shí)鐘DS1302

    (rtc for real time clock) (1)時(shí)間點(diǎn)和時(shí)間段的概念區(qū)分 (2)單片機(jī)為什么需要時(shí)間點(diǎn)【一定的時(shí)間點(diǎn)干什么事情】 (3)RTC如何存在于系統(tǒng)中(單片機(jī)內(nèi)部集成 or 單片機(jī)外部擴(kuò)展【DS1302】) 1.數(shù)據(jù)手冊(cè) DS1302中文數(shù)據(jù)手冊(cè) - 豆丁網(wǎng) 2. SPI數(shù)字接口 訪問(wèn) SPI通信協(xié)議【DS1302也使用

    2024年02月07日
    瀏覽(17)
  • 單片機(jī)第一季:零基礎(chǔ)11——實(shí)時(shí)時(shí)鐘DS1302

    單片機(jī)第一季:零基礎(chǔ)11——實(shí)時(shí)時(shí)鐘DS1302

    目錄 1,DS1302 時(shí)鐘芯片介紹? 2,BCD碼介紹? 3,涉及到的寄存器? 3.1,控制寄存器 3.2,日歷/時(shí)鐘寄存器? 3.3,DS1302 的讀寫時(shí)序? 4,相關(guān)代碼? 這一章我們來(lái)學(xué)習(xí)DS1302 時(shí)鐘芯片,該芯片是3 線SPI 接口,所以需要使用51單片機(jī)的3 個(gè)IO 口模擬SPI 時(shí)序與DS1302 時(shí)鐘芯片通信,將時(shí)鐘

    2024年02月16日
    瀏覽(32)
  • 51單片機(jī)(數(shù)碼管可調(diào)時(shí)鐘)

    51單片機(jī)(數(shù)碼管可調(diào)時(shí)鐘)

    1.數(shù)碼管(共陰極)如何顯示數(shù)字:位選+段選(單個(gè)) 位選:138譯碼器通過(guò)P22、P23、P24三個(gè)端口輸入二進(jìn)制數(shù)(011、000等)來(lái)選擇連同譯碼器右邊的哪一條線,而這些線又分別連著數(shù)碼管的LED12345678、決定選擇哪一個(gè)來(lái)顯示數(shù)字 段選:決定輸出什么數(shù)字,數(shù)碼管下方又連著一

    2024年02月05日
    瀏覽(25)
  • 基于51單片機(jī)的可調(diào)時(shí)鐘(開源)

    基于51單片機(jī)的可調(diào)時(shí)鐘(開源)

    ? ? ? ? 應(yīng)用DS1302實(shí)現(xiàn)在LCD1602上顯示時(shí)間,包括年月日,時(shí)分秒以及星期幾的英文縮寫,并具有時(shí)間可調(diào)的功能,調(diào)節(jié)當(dāng)前位時(shí)閃爍。利用獨(dú)立按鍵1實(shí)現(xiàn)模式切換,按鍵2設(shè)置時(shí)間位選擇,按鍵3當(dāng)前時(shí)間位+1,按鍵4當(dāng)前時(shí)間位-1,調(diào)節(jié)時(shí)間具有邊界判斷和自動(dòng)校正功能,同時(shí)

    2024年02月06日
    瀏覽(23)
  • 藍(lán)橋杯單片機(jī)比賽學(xué)習(xí):12、DS1302時(shí)鐘基本原理與使用方法

    藍(lán)橋杯單片機(jī)比賽學(xué)習(xí):12、DS1302時(shí)鐘基本原理與使用方法

    DS1302是 DALLAS 公司推出的時(shí)鐘芯片,內(nèi)含一個(gè)實(shí)時(shí)時(shí)鐘/日歷和 31字節(jié)靜態(tài) RAM,通過(guò)簡(jiǎn)單的串行接口與單片機(jī)進(jìn)行通信。實(shí)時(shí)時(shí)鐘/日歷電路提供秒、分、時(shí)、日、周、月、年的信息,每月的天數(shù)和閏年的天數(shù)可自動(dòng)調(diào)整。 但是在我們比賽中一般只需要寫/讀時(shí)鐘。 DS1302可以采

    2024年02月02日
    瀏覽(28)
  • 基于51單片機(jī)數(shù)字溫度報(bào)警器_DS18B20可調(diào)上下限

    基于51單片機(jī)數(shù)字溫度報(bào)警器_DS18B20可調(diào)上下限

    (仿真+程序+原理圖) 原理圖:Altium Designer 仿真版本:proteus 7.8 程序編譯器:keil 4/keil 5 編程語(yǔ)言:C語(yǔ)言 設(shè)計(jì)編號(hào):S0009 1、實(shí)時(shí)溫度測(cè)量及顯示,超出溫度范圍聲光報(bào)警,上下限溫度可通過(guò)按鍵設(shè)定等功能; 2、溫度測(cè)量范圍0到99.9攝氏度,精度為0.1攝氏度; 3、可設(shè)置上下

    2024年02月06日
    瀏覽(25)
  • 51單片機(jī)DS18B20溫度報(bào)警器proteus仿真設(shè)計(jì)_可調(diào)上下限

    51單片機(jī)DS18B20溫度報(bào)警器proteus仿真設(shè)計(jì)_可調(diào)上下限

    (仿真+源碼+原理圖+報(bào)告+講解視頻) 原理圖:Altium Designer 仿真版本:proteus 7.8 程序編譯器:keil 4/keil 5 編程語(yǔ)言:C語(yǔ)言 設(shè)計(jì)編號(hào):S0008 本設(shè)計(jì)系統(tǒng)是18b20溫度報(bào)警系統(tǒng)數(shù)碼管顯示,可設(shè)置溫度上限高溫報(bào)警和下限低溫報(bào)警,報(bào)警溫度可精確到0.1度,并具有掉電保存功能,數(shù)

    2024年02月11日
    瀏覽(19)
  • 基于51單片機(jī)交通燈帶緊急開關(guān)+黃燈倒計(jì)時(shí)+可調(diào)時(shí)間

    基于51單片機(jī)交通燈帶緊急開關(guān)+黃燈倒計(jì)時(shí)+可調(diào)時(shí)間

    仿真圖proteus 7.8 程序編譯器:keil 4/keil 5 編程語(yǔ)言:C語(yǔ)言 設(shè)計(jì)編號(hào):J000 功能說(shuō)明: 采用51單片機(jī)以及單片機(jī)最小系統(tǒng)和三極管驅(qū)動(dòng)電路以及外圍的按鍵和數(shù)碼管顯示等部件,設(shè)計(jì)一個(gè)基于單片機(jī)的交通燈設(shè)計(jì)。 1.四路交通燈,帶有紅綠燈倒計(jì)時(shí),綠燈倒計(jì)時(shí)結(jié)束后轉(zhuǎn)黃燈

    2024年02月06日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包