📄 clock.c
字号:
/*一个小小的闹钟程序*/
/*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 + -