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

📄 clock.c

📁 定时闹钟小程序 实现了自动提醒功能 可自由设置时间
💻 C
📖 第 1 页 / 共 2 页
字号:
/*一个小小的闹钟程序*/
/*ds1302 24c02 蜂鸣器 独立按键 数码块显示*/
/*显示时分秒 可调 闹钟*/

#include < reg52.h>
#define uint unsigned int
#define uchar unsigned char
//================================================================
/****************************i/o口定义****************************/
/*1302管脚*/
sbit  T_RST=P2^2;
sbit  T_IO=P2^4;
sbit  T_CLK=P2^5;
/*蜂鸣器*/
sbit  FMQ=P2^3;
/*2401*/
sbit  sda_i2c=P2^1;
sbit  scl_i2c=P2^2;
/*独立按键*/
sbit k1=P3^4;
sbit k2=P3^2;
sbit k3=P3^3;

uchar key1=0,key2=0,key3=0;
uchar k1_d,add,rec,ac;
void key_chuli();
void key_scan();
/*数码管*/
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void display(uchar ,uchar ,uchar ,uchar ,uchar ,uchar );
void Delay(char z);
void init_led();
uchar wei_1,wei_2,wei_3,v,wei_4,wei_5,wei_6;

void dis_time();
/****************************************************************/
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
/***************************变量定义****************************/
uchar time[13];
uchar sec,min,hou,day,mon,yea;
uchar min_d,hou_d;
uchar ling_f=1;
uchar star;
sbit ling_ff=P1^7;
sbit P_0=P1^0;
sbit P_1=P1^1;
sbit P_2=P1^2;
sbit P_3=P1^3;
sbit P_4=P1^4;
sbit P_5=P1^5;
sbit P_6=P1^6;
//=================================================================
/**************************i2c变量定义****************************/
/***************************函数声明******************************/
//void Init1302(void);
void v_WTInputByte(uchar ucDa);//写入1Byte数据
uchar uc_RTOutputByte(void);//读取1Byre数据
void v_W1302(uchar ucAddr, uchar ucDa);//先写地址,后写命令/数据
uchar uc_R1302(uchar ucAddr); //先写地址,后读命令/数据
//void Init1302(void); //初始化DS1302?
void donetime(void); //时间转换
void SetTime(void);  //时间设置
/********************************************************************
*
* 名称: v_RTInputByte
* 说明:
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
***********************************************************************/
void v_WTInputByte(uchar ucDa)
{
uchar i;
ACC= ucDa;
for(i=8; i>0; i--)
   {
    T_IO = ACC0; //*相当于汇编中的 RRC
    T_CLK = 1;
    T_CLK = 0;
    ACC =ACC>> 1;
   }
}
/********************************************************************
*
* 名称: uchar uc_RTOutputByte
* 说明:
* 功能: 从DS1302读取1Byte数据
* 调用:
* 输入:
* 返回值: ACC
***********************************************************************/
uchar uc_RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
    {
    ACC = ACC>>1; //*相当于汇编中的 RRC
    ACC7 = T_IO;
    T_CLK = 1;
    T_CLK = 0;
    }
return(ACC);
}
/********************************************************************
*
* 名称: v_W1302
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
* 调用: v_RTInputByte()
* 输入: ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_WTInputByte(ucAddr); /* 地址,命令 */
 v_WTInputByte(ucDa); /* 写1Byte数据*/
 T_CLK = 1;
 T_RST =0;
}
/********************************************************************
*
* 名称: uc_R1302
* 说明: 先写地址,后读命令/数据
* 功能: 读取DS1302某地址的数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: ucAddr: DS1302地址
* 返回值: ucDa :读取的数据
***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
 uchar ucDa;
 T_RST = 0;
 T_CLK = 0;
 T_RST = 1;
 v_WTInputByte(ucAddr); /* 地址,命令 */
 ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
 T_CLK = 1;
 T_RST =0;
return(ucDa);
}
/***********************************************************************
* 名称: Init1302
* 说明:
* 功能: 初始化DS1302
* 调用:
* 输入:
* 返回值: 无
*****************************************************************************/
/*void Init1302(void)
{
 v_W1302(0x8e,0x00); //控制写入WP=0  允许写入
 v_W1302(0x90,0xa5); //使能涓流充电
 //v_W1302(0x90,0x00); //禁止涓流充电
 v_W1302(0x80,0x45); //秒
 v_W1302(0x82,0x59); //分
 v_W1302(0x84,0x13); //时
 v_W1302(0x86,0x01); //日
 v_W1302(0x88,0x08); //月
 v_W1302(0x8a,0x03); //星期
 v_W1302(0x8c,0x07); //年 
 v_W1302(0x8e,0x80); //控制写入WP=1  禁止写入
} */
/**************************************************************************
* 名称: donetime
* 说明:
* 功能: 时间处理
* 调用:
* 输入:
* 返回值: 无
*****************************************************************************/
void donetime(void)
{
 uchar d;
 d=uc_R1302(0x81); //读 秒
 time[1]=d/16+48;  //秒的十位
 time[0]=d%16+48;  //秒的个位
 d=uc_R1302(0x83); //读 分
 time[3]=d/16+48;  //分的十位
 time[2]=d%16+48;  //分的个位
 d=uc_R1302(0x85); //读 时
 time[5]=d/16+48;  //时的十位
 time[4]=d%16+48;  //时的个位
 d=uc_R1302(0x8b); //读 周
 time[7]=d/16+48;  //周的十位
 time[6]=d%16+48;  //周的个位
 d=uc_R1302(0x87); //读 日
 time[9]=d/16+48;  //日的十位
 time[8]=d%16+48;  //日的个位
 d=uc_R1302(0x89); //读 月
 time[11]=d/16+48; //月的十位
 time[10]=d%16+48; //月的个位
 d=uc_R1302(0x85); //读 年
 time[13]=d/16+48; //年的十位
 time[12]=d%16+48; //年的个位

 sec=(time[1]-0x30)*10+time[0]-0x30;
 min=(time[3]-0x30)*10+time[2]-0x30;
 hou=(time[5]-0x30)*10+time[4]-0x30;
}
/***************************************************************************
* 名称: SetTime
* 说明:
* 功能: 时间设置
* 调用:
* 输入:
* 返回值: 无
*****************************************************************************/
void SetTime(void)
{
 uchar sec_s,min_s,hou_s;
 sec_s=(sec/10)*16+sec%10;
 min_s=min/10*16+min%10;
 hou_s=hou/10*16+hou%10;
 v_W1302(0x8e,0x00); //控制写入WP=0  允许写入
 v_W1302(0x80,sec_s);
 v_W1302(0x82,min_s);
 v_W1302(0x84,hou_s);
 v_W1302(0x86,day);
 v_W1302(0x88,mon);
 v_W1302(0x8c,yea);
 v_W1302(0x80,0x00);
 v_W1302(0x8e,0x80);//控制写入WP=1  禁止写入
}
//=======================================================================
/*****************************i2c=2401读写******************************/
//=======================================================================

void delay_i2c()
{ ;; }
void start_i2c()  //开始信号
{
	sda_i2c=1;
	delay_i2c();
	scl_i2c=1;
	delay_i2c();
	sda_i2c=0;
	delay_i2c();
}
void stop_i2c()   //停止
{
	sda_i2c=0;
	delay_i2c();
	scl_i2c=1;
	delay_i2c();
	sda_i2c=1;
	delay_i2c();
}
void respons_i2c()  //应答
{
	uchar i;
	scl_i2c=1;
	delay_i2c();
	while((	sda_i2c==1)&&(i<250))i++;
	scl_i2c=0;
	delay_i2c();
}

void init_i2c()
{
	sda_i2c=1;
	delay_i2c();
	scl_i2c=1;
	delay_i2c();
}
void write_byte_i2c(uchar date)
{
	uchar i,temp;
	temp=date;
	for(i=0;i<8;i++)
	{
	temp=temp<<1;
	scl_i2c=0;
	delay_i2c();
	sda_i2c=CY;
	delay_i2c();
	scl_i2c=1;
	delay_i2c();
	}
	scl_i2c=0;
	delay_i2c();
	sda_i2c=1;
	delay_i2c();
}

uchar read_byte_i2c()
{
	uchar i,k;
	scl_i2c=0;
	delay_i2c();
	sda_i2c=1;
	delay_i2c();
	for(i=0;i<8;i++)
	{
	scl_i2c=1;
	delay_i2c();
	k=(k<<1)|sda_i2c;
	scl_i2c=0;
	delay_i2c();
	}
	return k;
}

void write_add_i2c(uchar address,uchar date)
{
	start_i2c();
	write_byte_i2c(0xa0);
	respons_i2c();
	write_byte_i2c(address);
	respons_i2c();
	write_byte_i2c(date);
	respons_i2c();
	stop_i2c();
}

uchar read_add_i2c(uchar address)
{
	uchar date;
	start_i2c();
	write_byte_i2c(0xa0);
	respons_i2c();
	write_byte_i2c(address);
	respons_i2c();
	start_i2c();
	write_byte_i2c(0xa1);
	respons_i2c();
	date=read_byte_i2c();

⌨️ 快捷键说明

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