中国中小企业电子产品方案技术服务资讯平台         中软创芯电子 | 发布信息 | 设为首页 | 加入收藏

     

首页   维修专栏   产品中心   技术频道   资讯快递   应用专题   供求信息   开发案例   联系我们
 电子产品方案设计|单片机程序开发|工业控制板订制
站内搜索:
推荐文章
基于NiosⅡ的直流电机PID调速控..
基于ARM的单相电力计量装置现场..
基于单片机C8051F130的远程在线..
基于VB与单片机技术的温度测控..
基于混沌蚁群的神经网络速度辨..
基于CANOPEN协议的智能消防水炮..
CC2430与DS18B20的粮库温度传感..
声传感器网络节点的硬件系统设..
基于Lonworks现场总线的机房监..
基于Windows CE的超市预收款系..
基于单片机及CPLD技术的B超检测..
施耐德QUANTUM PLC在炼钢转炉..
变频器在中央空调和采暖通风空..
嵌入式以太网数字语音广播系统..
基于μC/OS-Ⅱ的线控转向Fle..

 首页 >> 技术频道 >> 单片机技术
基于单片机设计的时钟程序DS1302 C语言程序
设备技术网   时间:2010-4-14

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;
}

 
第1页 第2页 第3页 第4页 第5页 第6页 第7页 第8页 第9页 第10页 第11页
>>上一篇: 自动化技术助力智能营销走上“舞台”
>>下一篇: 基于C8051F340双串口电梯远程控制的系统设计
打印】 【关闭
【资讯版权声明】
 1. 本站所提供资源均为原文章或程序作者提供和网友推荐收集整理而来,仅供学习和研究使用,不得用于商业用途。
 2. 本站转载自其它媒体的信息,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。
 3. 未经本站明确许可,任何网站不得非法盗链软件下载连接及抄袭本网站原创内容资源。
 4. 部分内容来源于网络,如侵犯您的版权,请通知本站即撤。

关于创芯  维修指引  开发案例  版权声明  友情连接  联系我们 
Copyright©2006-2010 设备技术网 | 中软创芯 版权所有
电话:0755-33122368 传真:0755-83255830 E-mail:szbase@126.com QQ:1092081589
致力于单片机技术应用推广,电子产品方案设计,控制器设计,电路板复制,工控板开发,单片机开发
本站资源仅供学习参考,部分内容来源于网络,如侵犯您的版权,请通知本站即撤
ICP备案序号:粤ICP备10019209号