目錄
一、功能介紹
二、主要模塊介紹
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í)鐘引腳?
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 碼形式。
2.控制命令字
????????命令字簡(jiǎn)單來(lái)說(shuō)就是,控制時(shí)鐘寄存器的讀寫。比如要寫入秒鐘,那么操作的命令字就是0x80對(duì)應(yīng)上面圖中的80h;要讀出秒鐘,操作的命令字是0x81,對(duì)應(yīng)81h。以此類推,可以控制所有時(shí)鐘數(shù)據(jù)的讀寫。
?3.時(shí)序圖
????????上面是單字節(jié)讀,下面是單字節(jié)寫。根據(jù)時(shí)序圖來(lái)寫入數(shù)據(jù)和讀出數(shù)據(jù)。
????????單字節(jié)寫,是把單片機(jī)內(nèi)存里的數(shù)據(jù),也就是把定義的變量寫入DS1302的寄存器中。有兩個(gè)變量,一個(gè)是要操作的命令字(寫秒鐘還是寫分鐘...),另一個(gè)是要寫入的數(shù)據(jù)。
- 初始化時(shí)CE=0;SCLK=0。
- 使能端CE=1;先SCLK=1由0->1,再SCLK=0由1->0,模擬一個(gè)寫入脈沖周期。
- 命令字和數(shù)據(jù)寫入完成后要把使能端CE=0;SCLK=0。
????????單字節(jié)讀,分兩個(gè)過(guò)程,一個(gè)是寫入命令字,一個(gè)是讀出數(shù)據(jù)。
- 初始化時(shí)CE=0;SCLK=0。
- 同樣也是使能端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)。
- 命令字和數(shù)據(jù)寫入完成后要把使能端CE=0;SCLK=0。
????????單字節(jié)讀寫中,SCLK的設(shè)置方式不同,主要是因?yàn)闀r(shí)序脈沖的不同,單字節(jié)讀只有15個(gè)脈沖,單字節(jié)寫有16個(gè)脈沖,平均分成命令字寫和數(shù)據(jù)的讀/寫兩部分。
三、程序匯總
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。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-431848.html
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)!