⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock2.c

📁 AT89s51和DS1302制作电子时钟的主程序,有日期和时间显示
💻 C
字号:
#include <REG51.H>
#include "ds1302.h"	   //包含DS1302头文件
#define leddata P0	   //定义LED数据口
#define sec 0x80	   //1302秒寄存器地址
#define min 0x82	   //1302分寄存器地址
#define hou 0x84	   //1302时寄存器地址
#define read 0x01	   //读操作,因为读的时候地址要加1,使最低位为1
sbit SET=P3^5;         //按键定义,下同	 //SET按键定义       
sbit UP=P3^6;          //加按键定义              
sbit DOWN=P3^7;        //减按键定义
sbit led0=P2^0;		   //LED位选,驱动数码管。下同
sbit led1=P2^1;
sbit led2=P2^2;
sbit led3=P2^3;
sbit led4=P2^4;
sbit led5=P2^5;


/**************函数声明*****************/
void delay(unsigned char);   //延时函数
void display(void);          //显示函数
void Scan_Key(void);         //键盘检测函数
void id_case1_key();         //键盘处理函数
void Set_id(unsigned char ,unsigned char);  //时间调整函数


/*************变量定义******************/
unsigned char id=0,timecount,re_disp=0;	  //定义用到的变量,id为调整模式用,不为0时表示调整模式,调整哪个量由id值确定
				                         //timecount用于500ms定时记数,时间到取反flag标志位,re_disp记数200次共10s,调整状态下按键无操作10s自动返回正常显示状态
bit hour,minute,second,flag;	//定义位变量,hour,minute,second分别为调整时闪烁标志位,flag 500ms取反一次,调整位闪烁及冒号闪烁用
unsigned char code tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};	//LED码表,根据硬件修改
unsigned char inittime[7]={0x00,0x00,0x00,0x10,0x05,0x07,0x04};		//初始化1302时用到的初始化数据
                        //  秒  分钟 小时  日   月   年  星期


/***********************************************/
/*****************中断处理函数******************/
/*功能说明:主要用于取反标志位,返回正常显示状态*/
/***********************************************/
void t0(void) interrupt 1 using 0
{
  	TH0=65356-5000;             //50ms定时
  	TL0=65356-5000;  
  	timecount++;re_disp++;      //程序法计时时间累加
  	if(timecount>10 )	    // 当超过500ms时执行。即调整时,500ms闪烁一次
   		{
		timecount=0;       //程序法计时清零,即变量timecount归零
    		flag=~flag;        //取反
   		}
	if(re_disp>=200  ){re_disp=0;if(id)id=0;}     // 当超过10s时执行。即调整状态下按键无操作10s自动返回正常显示状态
}


/*************************************/
/************延时函数*****************/
/**********功能说明:延时**************/
/*************************************/
void delay(unsigned char k)			//延时函数
{
	unsigned char i,j;
	for(i=0;i<k;i++)                       //延时10*50次
		for(j=0;j<50;j++);
}


/***************************************/
/**************显示函数*****************/
/***功能说明:利用人眼惰性动态显示时间***/
/******可根据共阴或共阳数码管调整*******/
/*********本实验用到的是共阳管**********/
/***************************************/
void display(void)			//显示函数
{
	if(flag&hour)		//如hour为1表示调整时,flag为1时不显示
		{
			led0=0;leddata=0xff;delay(10);led0=1;       //第一个数码管(led0)启动,但全部不亮;延时;第一个数码管关闭
			led1=0;leddata=0xff&~((unsigned char)~flag<<7);delay(10);led1=1;    //第二个数码管(led1)启动,但全部不亮;延时;第二个数码管(led1)关闭 	//&~((unsigned char)~flag<<7)该句根据flag的值决定来 显示小数点,为1时显示,2个小数点分隔开时、分、秒,下同                                                                                              
		}
	else			//flag为0时显示,产生闪烁效果
		{
			leddata=tab[Read1302(hou|read)/16];led0=0;delay(10);led0=1;    //读取ds1302的数据并取高四位的值,以此值作为tab数组的下标,并取该下标数组的值赋给leddata在led0显示出来,延时,led0关闭
			leddata=tab[Read1302(hou|read)%16]&~((unsigned char)~flag<<7);led1=0;delay(10);led1=1;   //把读取ds1302的数据并取低四位的值,以此值作为tab数组的下标,并把该下标数组的值和小数点是否闪烁的值赋给leddata在led1显示出来,延时,led1关闭
		}
	if(flag&minute)		//如minute为1表示调整时,flag为1时不显示
		{
			led2=0;leddata=0xff;delay(10);led2=1;        //led2启动,但全部不亮;延时;led2关闭
			led3=0;leddata=0xff&~((unsigned char)~flag<<7);delay(10);led3=1;}   //led3启动,但全部灭;延时;led3关闭	
	else			//flag为0时显示,产生闪烁效果
		{
			leddata=tab[Read1302(min|read)/16];led2=0;delay(10);led2=1;    //读取ds1302的数据并取高四位的值,以此值作为tab数组的下标,并取该下标数组的值赋给leddata在led2显示出来,延时,led2关闭
			leddata=tab[Read1302(min|read)%16]&~((unsigned char)~flag<<7);led3=0;delay(10);led3=1;     //把读取ds1302的数据并取低四位的值,以此值作为tab数组的下标,并把该下标数组的值和小数点是否闪烁的值赋给leddata在led3显示出来,延时,led3关闭
		}
	if(flag&second)		//如second为1表示调整时,flag为1时不显示
		{
			led4=0;leddata=0xff;delay(10);led4=1;        //led4启动,但该数码管不亮;延时;led4关闭
			led5=0;leddata=0xff&~((unsigned char)~flag<<7);delay(10);led5=1;     //led5启动,但该数码管不亮;延时;led5关闭
		}
	else		        //flag为0时显示,产生闪烁效果,下同
		{
			leddata=tab[Read1302(sec|read)/16];led4=0;delay(10);led4=1;    //读取ds1302的数据并取高四位的值,以此值作为tab数组的下标,并取该下标数组的值赋给leddata在led4显示出来,延时,led4关闭
			leddata=tab[Read1302(sec|read)%16];led5=0;delay(10);led5=1;    //把读取ds1302的数据并取低四位的值,以此值作为tab数组的下标,并把该下标数组的值掣鴏eddata在led5显示出来,延时,led5关闭
		}
}


/****************************************************/
/*******************键盘检测函数*********************/
/***功能说明:检测按下SET键的次数并跳到相应处理函数***/
/****************************************************/
void Scan_Key(void)				//键盘检测函数
{
	display();		//程序开头调用显示函数
	if(!SET)					
		{
			while(!SET)display();	//等待按键释放,如一直按下一直调用显示函数,防止显示中断
			re_disp=0;		    //清除记数,重新开始10s定时
			id++;if(id>3)id=0;		//id加1,后面根据id值对应调整项目
		}
	if(id==0){hour=0;minute=0;second=0;}	//根据id值跳到相应处理函数
	if(id==1){hour=1;id_case1_key();}	//id为1,选择调整小时位,闪烁标志位置1,然后跳到键盘处理函数,下同
	if(id==2){hour=0;minute=1;id_case1_key();}	 //id为2,选择调整分钟位,闪烁标志位置1,然后跳到键盘处理函数

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -