PIC单片机(PIC16F877A)DS1302芯片程序

发布者:创意旋律最新更新时间:2018-06-22 来源: eefocus关键字:PIC单片机  PIC16F877A  DS1302 手机看文章 扫描二维码
随时随地手机看文章

#include  

typedef unsigned char uchar;  

typedef unsigned int uint;  

#define rs_h PORTC|=0x01  

#define rs_l PORTC&=0xfe  

#define rw_h PORTC|=0x02  

#define rw_l PORTC&=0xfd  

#define en_h PORTC|=0x04   

#define en_l PORTC&=0xfb  

#define rst_h PORTC|=0x08  

#define rst_l PORTC&=0xf7  

#define sck_h PORTC|=0x10  

#define sck_l PORTC&=0xef  

#define io_h PORTC|=0x20  

#define io_l PORTC&=0xdf  

#define SECADD 0X80//秒寄存器地址  

#define MINADD 0x82  

#define HRADD 0x84  

#define DATEADD 0x86  

#define MONTHADD 0x88  

#define DAYADD 0x8a  

#define YEARADD 0x8c  

#define CONTROLADD 0x8e  

#define PORT (PORTB)  

void delayms(uint x);  

void lcd_com(uchar com);  

void lcd_dat(uchar dat);  

void lcd_write(uchar c,uchar r,uchar dat);  

void lcd_init(void);  

void Ds1302Init(void);  

void WriteByte(uchar dat);  

uchar ReadByte(void);  

uchar BCDtoDex(uchar dat);  

uchar DextoBCD(uchar dat);  

uchar ReadByte(void);  

void Ds1302Write(uchar add,uchar dat);  

uchar Ds1302Read(uchar add);  

  

void main(void)  

{  

    uchar sec,min,hr,date,month,day,year;  

    TRISB=0x00;  

    TRISC&=0xc0;  

    lcd_init();  

    Ds1302Init();  

    while(1)  

    {  

        sec=Ds1302Read(SECADD);  

        min=Ds1302Read(MINADD);  

        hr=Ds1302Read(HRADD);  

        date=Ds1302Read(DATEADD);  

        month=Ds1302Read(MONTHADD);  

        day=Ds1302Read(DAYADD);  

        year=Ds1302Read(YEARADD);  

  

        sec=BCDtoDex(sec);  

        min=BCDtoDex(min);  

        hr=BCDtoDex(hr);  

        date=BCDtoDex(date);  

        month=BCDtoDex(month);  

        day=BCDtoDex(day);  

        year=BCDtoDex(year);  

  

        lcd_write(0,1,0x32);  

        lcd_write(0,2,0x30);  

        lcd_write(0,3,0x30+year/10);  

        lcd_write(0,4,0x30+year%10);  

        lcd_write(0,6,0x30+month/10);  

        lcd_write(0,7,0x30+month%10);  

        lcd_write(0,9,0x30+date/10);  

        lcd_write(0,10,0x30+date%10);  

        lcd_write(0,14,0x30+day);  

        lcd_write(1,4,0x30+hr/10);  

        lcd_write(1,5,0x30+hr%10);  

        lcd_write(1,7,0x30+min/10);  

        lcd_write(1,8,0x30+min%10);  

        lcd_write(1,10,0x30+sec/10);  

        lcd_write(1,11,0x30+sec%10);  

        delayms(1005);//1ms  

    }  

  

}  

void Ds1302Init(void)  

{  

    rst_l;  

    sck_l;  

    Ds1302Write(CONTROLADD,0);//关闭写保护  

    Ds1302Write(MINADD,DextoBCD(06));  

    Ds1302Write(HRADD,DextoBCD(19));  

    Ds1302Write(DATEADD,DextoBCD(20));  

    Ds1302Write(MONTHADD,DextoBCD(5));  

    Ds1302Write(DAYADD,DextoBCD(7));  

    Ds1302Write(YEARADD,DextoBCD(12));  

    Ds1302Write(SECADD,DextoBCD(30));//写秒,同时启动时钟  

}  

void WriteByte(uchar dat)//上升沿输出  

{  

    uchar i;  

    TRISC&=0xdf;  

    for(i=8;i>0;i--)  

    {  

        sck_l;//低电平时数据线可变  

        if(dat&0x01)  

            io_h;  

        else  

            io_l;  

        sck_h;  

        dat>>=1;  

    }  

}  

uchar BCDtoDex(uchar dat)//BCD码转十进制  

{  

    uchar i;  

    i=dat/16;  

    dat%=16;  

    i=i*10+dat;  

    return i;  

}  

uchar DextoBCD(uchar dat)//十进制转BCD码  

{  

    uchar i;  

    i=dat/10;  

    dat%=10;  

    i=i*16+dat;  

    return i;  

}  

uchar ReadByte(void)//下降沿输出  

{  

    uchar i;  

    uchar dat;  

    TRISC|=0x20;  

    for(i=8;i>0;i--)//要考虑之前写完后的状态,第一次进入此循环体即有下降沿  

    {  

        dat>>=1;  

        sck_l;  

        if(PORTC&0x20)  

            dat|=0x80;  

        sck_h;    

    }  

    return dat;  

}  

void Ds1302Write(uchar add,uchar dat)  

{  

    rst_l;  

    sck_l;  

    rst_h;  

    WriteByte(add);//最低位置0表示写  

    WriteByte(dat);  

    rst_l;  

}  

uchar Ds1302Read(uchar add)  

{  

    uchar dat;  

    rst_l;  

    sck_l;  

    rst_h;  

    WriteByte(add+1);//地址最低位置1表示读  

    dat=ReadByte();  

    rst_l;  

    return dat;  

}  

void delayms(uint x) //8M晶振下,延时1ms  

{  

    uint y,z;  

    for(y=x;y>0;y--)  

        for(z=220;z>0;z--);  

}  

void lcd_init(void)//LCD1602初始化  

{  

    lcd_com(0x38);  

    lcd_com(0x0c);  

    lcd_com(0x06);  

    lcd_write(0,5,0xb0);  

    lcd_write(0,8,0xb0);  

    lcd_write(1,6,0x3a);  

    lcd_write(1,9,0x3a);  

}  

void lcd_com(uchar com)//向LCD1602写命令  

{  

    rs_l;  

    rw_l;  

    PORT=com;  

    delayms(1);  

    en_h;  

    delayms(1);   

    en_l;  

}  

void lcd_dat(uchar dat)//向LCD1602写数据  

{  

    rs_h;  

    rw_l;  

    PORT=dat;  

    delayms(1);  

    en_h;  

    delayms(1);  

    en_l;  

}  

void lcd_write(uchar c,uchar r,uchar dat)//向LCD1602指定行、指定列、写数据  

{  

    lcd_com(0x80+0x40*c+r);  

    lcd_dat(dat);  

    delayms(1);  

}  

关键字:PIC单片机  PIC16F877A  DS1302 引用地址:PIC单片机(PIC16F877A)DS1302芯片程序

上一篇:PIC单片机(PIC16F877A)DS18B20温度传感器驱动程序
下一篇:PIC16F877A输入检测问题

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

实时时钟电路DS1302的原理及应用
1 引言 现在流行的串行时钟电路很多,如 ds1302、 ds1307、pcf8485等。这些电路的接口简单、价格低廉、使用方便,被广泛地采用。本文介绍的实时时钟电路ds1302是dallas公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。 2 ds1302的结构及工作原理 ds1302 是美国dallas公司推出的一种高性能、低功耗、带ram的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5v~5.5v。采用三线接口与cpu进行同步通信,并可采用突发方式一次传送多个字
[单片机]
实时时钟电路<font color='red'>DS1302</font>的原理及应用
PIC单片机CCS之C语言(#FUSES的用法)
#FUSES 语法: #fuse options options要根据设备改变.一系列有效的可选项都要放在每个devices.h文件的顶部,注释用来参考.PCW能有效编辑修改特殊的设备fuses.PCW下拉菜单VIEW|Valid fuses将会显示所有的fuses描写. 一些公共的可选项如下: LP, XT, HS, RC WDT, NOWDT PROTECT, NOPROTECT PUT, NOPUT, (Power Up Timer) BROWNOUT, NOBROWNOUT 目的:这种指示定义要fuses的东西在编程时设定在器件中.这种指示不影响编辑,可是信息放在输出文件中.如果在Parallax格式中需要f
[单片机]
HC-SR04超声波模块51+PIC单片机例程
单片机源程序如下: //晶振=8M //MCU=STC10F04XE //P0.0-P0.6共阳数码管引脚 //Trig = P1^0 //Echo = P3^2 #include reg52.h //包括一个52标准内核的头文件 #define uchar unsigned char //定义一下方便使用 #define uint unsigned int #define ulong unsigned long //*********************************************** sfr CLK_DIV = 0x97; //为STC单片机定义,系统时钟分频 //为STC单
[单片机]
PIC单片机驱动LED数码管显示程序
;*****该程序用于驱动led数码管显示,在8个LED数码管上依次显示数字1、2、3、4、5、6、7、8******* ;****http://www.51hei.com 单片机学习网经典程序已测试,led数码管共阴和共阳不同请修改码值转换表部分 LIST P=18F458 INCLUDE "P18F458.INC" ;所用的寄存器 XIANR EQU 0X20 ORG 0X00 GOTO MAIN ORG 0X30 ;****************以下为码值转换表******************** CONVERT ADDWF PCL,1 RETLW 0XC0 ;0,显示段码与具体的硬件连接有关 RETLW 0XF9
[单片机]
pic单片机汇编语言讲解(上)
Pic 单片机为最常用单片机之一,许多程序均基于 pic 单片机进行开发。因此,熟练 pic 单片机编程尤为重要。为保证大家能准确、熟练掌握 pic 单片机的使用,本文特带来 pic 单片机的各种汇编语言指令的讲解上篇,下篇将在后期文章中予以讲解。如果你对本文即将讲解的内容充满兴趣,不妨继续往下阅读哦。 一、pic 的指令系统 pic8 位单片机共有三个级别,有相对应的指令集。基本级 pic 系列芯片共有指令 33 条,每条指令是 12 位字长;中级 pic 系列芯片共有指令 35 条,每条指令是 14 位字长;高级 pic 系列芯片共有指令 58 条,每条指令是 16 位字长。其指令向下兼容。 二、pic 汇编语言指令格
[单片机]
<font color='red'>pic单片机</font>汇编语言讲解(上)
PIC单片机的配置字用CONFIG命令的定义
一.配置字 #i nclude __CONFIG(x) ;其中x是配置字,头文件中定义了相应的配置说明符。 如: __CONFIG(WDTDIS & XT & UNPROTECT); 这将关闭看门狗,设置XT振方式,程序不加密。注意:不同的配置符间用‘&’相联,未定义的部分保留未编程状态。详细的情况请参考头文件及PIC数据手册 二.ID 位置 有些PIC单片机在程序空间外还有ID空间,可用下面的方法来定义: #i nclude __IDLOC(x) ;其中x是ID标示。 如: __IDLOC(15F0); 将ID的四个单元定义为:1, 5, 15, 0. ID的具体位置由所指定的PIC芯片自动设定。 三.EEPROM
[单片机]
<font color='red'>PIC单片机</font>的配置字用CONFIG命令的定义
PIC单片机配置字
1、对于PIC来说,状态字的配置尤其重要,其直接影响MCU的正常工作与否; 2、以PIC18F45K22为例,打开mplab8.92, 3、我们就可以看到配置字的说明文档: 4、比如:Oscillator Selection bits:(振荡器选择配置字) HS是使用超过4M的石英晶体振荡器(外部晶振),其中HSHP为大于16Mhz,HSMP为4-16Mhz;XT是使用1M到4M的石英晶体振荡器。LP是使用低于1M的陶瓷振荡器,上述都是用外部晶振,只是所用晶振的材质和频率不同。RC是不使用外部晶振,直接用内部的RC时钟电路。其中HS和XT因为用石英晶体振荡器,所得时钟比较准确,适用于各种串口、can、TCPIP
[单片机]
<font color='red'>PIC单片机</font>配置字
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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