STC12C2052AD+TM1640+DS1302闹钟

LED.c:

#include"xlw_time.h"
short xdata spot[14];   char num=0;
unsigned char DisplayData[15];
unsigned char code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*******************************************************************************
* 函 数 名         : delay
* 函数功能         : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(unsigned char i)
{while(i--);
}/*******************************************************************************
* 函 数 名         : datapros()
* 函数功能         : 时间读取处理转换函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void datapros()
{Ds1302ReadTime();DisplayData[0] = smgduan[2];         //年 DisplayData[1] = smgduan[0];   DisplayData[2] = smgduan[TIME[6]/16];              DisplayData[3] = smgduan[TIME[6]&0x0f];DisplayData[4] = smgduan[TIME[4]/16];              //月DisplayData[5] = smgduan[TIME[4]&0x0f]; DisplayData[6] = smgduan[TIME[3]/16];              //日DisplayData[7] = smgduan[TIME[3]&0x0f]; DisplayData[8] = smgduan[TIME[2]/16];              //时DisplayData[9] = smgduan[TIME[2]&0x0f]; DisplayData[10] = smgduan[TIME[1]/16];             //分DisplayData[11] = smgduan[TIME[1]&0x0f];    DisplayData[12] = smgduan[TIME[0]/16];             //秒DisplayData[13] = smgduan[TIME[0]&0x0f];DisplayData[14] = TIME[5]&0x0f;
}
/*******************************************************************************
* 函 数 名         : datapros()
* 函数功能         : 时间处理转换函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void unReaddatapros()
{DisplayData[0] = smgduan[2];                      //年 DisplayData[1] = smgduan[0];   DisplayData[2] = smgduan[TIME[6]/16];              DisplayData[3] = smgduan[TIME[6]&0x0f];DisplayData[4] = smgduan[TIME[4]/16];              //月DisplayData[5] = smgduan[TIME[4]&0x0f]; DisplayData[6] = smgduan[TIME[3]/16];              //日DisplayData[7] = smgduan[TIME[3]&0x0f]; DisplayData[8] = smgduan[TIME[2]/16];              //时DisplayData[9] = smgduan[TIME[2]&0x0f]; DisplayData[10] = smgduan[TIME[1]/16];             //分DisplayData[11] = smgduan[TIME[1]&0x0f];    DisplayData[12] = smgduan[TIME[0]/16];             //秒DisplayData[13] = smgduan[TIME[0]&0x0f];DisplayData[14] = TIME[5]&0x0f;                        //星期
}
/*******************************************************************************
* 函数名         :DigDisplay()
* 函数功能       :数码管显示函数
* 输入           : 无
* 输出             : 无
*******************************************************************************/
void DigDisplay(unsigned int m)
{unsigned short spot[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,};spot[DisplayData[14]-1]=1;if(m==1){//  spot[10]=1;spot[11]=1;}else if(m==2){spot[9]=1;
//  spot[8]=1;}else if(m==3){spot[7]=1;
//  spot[6]=1;}disp(DisplayData,spot) ;
}/*********************
按键调整,处理函数
k1按键:调整的启动与关闭。
k2按键:选择时,分,日。(按一次,两次,三次)
k3按键:减小。
k4按键:增加。
**********************/
void adjustd(){unsigned int key;while(1){unReaddatapros();   //数据处理函数DigDisplay(3);//数码管显示函数key=key_scan();
if(key==4){TIME[3]++;TIME[5]++;Ds1302Init();
}else if(key==3){if(TIME[3]<=0){TIME[3]=0;}else{TIME[3]--;TIME[5]--;}    Ds1302Init();
}else if(key==1){break;
}else if(key==2){break;
}delay_nms(100);
}
}
void adjusth(){unsigned int  key;while(1){unReaddatapros();  //数据处理函数DigDisplay(2);//数码管显示函数key=key_scan();
if(key==4){if(TIME[2]>=24){TIME[2]=24;}else  TIME[2]++;    Ds1302Init();
}else if(key==3){if(TIME[2]<=0){TIME[2]=0;}else  TIME[2]--;  Ds1302Init();
}else if(key==1){break;
}else if(key==2){adjustd();
}delay_nms(100);
}
}
void adjustm(){unsigned     int  key;while(1){unReaddatapros();  //数据处理函数DigDisplay(1);//数码管显示函数key=key_scan();
if(key==4){if(TIME[1]>=60){TIME[1]=60;}else  TIME[1]++;    Ds1302Init();
}else if(key==3){if(TIME[1]<=0){TIME[1]=0;}else  TIME[1]--;  Ds1302Init();
}else if(key==1){break;
}else if(key==2){adjusth();break;
}delay_nms(100);
}
}/*******************************************************************************
* 函 数 名       : main
* 函数功能       : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{   unsigned    int key;Ds1302Init();while(1){delay_nms(100);key=key_scan();if(key==1){adjustm();}else{datapros();    //数据处理函数DigDisplay(0);//数码管显示函数
}       }
}

xlw_time.h:

 /******************************************************************************版权信息:xlwreally*文 件 名: xlw_time.h*当前版本:V1.0*MCU 型号:STC12C2052AD*开发环境:Keil uVision4*晶震频率:12MHZ       *完成日期:2020-11-19*程序功能:TM1640时间显示程序;*免责声明:1.此程序为TM1640时间显示程序,仅作参考之用。2.如有直接使用本例程程序造成经济损失的,本人不承担任何责任
********************************************************************************/
//xlw-time.h
#ifndef _XLW_TIME_H_ //如果没有引入头文件
#define _XLW_TIME_H_ //那就引入头文件#include"xlw_driver.h"//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif#ifndef uint
#define uint unsigned int
#endif//---定义ds1302使用的IO口---//
sbit DSIO=P1^4;
sbit RST=P1^3;
sbit SCLK=P1^5;//---定义全局函数---//
void Ds1302Write(uchar addr, uchar dat);
uchar Ds1302Read(uchar addr);
void Ds1302Init();
void Ds1302ReadTime();//---加入全局变量--//
extern uchar TIME[7];   //加入全局变量
//---DS1302写入和读取时分秒的地址命令---//
//---秒分时日月周年 最低位读写位;-------//
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};//---DS1302时钟初始化2020年11月24日星期六12点00分00秒。---//
//---存储顺序是秒分时日月周年,存储格式是用BCD码---//
uchar TIME[7] = {0x0, 0x05, 0x15, 0x25, 0x11, 0x03, 0x20};/*******************************************************************************
* 函 数 名         : Ds1302Write
* 函数功能         : 向DS1302命令(地址+数据)
* 输    入         : addr,dat
* 输    出         : 无
*******************************************************************************/
void Ds1302Write(uchar addr, uchar dat)
{uchar n;RST = 0;_nop_();SCLK = 0;//先将SCLK置低电平。_nop_();RST = 1; //然后将RST(CE)置高电平。_nop_();for (n=0; n<8; n++)//开始传送八位地址命令{DSIO = addr & 0x01;//数据从低位开始传送addr >>= 1;SCLK = 1;//数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;_nop_();}for (n=0; n<8; n++)//写入8位数据{DSIO = dat & 0x01;dat >>= 1;SCLK = 1;//数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;_nop_();    }   RST = 0;//传送数据结束_nop_();
}
/*******************************************************************************
* 函 数 名         : Ds1302Read
* 函数功能         : 读取一个地址的数据
* 输    入         : addr
* 输    出         : dat
*******************************************************************************/
uchar Ds1302Read(uchar addr)
{uchar n,dat,dat1;RST = 0;_nop_();SCLK = 0;//先将SCLK置低电平。_nop_();RST = 1;//然后将RST(CE)置高电平。_nop_();for(n=0; n<8; n++)//开始传送八位地址命令{DSIO = addr & 0x01;//数据从低位开始传送addr >>= 1;SCLK = 1;//数据在上升沿时,DS1302读取数据_nop_();SCLK = 0;//DS1302下降沿时,放置数据_nop_();}_nop_();for(n=0; n<8; n++)//读取8位数据{dat1 = DSIO;//从最低位开始接收dat = (dat>>1) | (dat1<<7);SCLK = 1;_nop_();SCLK = 0;//DS1302下降沿时,放置数据_nop_();}RST = 0;_nop_();    //以下为DS1302复位的稳定时间,必须的。SCLK = 1;_nop_();DSIO = 0;_nop_();DSIO = 1;_nop_();return dat;
}
/*******************************************************************************
* 函 数 名         : Ds1302Init
* 函数功能         : 初始化DS1302.
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Ds1302Init()
{uchar n;Ds1302Write(0x8E,0X00);         //禁止写保护,就是关闭写保护功能for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年{Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);  }Ds1302Write(0x8E,0x80);         //打开写保护功能
}
/*******************************************************************************
* 函 数 名         : Ds1302ReadTime
* 函数功能         : 读取时钟信息
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Ds1302ReadTime()
{uchar n;for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年{TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);}}#endif

xlw_driver.h:

/******************************************************************************版权信息:xlwreally*文 件 名: xlw_drive.h*当前版本:V1.0*MCU 型号:STC12C2052AD*开发环境:Keil uVision4*晶震频率:12MHZ       *完成日期:2020-11-19*程序功能:TM1640驱动程序*免责声明:1.此程序为TM1640驱动程序,仅作参考之用。2.如有直接使用本例程程序造成经济损失的,本人不承担任何责任
********************************************************************************/
//xlw-driver.h
#ifndef _XLW_DRIVER_H_ //如果没有引入头文件#define _XLW_DRIVER_H_ //那就引入头文件#include <STC12C2052AD.h>          //头文件
#include "intrins.h"         //包含_nop_()指令头文件/********************定义控制端口**********************/
sbit DIN=P1^0;
sbit CLK=P1^1;
sbit BEEP=P1^2;
sbit K1=P3^0;
sbit K2=P3^1;
sbit K3=P3^2;
sbit K4=P3^3;
sbit Led2=P3^5;
sbit Led1=P3^7;
/********************定义数据*************************/
//unsigned char code CODE[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,};  /********************延时函数,延时nms******************/
void delay_nms(unsigned int n)
{unsigned int i;
while(n--)
for(i=0;i<550;i++);
}/********************Start函数*************************/
void I2CStart()
{DIN=1;CLK=1;_nop_();_nop_();DIN=1; _nop_();_nop_();DIN=0;_nop_();_nop_();_nop_();_nop_();CLK=0;_nop_();_nop_();
}
/********************Stop函数*************************/
void I2CStop()
{CLK=1;_nop_();_nop_();DIN=0;_nop_();_nop_();DIN=1;_nop_();_nop_();CLK=0;DIN=0;}/***************发送8bit数据,从低位开始**************/
void I2CWritebyte(unsigned char oneByte)
{unsigned char i;for(i=0;i<8;i++){CLK=0;if(oneByte&0x01) DIN=1;else DIN=0;_nop_();_nop_();_nop_();CLK=1;oneByte=oneByte>>1;}CLK=0;_nop_();_nop_();_nop_();_nop_();DIN=0;_nop_();_nop_();
}
void write(unsigned char  num[14],short spot[14] ){I2CWritebyte(num[13]+spot[13]*128);
I2CWritebyte(num[12]+spot[12]*128);
I2CWritebyte(num[7]+spot[7]*128);
I2CWritebyte(num[6]+spot[6]*128);
I2CWritebyte(num[5]+spot[5]*128);
I2CWritebyte(num[4]+spot[4]*128);
I2CWritebyte(num[10]+spot[10]*128);
I2CWritebyte(num[11]+spot[11]*128);
I2CWritebyte(num[2]+spot[2]*128);
I2CWritebyte(num[9]+spot[9]*128);
I2CWritebyte(num[8]+spot[8]*128);
I2CWritebyte(num[3]+spot[3]*128);
I2CWritebyte(num[0]+spot[0]*128);
I2CWritebyte(num[1]+spot[1]*128);}
/************显示函数************/
void disp(unsigned char  *num,unsigned short *spot)
{I2CStart();I2CWritebyte(0x40); //数据命令设置:普通模式,地址自动加一I2CStop();I2CStart();I2CWritebyte(0xc2);  //地址命令设置:初始地址02Hwrite(num,spot);I2CStop();I2CStart();I2CWritebyte(0x8c); //显示控制:显示开,脉冲宽度设为11/16I2CStop();Led2=~Led2;Led1=~Led1;
}int key_scan()
{int KeyV=0;               if(K1==0||K2==0||K3==0||K4==0)      //判断是否有按键按下{BEEP=~BEEP; BEEP=~BEEP; if(K1==0)       //判断哪个按键被按下//{  KeyV=1;}else if(K2==0){KeyV= 2;}else if(K3==0){   KeyV=3;}else if(K4==0){KeyV=4;}else {return KeyV;}                  //判断哪个按键被按下//if(KeyV != 0)     //有按键按下时,进行松手检测while(K1==0||K2==0||K3==0||K4==0);}return KeyV;//返回KeyV来标识哪一个按键被按下
}#endif

只做了到日的时间调节,只能调整时分秒的个位时间。最大只能调整到九

STC12C2052AD+TM1640+DS1302闹钟相关推荐

  1. STC89C52RC单片机实现简单定时闹钟+LCD1602+DS1302

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一.各模块基本原理 1.DS1302. 1.介绍. 2.内部结构. 3.时钟日历控制寄存器 4.DS130231字节的RA ...

  2. 用单片机用c语言做闹钟,基于单片机与ds1302时钟芯片的电子闹钟C程序

    原标题:基于单片机与ds1302时钟芯片的电子闹钟C程序 #include #define w_second 0x80 //秒写入地址 #define w_minute 0x82 //分写入地址 #d ...

  3. 36、基于STM32的电子闹钟(DS1302)

    编号:36 基于STM32的电子闹钟(DS1302) 功能描述: 本设计由STM32单片机+液晶1602+按键+DS1302时钟模块+声光报警模组成. 1.采用STM32F103最小系统. 2.利用D ...

  4. stm32怎么基于ds1302实现闹钟功能,不使用定时器

    在STM32上实现基于DS1302的闹钟功能需要使用I2C总线进行通信. 步骤如下: 配置STM32的I2C接口,并初始化DS1302. 读取DS1302上的时钟数据,并将其存储到STM32的内存中. ...

  5. 基于51单片机、DS1302时钟模块的电子闹钟设计

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.设计原理 1.DS1302介绍 2.闹钟音乐播放原理 二.程序设计 1.DS1302.h 2.ds1302.c 3.mu ...

  6. 51单片机+ds1302+lcd1602简易电子时钟(带闹钟功能)

    51单片机+ds1302+lcd1602简易电子时钟(带闹钟功能) AT89C52.LCD1602.DS1302.speaker. Proteus仿真 实例代码 #include<reg52.H ...

  7. c语言万年历闹钟程序,c语言编写的万年历 有平年闰年 有闹钟功能.docx

    #include #include"lcd1602.h" #include"ds1302.h" #include"ds18b20.h" #d ...

  8. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》...

    引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...

  9. 60秒计时器的仿真电路_DS1302的电子万年历,时间、闹钟可调,带温度农历显示,原理图、仿真和代码...

    获取设计资源,请见文末说明~ 设计要求 1.显示公历年.月.日.星期.时.分.秒: 2.可随时调校年.月.日.时.分.秒: 3.能显示农历时间,并能标明平润年: 4.具有闹钟设定提醒功能: 5.能够显 ...

  10. android课程设计时钟,单片机制作的电子钟(含闹钟功能)课程设计报告

    #include #include unsigned char code displaywelcome[]={" Welcome To My Lcd Timer"};//欢迎界面 ...

最新文章

  1. 安装SQL2012 提示 setup account privileges Failed 解决办法
  2. python小结_python简单小结
  3. 【[TJOI2018]异或】
  4. 程序员初试和复试_程序员因肌肉发达面试被质疑能力,网友:这做程序员有啥关系呢?...
  5. P2375 [NOI2014] 动物园 kmp fail指针/倍增
  6. 中国剩余定理 互质与非互质版本
  7. oracle连接数达不到上限,Oracle超出最大连接数问题及解决(转)
  8. ​​2021快手母婴行业数据价值报告
  9. MFC如何让输入框只能输入数字
  10. AI机器视觉技术在生活中的应用
  11. Ubuntu关闭cups打印机服务
  12. 不用花钱,让你百度网盘满速下载的神器!简单实用教程
  13. postgresql开启日志
  14. 用java制作扑克牌_java实现简单扑克牌游戏
  15. 淘宝SEO优化提高流量的绝密办法
  16. c语言报告对老师的致谢,论文对老师的致谢
  17. 商品sku规格选择效果,没有商品的不能选中,选择顺序不影响展示结果
  18. java架构模式与设计模式(三)--事件风暴
  19. matlab对于椭圆检测的算法,基于弧段组合的椭圆检测算法研究
  20. 指针变量的基本概念详解(go语言基础语法)

热门文章

  1. 2022年 hust OJ 最新搭建方式
  2. Python压缩图片到指定大小
  3. ideal_lp.m、freqz_m.m、freqz_m2.m
  4. 数据外推算法 c语言,[原创]如何进行内插法和外推法的计算
  5. 计算机网络第七版课后习题答案(第一章)(20210321)
  6. 营业收费系统 建立报表库服务器,浅谈计算机在自来水收费系统的重要应用
  7. NLPIR词性标记集
  8. 基于ARMA模型的客流预测
  9. 互联网黑产剖析——虚假号码
  10. 微带天线单元建模与辐射