PIC16F84A读取时钟芯片DS1302的简单示例

发布者:芳华逝水最新更新时间:2016-11-03 来源: eefocus关键字:PIC16F84A  读取时钟芯片  DS1302 手机看文章 扫描二维码
随时随地手机看文章
//引入文件***********************************************************

#include      "delay.h"
#include      "delay.c"
#include     
#include     

//熔丝配置***********************************************************
__CONFIG(XT & WDTDIS & PWRTEN & PROTECT);

//引脚定义***********************************************************
#define       RS        RB4                                //选寄存器
#define       EN        RB5                                //信号使能

//时钟芯片***********************************************************
#define       RST       RA0                                //芯片使能 
#define       CLK       RA1                                //芯片时钟
#define       DAT       RA2                                //芯片数据

//显示字符***********************************************************
     unsigned char TopChar[] = {"                "};       //显示缓冲 
     unsigned char BotChar[] = {"                "};       //

//*******************************************************************
//函数名称:portInit();
//输入参数:无
//输出参数:无
//功能描述:端口设置
//建造日期:2008.12.12
//*****************************************************************
void PortInit(void)
 {
     PORTA  = 0x00;                                        //端口设置 
     PORTB  = 0x00;                                        //
 
     TRISA  = 0x00;                                        //方向设置   
     TRISB  = 0x00;                                        //

     OPTION = 0x00;                                        //上拉便能
 }

//*******************************************************************
//函数名称: WriteData(data, rs);
//输入参数:待写数据,0 = 指令 1 = 数据 
//输出参数:无
//功能描述:写1602LCD
//建造日期:2008.12.12
//*******************************************************************
void WriteData(unsigned char data, unsigned char rs)
 {   
     RS = 0;                                               //假设指令

     if (rs & 0x01) RS = 1;                                //实际数据

     PORTB = ((PORTB & 0xf0 ) | (data >> 4));              //写高四位    
     EN = 1;                                               //使能下沿 
     EN = 0;                                               //
     DelayUs(50);                                          //
    
     PORTB = ((PORTB & 0xf0) | (data & 0x0f));             //写低四位
     EN = 1;                                               //使能下沿 
     EN = 0;                                               //                                            
     DelayUs(50);                                          //
 }

//*******************************************************************
//函数名称:AddrSite();
//输入参数:坐标参数
//输出参数:无
//功能描述:设置显示地址
//建造日期:2008.12.12
//*******************************************************************
void AddrSite(unsigned char x, unsigned char y)
 {     
     if (y == 0) WriteData((0x80 | x) , 0);                //首行地址
     
     else WriteData((0xc0 | x), 0);                        //次行地址 
 }

//*******************************************************************
//函数名称:PrintChar(*s, len);
//输入参数:缓冲区首址, 数据长度
//输出参数:无
//功能描述:字符串输出显示
//建造日期:2008.12.12
//*******************************************************************
void PrintChar(unsigned char *s, unsigned char len)
 {   
     do                                                    //循环发送                                      
     {
       WriteData(*s, 1);                                   //显示字符
       s++;                                                //下个字符
     }
     while (--len);                                        //显示一行
 }

//*******************************************************************
//函数名称:LcdInit();
//输入参数:无
//输出参数:无
//功能描述:液晶初始化
//建造日期:2008.12.12
//*******************************************************************
void LcdInit(void)
 {   
     unsigned char i = 3;

     RS = 0;                                               //选择命令
     PORTB = 0x03;                                         //接口设置

     do
     {
       EN = 1;                                             //使能下沿 
       EN = 0;                                             //
       DelayUs(50);      
     }
     while (--i);                                          //循环三次

     PORTB = 0x02;                                         //四线模式
     EN = 1;                                               //使能下沿 
     EN = 0;                                               //
     DelayUs(50);     

     WriteData(0x28, 0);                                   //接口设置
     WriteData(0x0c, 0);                                   //显示打开
     WriteData(0x01, 0);                                   //显示清屏
     WriteData(0x06, 0);                                   //地址递增
 }

//*******************************************************************
//函数名称:WriteByte(data);
//输入参数:待写数据
//输出参数:无
//功能描述:Ds1302写数据
//建造日期:2008.12.12
//*******************************************************************
void WriteByte(unsigned char data)
 {
     unsigned char i;
     
     TRISA2 = 0;                                           //输出方向
     i = 8;                                                //发送八位    

     do
     {
       DAT = 0;                                            //假设为假 
           
       if (data & 0x01) DAT = 1;                           //实际为真
       
       CLK = 1;                                            //时钟上升
       data >>= 1;                                         //右移一位
       CLK = 0;                                            //时钟清零
     }
     while (--i);                                          //循环发送  
 }

//*******************************************************************
//函数名称:ReadByte();
//输入参数:无
//输出参数:时钟数据
//功能描述:Ds1302读数据
//建造日期:2008.12.12
//*******************************************************************
unsigned char ReadByte(void)
 {
     unsigned char i, data;
     
     TRISA2 = 1;                                           //输入方向
     i = 8;                                                //收集八位

     do
     {
       data >>= 1;                                         //数据右移

       if (DAT) data |= 0x80;                              //记录一位

       CLK = 1;                                            //时钟置位
       NOP();                   
       CLK = 0;                                            //时钟下降
     }
     while (--i);                                          //循环接收

     return data;                                          //返回数据        
 }

//*******************************************************************
//函数名称:WriteDs1302(addr, code);
//输入参数:寄存器地址,指令
//输出参数:无
//功能描述:Ds1302写操作
//建造日期:2008.12.12
//*******************************************************************
void WriteDs1302(unsigned char addr, unsigned char code)
 {
     RST = 0;                                              //便能清零
     CLK = 0;                                              //时钟清零
     RST = 1;                                              //使用有效
      
     WriteByte(addr & 0xfe);                               //写入地址
     WriteByte(code);                                      //写入数据
   
     CLK = 1;                                              //时钟置位
     RST = 0;                                              //便能失效
 } 
//*******************************************************************
//函数名称:ReadDs1302(addr);
//输入参数:寄存器地址
//输出参数:功能数据
//功能描述:Ds1302读操作
//建造日期:2008.12.12
//*******************************************************************
unsigned char ReadDs1302(unsigned addr)
 {   
     unsigned char code;

     RST = 0;                                              //便能清零
     CLK = 0;                                              //时钟清零
     RST = 1;                                              //使用有效
      
     WriteByte(addr | 0x01);                               //写入地址
     code = ReadByte();                                    //读取数据
   
     CLK = 1;                                              //时钟置位
     RST = 0;                                              //便能失效

     return code;                                          //返回数据
 }

//*******************************************************************
//函数名称:TimeCahr();
//输入参数:无
//输出参数:无
//功能描述:时钟转换字符
//建造日期:2008.12.12
//*******************************************************************
void TimeCahr(void)
 {     
     unsigned char data;
     
     data = ReadDs1302(0x8c);                              //年  数据
     TopChar[2] = 0x30 + (data >> 4);                      //年  十位
     TopChar[3] = 0x30 + (data & 0x0f);                    //年  个位

     data = ReadDs1302(0x88);                              //月  数据
     TopChar[5] = 0x30 + (data >> 4);                      //月  十位
     TopChar[6] = 0x30 + (data & 0x0f);                    //月  个位
 
     data = ReadDs1302(0x86);                              //日  数据
     TopChar[8] = 0x30 + (data >> 4);                      //日  十位
     TopChar[9] = 0x30 + (data & 0x0f);                    //日  个位
     
     data = ReadDs1302(0x84);                              //时钟数据
     BotChar[0] = 0x30 + (data >> 4);                      //时  十位  
     BotChar[1] = 0x30 + (data & 0x0f);                    //时  个位
       
     data = ReadDs1302(0x82);                              //分钟数据
     BotChar[3] = 0x30 + (data >> 4);                      //分  十位  
     BotChar[4] = 0x30 + (data & 0x0f);                    //分  个位
       
     data = ReadDs1302(0x80);                              //秒钟数据
     BotChar[6] = 0x30 + (data >> 4);                      //秒  十位  
     BotChar[7] = 0x30 + (data & 0x0f);                    //秒  个位 
 }

//*******************************************************************
//函数名称:Picture();
//输入参数:无
//输出参数:无
//功能描述:显示图片
//建造日期:2008.12.12
//*******************************************************************
void Picture(void)
 {
     TopChar[0]  = '2';                                    //默认年号
     TopChar[1]  = '0';
     TopChar[4]  = '/';                                    //日期标号
     TopChar[7]  = '/';
     BotChar[2]  = ':';                                    //时钟标号
     BotChar[5]  = ':';
 }

//*******************************************************************
//函数名称:Ds1302Init();
//输入参数:无
//输出参数:无
//功能描述:时钟芯片设置
//建造日期:2008.12.12
//*******************************************************************
void Ds1302Init(void)
 {
     unsigned char code;    
    
     code = ReadDs1302(0x80);                              //读振荡器

     if (code & 0x80)                                      //是否停振
     {
       WriteDs1302(0x8e, 0x00);                            //允许写入
       WriteDs1302(0x8c, 0x08);                            //默认日期
       WriteDs1302(0x88, 0x01);
       WriteDs1302(0x86, 0x01);
       WriteDs1302(0x84, 0x00);                            //默认时间    
       WriteDs1302(0x82, 0x00);                           
       WriteDs1302(0x80, 0x00);
       WriteDs1302(0x8e, 0x80);                            //禁止写入
     } 
     
     code = ReadDs1302(0x90);                              //充电状态
      
     if (code != 0xab)                                     //设置不符 
     {
       WriteDs1302(0x8e, 0x00);                            //允许写入
       WriteDs1302(0x90, 0xab);                            //充电设置                                  
       WriteDs1302(0x8e, 0x80);                            //禁止写入
     }
 }

//*******************************************************************
//函数名称:main();
//输入参数:无
//输出参数:无
//功能描述:主要程序
//建造日期:2008.12.12
//*******************************************************************
void main(void)                                            
 {   
     unsigned char count, i;
 
     PortInit();                                           //脚位设置                   
     LcdInit();                                            //液晶设置
     Ds1302Init();                                         //时钟设置 
     TimeCahr();                                           //时间转换
     Picture();                                            //显示标号
 
     while (1)
     {
       AddrSite(0, 0);                                     //坐标设置
       PrintChar(TopChar, 16);                             //发送字符
       
       AddrSite(0, 1);                                     //坐标设置
       PrintChar(BotChar, 16);                             //发送字符

       DelayMs(100);                                       //更新周期
       TimeCahr();                                         //更新时间
     }  
 }

关键字:PIC16F84A  读取时钟芯片  DS1302 引用地址:PIC16F84A读取时钟芯片DS1302的简单示例

上一篇:PIC按键LCD+DS1302+AD程序(C程序)
下一篇:PIC16F877A串口发送

推荐阅读最新更新时间:2024-03-16 15:19

DS1302的AVR单片机C程序
下面是DS1302的AVR 单片机 的C程序,这个程序结构很不错。但是没有调试这个AVR单片机的程序。 #define ds1302_rst PC0 #define ds1302_io PC1 #define ds1302_sclk PC2 #define set_ds1302_rst_ddr() DDRC|=1 ds1302_rst #define set_ds1302_rst() PORTC|=1 ds1302_rst #define clr_ds1302_rst() PORTC&=~(1 ds1302_rst) #define set_ds1302_io_ddr() DDRC|=1 ds1302_io #def
[单片机]
MSP430之变态版3线SPI总线实现(DS1302时钟芯片用)
如题, 这个是网上所谓的变态版的3线SPI总线:一根时钟线,一根使能线,一根双向IO线. 一个模块,两个文件: //spi3.c #include typedef.h #include spi3.h /*********************************************************************** 名称:init_spi3 描述:SPI3初始化函数 参数:(无) 返回:(无) 说明: ***********************************************************************/ void init_spi3(void) {
[单片机]
ds1302实时时钟
现在流行的串行时钟电路很多,如DS1302、DS1307、PCF8485等。这些电路的接口简单、价格低廉、使用方便,被广泛地采用。本文介绍的实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。 2 DS1302的结构及工作原理   DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或R
[电源管理]
<font color='red'>ds1302</font>实时时钟
单片机实时时钟电路(LCD1602、DS1302
一、简介 此电路主要有51单片机、LCD1602模块、DS1302芯片组成,通过LCD1062显示当前时间。 二、运行效果 三、源文件 main.c /*想要更多项目私wo!!!*/ #include reg52.h #include intrins.h #include string.h #define uint unsigned int #define uchar unsigned char sbit IO = P1^0; sbit SCLK = P1^1; sbit RST = P1^2; sbit RS = P2^0; sbit RW = P2^1; sbit EN = P2^2; uchar *
[单片机]
单片机实时时钟电路(LCD1602、<font color='red'>DS1302</font>)
DS1302控制代码
两天的成果, /*************************************/ #include reg52.h #define uint unsigned int #define uchar unsigned char uchar year,month,day,week,hours,minutes,seconds; uchar flag1302,cnt; /************************************* 控制按键 *************************************/ sbit K1=P1^0; sbit K2=P1^2; sbit K3=P1
[单片机]
实时时钟芯片DS1302
DS1302是一种三线制的串行时钟芯片,即CE(片选),SCLK(时钟),I/O(双向数据)。从严格意义上来说,它不是SPI总线类型的,因为SPI的数据线的输入输出是分开的,但是我们操作的时候可以用带SPI的硬件接口的MCU,比如PIC16F877的MSSP模块。 命令字节的基本格式 存储器结构 需要注意的地方: 1.在上电时,RST 必须为逻辑0直至Vcc 2.0V。同时SCLK 在RST 驱动至逻辑1 状态时必须为逻辑0。 2.数据输入是在SCLK的上升沿,数据输出是在SCLK的下降沿。 3.传输方式:低位先传输。 4.时钟运行:秒寄存器的最高位(BIT7)是作为时钟控制位,当为逻辑1时
[单片机]
ds1302制作一个精密的电子时钟
题目:用ds1302制作一个精密的电子时钟 感想:我看视频的时候讲的是DS12CR887这块芯片,两块毕竟是不一样的,所以,我只是看了他讲怎样看时序,之后的就没再看了。我就拿着自己下载打印的DS1302数据手册,研习,研习,再研习。还查了书上的,网上的,源程序。但是,你别指望着谁会把所有的东西都给你写上去。只能作为参考。后来,我终于写出了一个程序,可是一编译,就漏洞百出。最主要的有两点:for循环和BCD码。不过还好,都得到了很好的解决。 解决方案: #include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned in
[单片机]
pic单片机控制时钟芯片DS1302程序
#include p IC .h //包含 单片机 内部资源预定义 __CONFIG(0x1832); //芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡 #define i_o RB4 //定义DS1302的数据口 #define sclk RB0 //定义DS1302的时钟口 #define rst RB5 //定义DS1302的复位口 // unsigned char time_rx; unsigned char time_rx @ 0x30; //定义接收寄存器 static v
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved