STC12C2052AD+TM1640+DS1302闹钟
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闹钟相关推荐
- STC89C52RC单片机实现简单定时闹钟+LCD1602+DS1302
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一.各模块基本原理 1.DS1302. 1.介绍. 2.内部结构. 3.时钟日历控制寄存器 4.DS130231字节的RA ...
- 用单片机用c语言做闹钟,基于单片机与ds1302时钟芯片的电子闹钟C程序
原标题:基于单片机与ds1302时钟芯片的电子闹钟C程序 #include #define w_second 0x80 //秒写入地址 #define w_minute 0x82 //分写入地址 #d ...
- 36、基于STM32的电子闹钟(DS1302)
编号:36 基于STM32的电子闹钟(DS1302) 功能描述: 本设计由STM32单片机+液晶1602+按键+DS1302时钟模块+声光报警模组成. 1.采用STM32F103最小系统. 2.利用D ...
- stm32怎么基于ds1302实现闹钟功能,不使用定时器
在STM32上实现基于DS1302的闹钟功能需要使用I2C总线进行通信. 步骤如下: 配置STM32的I2C接口,并初始化DS1302. 读取DS1302上的时钟数据,并将其存储到STM32的内存中. ...
- 基于51单片机、DS1302时钟模块的电子闹钟设计
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.设计原理 1.DS1302介绍 2.闹钟音乐播放原理 二.程序设计 1.DS1302.h 2.ds1302.c 3.mu ...
- 51单片机+ds1302+lcd1602简易电子时钟(带闹钟功能)
51单片机+ds1302+lcd1602简易电子时钟(带闹钟功能) AT89C52.LCD1602.DS1302.speaker. Proteus仿真 实例代码 #include<reg52.H ...
- c语言万年历闹钟程序,c语言编写的万年历 有平年闰年 有闹钟功能.docx
#include #include"lcd1602.h" #include"ds1302.h" #include"ds18b20.h" #d ...
- 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》...
引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...
- 60秒计时器的仿真电路_DS1302的电子万年历,时间、闹钟可调,带温度农历显示,原理图、仿真和代码...
获取设计资源,请见文末说明~ 设计要求 1.显示公历年.月.日.星期.时.分.秒: 2.可随时调校年.月.日.时.分.秒: 3.能显示农历时间,并能标明平润年: 4.具有闹钟设定提醒功能: 5.能够显 ...
- android课程设计时钟,单片机制作的电子钟(含闹钟功能)课程设计报告
#include #include unsigned char code displaywelcome[]={" Welcome To My Lcd Timer"};//欢迎界面 ...
最新文章
- 安装SQL2012 提示 setup account privileges Failed 解决办法
- python小结_python简单小结
- 【[TJOI2018]异或】
- 程序员初试和复试_程序员因肌肉发达面试被质疑能力,网友:这做程序员有啥关系呢?...
- P2375 [NOI2014] 动物园 kmp fail指针/倍增
- 中国剩余定理 互质与非互质版本
- oracle连接数达不到上限,Oracle超出最大连接数问题及解决(转)
- ​​2021快手母婴行业数据价值报告
- MFC如何让输入框只能输入数字
- AI机器视觉技术在生活中的应用
- Ubuntu关闭cups打印机服务
- 不用花钱,让你百度网盘满速下载的神器!简单实用教程
- postgresql开启日志
- 用java制作扑克牌_java实现简单扑克牌游戏
- 淘宝SEO优化提高流量的绝密办法
- c语言报告对老师的致谢,论文对老师的致谢
- 商品sku规格选择效果,没有商品的不能选中,选择顺序不影响展示结果
- java架构模式与设计模式(三)--事件风暴
- matlab对于椭圆检测的算法,基于弧段组合的椭圆检测算法研究
- 指针变量的基本概念详解(go语言基础语法)