基于51单片机的电子时钟设计源程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
unsigned char DispBuf[6]; //时间显示缓冲区
unsigned char Disdate[6]; //日期显示缓冲区
unsigned char DisSec[6]; //秒表缓冲区
struct //设定时间结构体
{
unsigned char Hour;
unsigned char Min;
unsigned char Sec;
}Time;
struct //设定日期结构体
{
unsigned char Year;
unsigned char Month;
unsigned char Days;
}Date;
struct //设定毫秒结构体
{
unsigned char Minite;
unsigned char Second;
unsigned char MilliSec;
}Millisecond;
unsigned char point=0;
unsigned char point1=0;
unsigned char point2=0;
unsigned char Daymount;
unsigned char Daymount1;
unsigned char T0_Int_Times=0; //中断次数计数变量
unsigned char Flash_flag=0; //闪烁标志,每半秒闪烁
unsigned char Flash_flag1=0; //闪烁标志,每半秒闪烁
unsigned char DisPlay_Back=0; //显示缓冲区更新备份,如果显示缓冲区更新则跟闪烁标志不一致
unsigned char DisPlay_Back1=0; //显示缓冲区更新备份,如果显示缓冲区更新则跟闪烁标志不一致
unsigned char i,j; unsigned char SetMillisecond; //启动秒表
code unsigned char LEDCode[]={0x01,0xd7,0x22,0x82,0xc4,0x88,0x08,0xc1,0x00,0x80}; //数码管显示代码
code unsigned char ErrorLEDCode[]={0x01,0xe7,0x12,0x82,0xc4,0x88,0x08,0xc1,0x00,0x80};//绘制错误图纸的数码管显示代码
void DisPlayBuf(); void ChangeToDispCode(); void ChangeToDispCode1(); void changedate(); // 调日期
void displaydate(); // 显示日期
void makedays(); //确定每个月的日期
void runSec();
void delay(unsigned int i); //函数声名
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
//***************************************************
// Init 初始化代码
// 设定50ms中断一次,注:在Fosc=6M情况下
//****************************************************
void Init(void)
{
Date.Year=10;
Date.Month=12;
Date.Days=25;
Time.Hour=12;
Time.Min=0;
Time.Sec=0;
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
}
/******************************延时子程序*********************************************/
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
//*******************************************
// 主程序
//*******************************************
main()
{
Init(); //初始化
for(;;)
{
if(DisPlay_Back!=Flash_flag) //是否显示?
{
DisPlay_Back=Flash_flag; //显示过后要半秒后再显示
ChangeToDispCode(); //转化时间为可显示代码
if(Flash_flag) //更新双点闪烁
{
DispBuf[2]=DispBuf[2]|0x10; //双点熄灭
DispBuf[4]=DispBuf[4]|0x20;
}
else
{
DispBuf[2]=DispBuf[2]&0xef; //点亮双点
DispBuf[4]=DispBuf[4]&0xdf;
};
if(Flash_flag & point==1) //更新小时
{
DispBuf[0]=DispBuf[0]|0xff; //小时熄灭
DispBuf[1]=DispBuf[1]|0xff;
}
else
{
DispBuf[0]=DispBuf[0]&0xff; //小时点亮
DispBuf[1]=DispBuf[1]&0xff;
};
if(Flash_flag & point==2) //更新分钟
{
DispBuf[2]=DispBuf[2]|0xff; //分钟熄灭
DispBuf[3]=DispBuf[3]|0xff;
}
else
{
DispBuf[2]=DispBuf[2]&0xff; //分钟点亮
DispBuf[3]=DispBuf[3]&0xff;
};
if(Flash_flag & point==3) //更新秒钟
{
DispBuf[4]=DispBuf[4]|0xff; //秒钟熄灭
DispBuf[5]=DispBuf[5]|0xff;
}
else
{
DispBuf[4]=DispBuf[4]&0xff; //秒钟点亮
DispBuf[5]=DispBuf[5]&0xff;
};
DisPlayBuf();//显示
}
if((P1&0x07)!=0x7) //按键处理模块模块{
delay(250);