MCU 您所在的位置:网站首页 世界时钟时间显示 MCU

MCU

2024-05-24 07:44| 来源: 网络整理| 查看: 265

目录 一、什么是时钟1.1 实时时钟1.2 时序 二、DS1302实时时钟2.1 DS1302介绍2.2 引脚定义和应用电路 三、代码演示3.1 数字时钟3.2 DS1302可调时钟 注意:一定要看

一、什么是时钟 1.1 实时时钟

real time clock,真实时间,就是所谓的xx年x月x日x时x分x秒星期x RTC是SoC中一个内部外设,RTC有自己独立的晶振提供RTC时钟源,内部有一些寄存器用来记录时间(年月日时分秒星期)。一般情况下为了在系统关机时时间仍然在走,还会给RTC提供一个电池供电。 RTC在早期的单片机应用中是外置的,后来因为这个功能比较基础比较常用,比较高端的单片机或者SOC就将RTC直接内置了。

1.2 时序

时序:字面意思,时序就是时间顺序,实际上在通信中时序就是通信线上按照时间顺序发生的电平变化,以及这些变化对通信的意义就叫时序。 注意,时序的横轴的时间,所以对于字节是先发低位还是先发高位,可以看谁在前谁在后,在前的先发,在后的后发。

二、DS1302实时时钟 2.1 DS1302介绍

DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能

在这里插入图片描述

2.2 引脚定义和应用电路

在这里插入图片描述 DS1302 与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线: RST 复位 I/O 数据线 SCLK 串行时钟

Vcc2为主电源,VCC1为后备电源。 X1和X2是振荡源,外接32.768kHz晶振。 RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据传送的方法。 当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc>2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。

I/O为串行数据输入输出端(双向)。SCLK为时钟输入端。 1、时钟操作可通过AM/PM 指示决定采用24 或12 小时格式; 2、DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关; 3、寄存器中存放的数据位为BCD码形式; 操作DS1302的大致过程,就是将各种数据写入DS1302的寄存器,以设置它当前的时间和格式。然后使DS1302开始运作,DS1302时钟会按照设置情况运转,再用单片机将其寄存器内的数据读出。再用液晶显示,就是我们常说的简易电子钟。

DS1302的寄存器样式如下,我们看到: 第7 位永远都是1; 第6 位,1表示RAM,寻址内部存储器地址;0表示CK,寻址内部寄存器; 第5位到第1位,为RAM或者寄存器的地址; 最低位,高电平表示RD:即下一步操作将要“读”;低电平表示W:即下一步操作将要“写”。 在这里插入图片描述 SEC:秒寄存器,注意具体右边内容:低四位为SEC,高的次三位为10SEC,最高位CH为DS1302 的运行标志,当CH=0时,DS1302内部时钟运行,反之CH=1时停止;

MIN:分寄存器;

HR:时寄存器,最高位为12/24 小时的格式选择位,该位为1时表示12小时格式。当设置为12小时显示格式时,第5位的高电平表示下午(PM);而当设置为24 小时格式时,第5位为具体的时间数据。

DATE:日寄存器;

MONTH:月寄存器;

DAY:周寄存器,注意一周只有7天,所以该寄存器只有低三位有效,周一到周日;

YEAR:年寄存器;

CONTROL:写保护寄存器,当该寄存器最高位WP为1时,DS1302 只读不写,所以要在往DS1302 写数据之前确保WP为0;

TRICKLE CHARGE REGISTER:涓细电流充电设置寄存器,我们知道,当DS1302掉电时,可以马上调用外部电源保护时间数据。该寄存器就是配置备用电源的充电选项的。其中高四位(4个TCS)只有在1010 的情况下才能使用充电选项;低四位的情况,与DS1302内部电路有关。

CLOCK BURST:批量读写操作设置寄存器,设置该寄存器后,可以对DS1302的各个寄存器进行连续写入。DS1302的另外一种读写方式。笔者还没用过,感兴趣的朋友可以尝试。

寄存器定义表: 在这里插入图片描述 单字节读写时序图如下: 在这里插入图片描述

三、代码演示 3.1 数字时钟

main.c

#include #include "LCD1602.h" #include "DS1302.h" unsigned char Second,Minute; void main() { LCD_Init(); DS1302_Init(); LCD_ShowString(1,1," - - "); LCD_ShowString(2,1," : : "); DS1302_WriteByte(0x8e,0x00);//关闭写保护 DS1302_SetTime(); while(1) { DS1302_ReadTime(); LCD_ShowNum(1,1,DS1302_Time[0],2); LCD_ShowNum(1,4,DS1302_Time[1],2); LCD_ShowNum(1,7,DS1302_Time[2],2); LCD_ShowNum(2,1,DS1302_Time[3],2); LCD_ShowNum(2,4,DS1302_Time[4],2); LCD_ShowNum(2,7,DS1302_Time[5],2); } }

DS1302.c

#include sbit DS1302_SCLK=P3^6; sbit DS1302_IO=P3^4; sbit DS1302_CE=P3^5; #define DS1302_SECOND 0x80 #define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_DATE 0x86 #define DS1302_MONTHE 0x88 #define DS1302_DAY 0x8A #define DS1302_YEAR 0x8C #define DS1302_WP 0x8E unsigned char DS1302_Time[]={22,12,29,16,35,55,6}; void DS1302_Init() { DS1302_CE=0; DS1302_SCLK=0; } void DS1302_WriteByte(unsigned char Command,Data) { unsigned char i; DS1302_CE=1; for(i=0;i DS1302_IO=Data&(0x01 DS1302_IO=Command&(0x01 Data=Data|(0x01 unsigned char Temp; Temp=DS1302_ReadByte(DS1302_YEAR); DS1302_Time[0]=Temp/16*10+Temp%16; Temp=DS1302_ReadByte(DS1302_MONTHE); DS1302_Time[1]=Temp/16*10+Temp%16; Temp=DS1302_ReadByte(DS1302_DATE); DS1302_Time[2]=Temp/16*10+Temp%16; Temp=DS1302_ReadByte(DS1302_HOUR); DS1302_Time[3]=Temp/16*10+Temp%16; Temp=DS1302_ReadByte(DS1302_MINUTE); DS1302_Time[4]=Temp/16*10+Temp%16; Temp=DS1302_ReadByte(DS1302_SECOND); DS1302_Time[5]=Temp/16*10+Temp%16; Temp=DS1302_ReadByte(DS1302_DAY); DS1302_Time[6]=Temp/16*10+Temp%16; }

DS1302.h

#ifndef __DS1302_H__ #define __DS1302_H__ extern unsigned char DS1302_Time[]; void DS1302_Init(); void DS1302_WriteByte(unsigned char Command,Data); unsigned DS1302_ReadByte(unsigned char Command); void DS1302_SetTime(void); void DS1302_ReadTime(void); #endif

LCD1602.c

#include //引脚配置: sbit LCD_RS=P2^6; sbit LCD_RW=P2^5; sbit LCD_EN=P2^7; #define LCD_DataPort P0 //函数定义: /** * @brief LCD1602延时函数,12MHz调用可延时1ms * @param 无 * @retval 无 */ void LCD_Delay() { unsigned char i, j; i = 2; j = 239; do { while (--j); } while (--i); } /** * @brief LCD1602写命令 * @param Command 要写入的命令 * @retval 无 */ 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写数据 * @param Data 要写入的数据 * @retval 无 */ 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设置光标位置 * @param Line 行位置,范围:1~2 * @param Column 列位置,范围:1~16 * @retval 无 */ 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初始化函数 * @param 无 * @retval 无 */ void LCD_Init() { LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵 LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关 LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动 LCD_WriteCommand(0x01);//光标复位,清屏 } /** * @brief 在LCD1602指定位置上显示一个字符 * @param Line 行位置,范围:1~2 * @param Column 列位置,范围:1~16 * @param Char 要显示的字符 * @retval 无 */ 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 无 */ 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 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指定位置开始以有符号十进制显示所给数字 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:-32768~32767 * @param Length 要显示数字的长度,范围:1~5 * @retval 无 */ 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指定位置开始以十六进制显示所给数字 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:0~0xFFFF * @param Length 要显示数字的长度,范围:1~4 * @retval 无 */ 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 LCD_WriteData(SingleNumber-10+'A'); } } } /** * @brief 在LCD1602指定位置开始以二进制显示所给数字 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:0~1111 1111 1111 1111 * @param Length 要显示数字的长度,范围:1~16 * @retval 无 */ 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'); } }

LCD1602.h

#ifndef __LCD1602_H__ #define __LCD1602_H__ //用户调用函数: 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 DS1302可调时钟

main.c

#include #include "LCD1602.h" #include "DS1302.h" #include "key.h" #include "Timer0.h" unsigned char KeyNum,MODE,TimeSetSelect,TimeSetFlashFlag; void TimeShow(void) { DS1302_ReadTime(); LCD_ShowNum(1,1,DS1302_Time[0],2); LCD_ShowNum(1,4,DS1302_Time[1],2); LCD_ShowNum(1,7,DS1302_Time[2],2); LCD_ShowNum(2,1,DS1302_Time[3],2); LCD_ShowNum(2,4,DS1302_Time[4],2); LCD_ShowNum(2,7,DS1302_Time[5],2); } void TimeSet(void) { if(KeyNum==2) { TimeSetSelect++; TimeSetSelect=TimeSetSelect%6;//越界清零 } if(KeyNum==3) { DS1302_Time[TimeSetSelect]++; if(DS1302_Time[0]>99) { DS1302_Time[0]=0; } if(DS1302_Time[1]>12) { DS1302_Time[1]=1; } 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]=1; } } else 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]=1; } } else if(DS1302_Time[1]==2) { if(DS1302_Time[0]%4==0) { if(DS1302_Time[2]>29) { DS1302_Time[2]=1; } else { if(DS1302_Time[2]>28) { DS1302_Time[2]=1; } } } } if(DS1302_Time[3]>23) { DS1302_Time[3]=0; } if(DS1302_Time[4]>59) { DS1302_Time[4]=0; } if(DS1302_Time[5]>59) { DS1302_Time[5]=0; } } if(KeyNum==4) { DS1302_Time[TimeSetSelect]--; if(DS1302_Time[0] DS1302_Time[1]=12; } 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] if(DS1302_Time[2] if(DS1302_Time[0]%4==0) { if(DS1302_Time[2] if(DS1302_Time[2] DS1302_Time[3]=23; } if(DS1302_Time[4] DS1302_Time[5]=59; } } if(TimeSetSelect==0&&TimeSetFlashFlag==1) { LCD_ShowString(1,1," "); } else {LCD_ShowNum(1,1,DS1302_Time[0],2);} if(TimeSetSelect==1&&TimeSetFlashFlag==1) { LCD_ShowString(1,4," "); } else {LCD_ShowNum(1,4,DS1302_Time[1],2);} if(TimeSetSelect==2&&TimeSetFlashFlag==1) { LCD_ShowString(1,7," "); } else {LCD_ShowNum(1,7,DS1302_Time[2],2);} if(TimeSetSelect==3&&TimeSetFlashFlag==1) { LCD_ShowString(2,1," "); } else {LCD_ShowNum(2,1,DS1302_Time[3],2);} if(TimeSetSelect==4&&TimeSetFlashFlag==1) { LCD_ShowString(2,4," "); } else {LCD_ShowNum(2,4,DS1302_Time[4],2);} if(TimeSetSelect==5&&TimeSetFlashFlag==1) { LCD_ShowString(2,7," "); } else {LCD_ShowNum(2,7,DS1302_Time[5],2);} } void main() { LCD_Init(); DS1302_Init(); TImer0_Init(); LCD_ShowString(1,1," - - "); LCD_ShowString(2,1," : : "); DS1302_WriteByte(0x8e,0x00);//关闭写保护 DS1302_SetTime(); while(1) { KeyNum=Key(); if(KeyNum==1) { if(MODE==0) { MODE=1; } else if(MODE==1) { MODE=0; DS1302_SetTime(); } } switch(MODE) { case 0:TimeShow();break; case 1:TimeSet();break; } } } void Timer0_Routine() interrupt 1 { static unsigned int T0Count; TL0=0x18;//设置定时初值 TH0=0xFC;//设置定时初值 T0Count++; if(T0Count>=500) { T0Count=0; TimeSetFlashFlag=!TimeSetFlashFlag; } }

DS1302.c

#include sbit DS1302_SCLK=P3^6; sbit DS1302_IO=P3^4; sbit DS1302_CE=P3^5; #define DS1302_SECOND 0x80 #define DS1302_MINUTE 0x82 #define DS1302_HOUR 0x84 #define DS1302_DATE 0x86 #define DS1302_MONTHE 0x88 #define DS1302_DAY 0x8A #define DS1302_YEAR 0x8C #define DS1302_WP 0x8E char DS1302_Time[]={22,12,29,16,35,55,6}; void DS1302_Init() { DS1302_CE=0; DS1302_SCLK=0; } void DS1302_WriteByte(unsigned char Command,Data) { unsigned char i; DS1302_CE=1; for(i=0;i DS1302_IO=Data&(0x01 DS1302_IO=Command&(0x01 Data=Data|(0x01 unsigned char Temp; Temp=DS1302_ReadByte(DS1302_YEAR); DS1302_Time[0]=Temp/16*10+Temp%16; Temp=DS1302_ReadByte(DS1302_MONTHE); DS1302_Time[1]=Temp/16*10+Temp%16; Temp=DS1302_ReadByte(DS1302_DATE); DS1302_Time[2]=Temp/16*10+Temp%16; Temp=DS1302_ReadByte(DS1302_HOUR); DS1302_Time[3]=Temp/16*10+Temp%16; Temp=DS1302_ReadByte(DS1302_MINUTE); DS1302_Time[4]=Temp/16*10+Temp%16; Temp=DS1302_ReadByte(DS1302_SECOND); DS1302_Time[5]=Temp/16*10+Temp%16; Temp=DS1302_ReadByte(DS1302_DAY); DS1302_Time[6]=Temp/16*10+Temp%16; }

LCD1602.c

#include //引脚配置: sbit LCD_RS=P2^6; sbit LCD_RW=P2^5; sbit LCD_EN=P2^7; #define LCD_DataPort P0 //函数定义: /** * @brief LCD1602延时函数,12MHz调用可延时1ms * @param 无 * @retval 无 */ void LCD_Delay() { unsigned char i, j; i = 2; j = 239; do { while (--j); } while (--i); } /** * @brief LCD1602写命令 * @param Command 要写入的命令 * @retval 无 */ 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写数据 * @param Data 要写入的数据 * @retval 无 */ 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设置光标位置 * @param Line 行位置,范围:1~2 * @param Column 列位置,范围:1~16 * @retval 无 */ 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初始化函数 * @param 无 * @retval 无 */ void LCD_Init() { LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵 LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关 LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动 LCD_WriteCommand(0x01);//光标复位,清屏 } /** * @brief 在LCD1602指定位置上显示一个字符 * @param Line 行位置,范围:1~2 * @param Column 列位置,范围:1~16 * @param Char 要显示的字符 * @retval 无 */ 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 无 */ 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 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指定位置开始以有符号十进制显示所给数字 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:-32768~32767 * @param Length 要显示数字的长度,范围:1~5 * @retval 无 */ 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指定位置开始以十六进制显示所给数字 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:0~0xFFFF * @param Length 要显示数字的长度,范围:1~4 * @retval 无 */ 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 LCD_WriteData(SingleNumber-10+'A'); } } } /** * @brief 在LCD1602指定位置开始以二进制显示所给数字 * @param Line 起始行位置,范围:1~2 * @param Column 起始列位置,范围:1~16 * @param Number 要显示的数字,范围:0~1111 1111 1111 1111 * @param Length 要显示数字的长度,范围:1~16 * @retval 无 */ 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'); } }

key.c

#include #include "Delay.h" unsigned char Key() { unsigned char KeyNumber=0; if(P3_1==0) { Delay(20);while(P2_1==0);Delay(20);KeyNumber=1; } if(P3_0==0) { Delay(20);while(P2_0==0);Delay(20);KeyNumber=2; } if(P3_2==0) { Delay(20);while(P2_2==0);Delay(20);KeyNumber=3; } if(P3_3==0) { Delay(20);while(P2_3==0);Delay(20);KeyNumber=4; } return KeyNumber; }

Timer0.c

#include //简介:定时器0初始化,1毫秒@12.000MHZ void TImer0_Init() { //TMOD=0x01;//0000 0001 TMOD=TMOD&0xF0;//把TM0D的低四位清零,高四位保持不变 TMOD=TMOD|0x01;//把TM0D的最低位置置1,高四位保持不变 TL0=0x18;//设置定时初值 TH0=0xFC;//设置定时初值 TF0=0;//清除TF0标志 TR0=1;//计时器0开始计时 ET0=1; EA=1; PT0=0; } //定时器中断函数模板 //void Timer0_Routine() interrupt 1 //{ // static unsigned int T0Count; // TL0=0x18;//设置定时初值 // TH0=0xFC;//设置定时初值 // T0Count++; // if(T0Count>=1000) // { // T0Count=0; // P2_0=~P2_0; // } //}

Timer0.h

#ifndef __TIMER0_H__ #define __TIMER0_H__ void TImer0_Init(void); #endif

key.h

#ifndef __KEY_H__ #define __KEY_H__ unsigned char Key(); #endif

DS1302.h

#ifndef __DS1302_H__ #define __DS1302_H__ extern char DS1302_Time[]; void DS1302_Init(); void DS1302_WriteByte(unsigned char Command,Data); unsigned DS1302_ReadByte(unsigned char Command); void DS1302_SetTime(void); void DS1302_ReadTime(void); #endif

LCD1602.h

#ifndef __LCD1602_H__ #define __LCD1602_H__ //用户调用函数: 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 注意:一定要看

千万不要直接复制代码,因为是模块化编写,模块的代码没有往上复制,大家一定要自己动手跟着教学视屏自己写!!!!!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有