5 基于DS1302时钟芯片万年历 * Copyright (c) 2009,雲塘隱士東瓜电子工作室 * All rights reserved. * 摘 要: 万年历:前两位显示分钟,后两位显示秒, 硬件连接: 1.P0口连接到4位数码管的数据端 2.四个数码管的位码口定义 小时: sbit P10 = P1^0; sbit P11 = P1^1; 分钟: sbit P12 = P1^2; sbit P13 = P1^3; 3.功能按键 模式选择键: sbit Mode = P2^0; 上调键: sbit UP = P2^1; 下调键: sbit DN = P2^2; 4.显示调节时按键指示 调时显示: sbit led1 = P2^3; 调分显示: sbit led2 = P2^4; 调闹钟时显示:sbit led3 = P2^5; 调闹钟分显示:sbit led4 = P2^6; 5.DS1302与MCU连接 DS1302时钟信号: sbit SCLK = P3^5; 7脚 DS1302数据信号: sbit DIO = P3^6; 6脚 DS1302片选: sbit CE = P3^7; 5脚 操作描述:按M键一次,进入修改小时模式,led1亮 按M键二次,进入修改分钟模式,led2亮 按M键三次,进入修改闹钟小时模式,led3亮 按M键四次,进入修改闹钟分钟模式,led4亮 按M键五次,退出修改模式 , 按UP或DN键可对小时或分钟进行修改(加或减) 程序要点: * 文件名称: main.c * CPU芯片: STC89C52RC * 主频: 11.0592MHZ * * 当前版本: 1.0 * 作 者:云塘东瓜 * 完成日期: 2009年6月1日 * 修改时间: 2009年6月4日 * 备注:可以修改显示数据,可以显示年月日、周、时分秒 *******************************************************************************/ #include <reg52.h> /********************************宏定义DS1302寄存器读写地址*************************/ #define WRITE_SECOND 0x80 #define WRITE_MINUTE 0x82 #define WRITE_HOUR 0x84 #define WRITE_DAY 0x86 #define WRITE_MONTH 0x88 #define WRITE_WEEK 0x8A #define WRITE_YEAR 0x8C #define WRITE_TIMER_FLAG 0xC0 #define READ_SECOND 0x81 #define READ_MINUTE 0x83 #define READ_HOUR 0x85 #define READ_DAY 0x87 #define READ_MONTH 0x89 #define READ_WEEK 0x8B #define READ_YEAR 0x8D #define READ_TIMER_FLAG 0xC1 #define WRITE_PROTECT 0x8E /******************************************************************************/ /*********************************宏定义定时计数器初值******************************/ #define THCO 0xee //定时值5us #define TLCO 0x00 /*****************************************************************************/ /*********************DS1302与MCU连接脚及驱动程序中用到的累加器定义*****************/ //位寻址寄存器定义 sbit ACC_7 = ACC^7; //管脚定义 sbit SCLK = P3^5; // DS1302时钟信号 7脚 sbit DIO = P3^6; // DS1302数据信号 6脚 sbit CE = P3^7; // DS1302片选 5脚 /****************************************************************************/ /*******************************4位数码管段码、片选及时钟变量定义*******************/ //共阴极数码管,0-9段码表 unsigned char code Duan[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //四个数码管显示数值,数组变量定义 unsigned char Data_Buffer[4]={0,0,0,0}; //秒分计时变量 unsigned char Sec = 40,Min=18,Hour=12,Day =1,Mon = 6,Week = 1,Year = 9; //闹铃设置变量 unsigned char Set_Sec = 5,Set_Min = 20, Set_Hour = 12,Set_Day =1,Set_Mon = 6,Set_Week = 1,Set_Year = 9; /********************************************************************************/ /**********************************标志位定义***************************************/ //设置掉电走时标志(timer_flag_rom初始化时写入rom下次与timer_flag比较) unsigned char timer_flag = 0x14,timer_flag_rom = 0x20; //模式切换标志 unsigned char flag_mode = 1; //显示时钟标志,为1时显示走时或显示调节值(与flag结合) bit flag_timer = 1; //设置状态标志 bit Set_flag=0; //动态扫描时间到标志/显示走时标志位,为1时显示 bit flag=1; //走时设定标志 bit set_timer=1; //开启走时标志 bit timer=1; /****************************************************************************/ /*******************************led脚、数码管片选脚及功能设置脚定义*****************/ //四个数码管的位码口定义 sbit P10 = P1^0; sbit P11 = P1^1; sbit P12 = P1^2; sbit P13 = P1^3; //功能按键 sbit Mode = P2^0; sbit UP = P2^1; sbit DN = P2^2; //led调节显示 sbit led1 = P2^3; sbit led2 = P2^4; sbit led3 = P2^5; sbit led4 = P2^6; //闹铃蜂鸣器 sbit P14 = P1^4; /*******************************************************************************/ /**********************************十进制转换为十六进制子程序***************************/ /*****函数名称:unsigned char O_to_H(unsigned char n) ******功能: 十进制转换为十六进制 ******参数传递:有,十进制数n ******返回值: 有,转换后的十六进制数 ******创建时间:2009.6.1 ******修改时间: ******/ /*******************************************************************************/ unsigned char O_to_H(unsigned char n) { unsigned char temp1; temp1 = n/10*16 + n%10; return(temp1); } /******************************************************************************/ /**********************************地址、数据发送子程序*****************************/ /*****函数名称:void Write1302 (unsigned char addr,dat) ******功能: 串行发送地址、数据,先发低位,且在上升沿发送 ******参数传递:有,地址和数据 ******返回值: 无 ******创建时间:2009.6.1 ******修改时间: ******/ /******************************************************************************/ void Write1302 (unsigned char addr,dat) { unsigned char i,temp; CE=0; //CE引脚为低,数据传送中止 SCLK=0; //清零时钟总线 CE = 1; //CE引脚为高,逻辑控制有效 //发送地址 for ( i=8; i>0; i-- ) //循环8次移位 { SCLK = 0; temp = addr; DIO = (bit)(temp&0x01); //每次传输低字节 addr >>= 1; //右移一位 SCLK = 1; } //发送数据 for ( i=8; i>0; i-- ) { SCLK = 0; temp = dat; DIO = (bit)(temp&0x01); dat >>= 1; SCLK = 1; } CE = 0; } |