基于51单片机的实时时钟设计

发布时间:2023-01-11  

功能:

通过8位数码管实现实时时钟,可以设置时间,切换显示模式,显示年月日,时分秒信息;可通过按键修改信息,增加、减少、确定、取消、上一个、下一个、切换模式、设置等功能。

时分秒


年月日:


部分程序:


#include

#include "MAX7221.h"

#include "DS1302.h"


void InitTimer0(void); //定时器T0初始化函数

void Disp(void); //时间显示函数

void SSetTime(unsigned char n,unsigned char m,unsigned char *readvalue,unsigned char *Cflag); //用户设置时间函数

void Delay(unsigned char time); //延时函数

void SDisp(unsigned char n); //设置时间,数码管闪烁函数


sbit Next=P1^0; //“下一个”按钮

sbit Pre=P1^1; //“上一个”按钮

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

sbit SUB=P1^3; //“减少”按钮

sbit SET=P1^4; //“确定”按钮

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

sbit LED=P2^6; //设置指示灯

SYSTEMTIME CurrentTime; //时间日期类型

signed char DispBuf[16]; //存放时间日期的个位与十位

unsigned char DISPCODE[]={0,1,2,3,4,5,6,7,8,9,0x0A,0x0F}; //数码管显示数组,0x0A数码管显示“-”,0x0F数码管不显示

unsigned int count=1200; //用于设定时间/日期在数码管上的显示时间

unsigned char DisFlag=0; //显示标志,0位时间显示,1位日期显示

unsigned char SetFlag=0; //设置标志


void main(void)

{

InitTimer0(); //定时器初始化

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

Init_DS1302(); //DS1302初始化;注:1 Warning,由于在中断0中也调用了SetTime()函数,所以有一个警告,可忽略警告;如果你将其注释掉,会出现新的警告,因为你在DS1302中写了Init_DS1302()函数,而你没有调用;标准是一定要调用Init_DS1302()函数的

IT0=1; //设置中断INT0

EX0=1;

IT1=1; //设置中断INT1

EX1=1;

EA=1;

LED=0; //设置指示灯为灭的状态

while(1)

{

Disp(); //显示时间/日期

Delay(10);

}

return;

}


//时间/日期显示函数

void Disp(void)

{


GetTime(&CurrentTime); //获取时间/日期

if(DisFlag==0) //判断是不是显示时间

{

DispBuf[7]=(CurrentTime.Second)%10; //秒的个位

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

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

DispBuf[4]=(CurrentTime.Minute)%10; //分的个位

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

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

DispBuf[1]=(CurrentTime.Hour)%10; //时的个位

DispBuf[0]=(CurrentTime.Hour)/10; //时的十位

}

else if(DisFlag==1)

{

DispBuf[7]=(CurrentTime.Day)%10; //日的个位

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

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

DispBuf[4]=(CurrentTime.Month)%10; //月的个位

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

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

DispBuf[1]=(CurrentTime.Year)%10; //年的个位

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

}


Wr_Max7221(0x08,DISPCODE[DispBuf[7]]); //显示秒的个位或日的个位

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

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

Wr_Max7221(0x05,DISPCODE[DispBuf[4]]); //显示分的个位或月的个位

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

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

Wr_Max7221(0x02,DISPCODE[DispBuf[1]]); //显示时的个位或年的个位

Wr_Max7221(0x01,DISPCODE[DispBuf[0]]); //显示时的十位或年的十位

}


//T0定时器初始化子程序

void InitTimer0(void)

{

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

TH0=(65536-50000)/256; //定时时间为0.5ms

TL0=(65536-50000)%256;

EA=1; //开总中断

ET0=1; //允许定时器T0中断

TR0=1; //打开定时器T0

}


//T0定时器服务子程序

void Timer0(void) interrupt 1

{

TR0=0; //关定时器T0

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

TL0=(65536-50000)%256;

count--;

if(count==0) //count*0.5ms定时到

{

if(DisFlag==0) //如果上一个是显示时间

{

DisFlag=1; //改为显示日期

count=100; //显示5s

}

else if(DisFlag==1)

{

count=1200; //显示60s

DisFlag=0; //改为显示时间

}

}

TR0=1; //打开定时器T0

}



SetFlag=0; //清除设置标志

break; //退出设置模式

}

if(Next==0) n=n-1; //“下一个”按钮按下时,某数据设置位标志减1

if(n<=0) n=6; //若到达0时,回到6设置

if(Pre==0) n=n+1; //“上一个”按钮按下时,某数据设置位标志加1

if(n>=7) n=1; //若到达0时,回到6设置

if(ADD==0) m=1; //“增加”按钮按下时,设置增加标志

if(SUB==0) m=2; //“减少”按钮按下时,设置减少标志

if((Next==0)||(ADD==0)||(SUB==0)) //判断是否有“下一个”按钮或“增加”按钮或“减少”按钮按下

{

Delay(50); //延时(给一定的释放按钮时间)

SSetTime(n,m,readvalue,&Cflag); //进入相关的设置

}

SDisp(n); //显示

m=0; //清除“增加”或“减少”标志

}

LED=0; //设置完毕,关设置指示灯

count=1200; //设置完毕后,“时间”显示的60s

DisFlag=0; //显示“时间”

EA=1; //开总中断

}


//时间日期变化子函数

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

{

if(m==1) //设置值增加

{

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

{

*Cflag|=0x01; //年值变化标志

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

if(readvalue[5]>=100) readvalue[5]=00; //判断是否大于99,若是,将其设置为0

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

DispBuf[1]=readvalue[5]%10; //保存年的个位

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    基于51单片机的带时间显示的红绿灯设计;功能: 带时间显示的红绿灯设计,30秒南北绿灯,东西红灯;3次闪烁黄灯;切换为30秒东西绿灯,南北红灯; 具体定时时间可根据程序自行修改,带有源程序、仿真......
    .仿真设计 开始仿真 打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。开始仿真默认进入时间显示模式,显示电脑当前时间显示时间的情况下,按下设置键进入设置模式,时间......
    ;         }              if(a!=calendar.sec)//RTC实时时间显示     {     a=calendar.sec; //    LCD_ShowNum(60,130,calendar.w_year......
    选择时,数码管显示对应功能时间 if(sys_ctrl.start==0) { //进入功能选择时,数据处理 if(sys_ctrl.fun!=0) { //未开启预约,时间显示......
         MODE;            //功能模式选择,0为时间显示模式,1为时间调整模式 unsigned char     TimeSetSelect;    //时间设置选择位,0-5,年、月......
    及闹钟系统:可以自行设置闹钟时间。6.手动自动控制按键随时切换 2.硬件设计 自动窗帘控制系统的构成主要由STC89C52单片机最小系统、蜂鸣器报警电路、电源模块、按键电路、LCD1602液晶显示电路、步进......
    路由一片AT89C2051单片机、6位LED数码管、6个按键、11.0952NHz晶振等组成,并接了1片74HC374扩展了5个输出口。 一、硬件设计电路原理图见图1。整个电路由显示电路、键盘电路、输入输出接口及CPU......
    系统加上电源。该系统工作情况见下图(略)。 整个电路搭好后,上电即能显示“2”。按压复位键,显示全部熄灭,可以验证复位后单片机口线均为高电平,本设计属于低电平驱动,所以复位期间显示全部熄灭。手压复位键时间......
    为核心的温度采集与控制系统很有用研发和应用意义。本文研究了一个可以实时存储和显示当前的温度数据,并且可以切换显示当前的时间而且可对其时间进行修改的温度显示系统。文章以STC89C52单片机,DS18B20......
    所需的时钟频率以及在不同需求下对电路进行复位;显示模块的作用是显示设定的通行或等待时间。 3、硬件设计 3.1、控制及扩展模块 (1)控制模块控制部分采用MCS-51系列单片机8051,其价格低廉,结构简单,易于开发,有较......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>