PIC16F877A DS1302芯片驱动

发布者:平静宁静最新更新时间:2016-11-04 来源: eefocus关键字:PIC16F877A  DS1302  芯片驱动 手机看文章 扫描二维码
随时随地手机看文章
  1. #include  
  2. typedef unsigned char uchar;  
  3. typedef unsigned int uint;  
  4. #define rs_h PORTC|=0x01  
  5. #define rs_l PORTC&=0xfe  
  6. #define rw_h PORTC|=0x02  
  7. #define rw_l PORTC&=0xfd  
  8. #define en_h PORTC|=0x04   
  9. #define en_l PORTC&=0xfb  
  10. #define rst_h PORTC|=0x08  
  11. #define rst_l PORTC&=0xf7  
  12. #define sck_h PORTC|=0x10  
  13. #define sck_l PORTC&=0xef  
  14. #define io_h PORTC|=0x20  
  15. #define io_l PORTC&=0xdf  
  16. #define SECADD 0X80//秒寄存器地址  
  17. #define MINADD 0x82  
  18. #define HRADD 0x84  
  19. #define DATEADD 0x86  
  20. #define MONTHADD 0x88  
  21. #define DAYADD 0x8a  
  22. #define YEARADD 0x8c  
  23. #define CONTROLADD 0x8e  
  24. #define PORT (PORTB)  
  25. void delayms(uint x);  
  26. void lcd_com(uchar com);  
  27. void lcd_dat(uchar dat);  
  28. void lcd_write(uchar c,uchar r,uchar dat);  
  29. void lcd_init(void);  
  30. void Ds1302Init(void);  
  31. void WriteByte(uchar dat);  
  32. uchar ReadByte(void);  
  33. uchar BCDtoDex(uchar dat);  
  34. uchar DextoBCD(uchar dat);  
  35. uchar ReadByte(void);  
  36. void Ds1302Write(uchar add,uchar dat);  
  37. uchar Ds1302Read(uchar add);  
  38.   
  39. void main(void)  
  40. {  
  41.     uchar sec,min,hr,date,month,day,year;  
  42.     TRISB=0x00;  
  43.     TRISC&=0xc0;  
  44.     lcd_init();  
  45.     Ds1302Init();  
  46.     while(1)  
  47.     {  
  48.         sec=Ds1302Read(SECADD);  
  49.         min=Ds1302Read(MINADD);  
  50.         hr=Ds1302Read(HRADD);  
  51.         date=Ds1302Read(DATEADD);  
  52.         month=Ds1302Read(MONTHADD);  
  53.         day=Ds1302Read(DAYADD);  
  54.         year=Ds1302Read(YEARADD);  
  55.   
  56.         sec=BCDtoDex(sec);  
  57.         min=BCDtoDex(min);  
  58.         hr=BCDtoDex(hr);  
  59.         date=BCDtoDex(date);  
  60.         month=BCDtoDex(month);  
  61.         day=BCDtoDex(day);  
  62.         year=BCDtoDex(year);  
  63.   
  64.         lcd_write(0,1,0x32);  
  65.         lcd_write(0,2,0x30);  
  66.         lcd_write(0,3,0x30+year/10);  
  67.         lcd_write(0,4,0x30+year%10);  
  68.         lcd_write(0,6,0x30+month/10);  
  69.         lcd_write(0,7,0x30+month%10);  
  70.         lcd_write(0,9,0x30+date/10);  
  71.         lcd_write(0,10,0x30+date%10);  
  72.         lcd_write(0,14,0x30+day);  
  73.         lcd_write(1,4,0x30+hr/10);  
  74.         lcd_write(1,5,0x30+hr%10);  
  75.         lcd_write(1,7,0x30+min/10);  
  76.         lcd_write(1,8,0x30+min%10);  
  77.         lcd_write(1,10,0x30+sec/10);  
  78.         lcd_write(1,11,0x30+sec%10);  
  79.         delayms(1005);//1ms  
  80.     }  
  81.   
  82. }  
  83. void Ds1302Init(void)  
  84. {  
  85.     rst_l;  
  86.     sck_l;  
  87.     Ds1302Write(CONTROLADD,0);//关闭写保护  
  88.     Ds1302Write(MINADD,DextoBCD(06));  
  89.     Ds1302Write(HRADD,DextoBCD(19));  
  90.     Ds1302Write(DATEADD,DextoBCD(20));  
  91.     Ds1302Write(MONTHADD,DextoBCD(5));  
  92.     Ds1302Write(DAYADD,DextoBCD(7));  
  93.     Ds1302Write(YEARADD,DextoBCD(12));  
  94.     Ds1302Write(SECADD,DextoBCD(30));//写秒,同时启动时钟  
  95. }  
  96. void WriteByte(uchar dat)//上升沿输出  
  97. {  
  98.     uchar i;  
  99.     TRISC&=0xdf;  
  100.     for(i=8;i>0;i--)  
  101.     {  
  102.         sck_l;//低电平时数据线可变  
  103.         if(dat&0x01)  
  104.             io_h;  
  105.         else  
  106.             io_l;  
  107.         sck_h;  
  108.         dat>>=1;  
  109.     }  
  110. }  
  111. uchar BCDtoDex(uchar dat)//BCD码转十进制  
  112. {  
  113.     uchar i;  
  114.     i=dat/16;  
  115.     dat%=16;  
  116.     i=i*10+dat;  
  117.     return i;  
  118. }  
  119. uchar DextoBCD(uchar dat)//十进制转BCD码  
  120. {  
  121.     uchar i;  
  122.     i=dat/10;  
  123.     dat%=10;  
  124.     i=i*16+dat;  
  125.     return i;  
  126. }  
  127. uchar ReadByte(void)//下降沿输出  
  128. {  
  129.     uchar i;  
  130.     uchar dat;  
  131.     TRISC|=0x20;  
  132.     for(i=8;i>0;i--)//要考虑之前写完后的状态,第一次进入此循环体即有下降沿  
  133.     {  
  134.         dat>>=1;  
  135.         sck_l;  
  136.         if(PORTC&0x20)  
  137.             dat|=0x80;  
  138.         sck_h;    
  139.     }  
  140.     return dat;  
  141. }  
  142. void Ds1302Write(uchar add,uchar dat)  
  143. {  
  144.     rst_l;  
  145.     sck_l;  
  146.     rst_h;  
  147.     WriteByte(add);//最低位置0表示写  
  148.     WriteByte(dat);  
  149.     rst_l;  
  150. }  
  151. uchar Ds1302Read(uchar add)  
  152. {  
  153.     uchar dat;  
  154.     rst_l;  
  155.     sck_l;  
  156.     rst_h;  
  157.     WriteByte(add+1);//地址最低位置1表示读  
  158.     dat=ReadByte();  
  159.     rst_l;  
  160.     return dat;  
  161. }  
  162. void delayms(uint x) //8M晶振下,延时1ms  
  163. {  
  164.     uint y,z;  
  165.     for(y=x;y>0;y--)  
  166.         for(z=220;z>0;z--);  
  167. }  
  168. void lcd_init(void)//LCD1602初始化  
  169. {  
  170.     lcd_com(0x38);  
  171.     lcd_com(0x0c);  
  172.     lcd_com(0x06);  
  173.     lcd_write(0,5,0xb0);  
  174.     lcd_write(0,8,0xb0);  
  175.     lcd_write(1,6,0x3a);  
  176.     lcd_write(1,9,0x3a);  
  177. }  
  178. void lcd_com(uchar com)//向LCD1602写命令  
  179. {  
  180.     rs_l;  
  181.     rw_l;  
  182.     PORT=com;  
  183.     delayms(1);  
  184.     en_h;  
  185.     delayms(1);   
  186.     en_l;  
  187. }  
  188. void lcd_dat(uchar dat)//向LCD1602写数据  
  189. {  
  190.     rs_h;  
  191.     rw_l;  
  192.     PORT=dat;  
  193.     delayms(1);  
  194.     en_h;  
  195.     delayms(1);  
  196.     en_l;  
  197. }  
  198. void lcd_write(uchar c,uchar r,uchar dat)//向LCD1602指定行、指定列、写数据  
  199. {  
  200.     lcd_com(0x80+0x40*c+r);  
  201.     lcd_dat(dat);  
  202.     delayms(1);  
  203. }  

关键字:PIC16F877A  DS1302  芯片驱动 引用地址:PIC16F877A DS1302芯片驱动

上一篇:PIC16F877A 的sleep mode
下一篇:PIC16F877A 外部中断RB0 ,RA0点亮LED

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

pic16f877a.h中文注释
存放路径:在PICC软件hi-tech安装目录下,?:\Microchip\cc8.05\include,找到pic1687xa.h,里面即有 以下是头文件内容及详细注释: /* * Header file for the Microchip * PIC 16F873A chip * PIC 16F874A chip * PIC 16F876A chip * PIC 16F877A chip * Midrange Microcontroller */ #if defined(_16F874A) || defined(_16F877A) #define __PINS_40 #endif static volatile unsign
[单片机]
51单片机——SPI、DS1302时钟 C语言入门编程
SPI: 写时序: 在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302, 数据输入从低位(位0)开始。(先写低位) 读时序: 在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。(先读低位,读取后将IO设置为0,否则读出的数据会出错) DS1302: DS1302是DALLAS公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态 RAM,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过AM/PM指示决定采用24或12小
[单片机]
51单片机——SPI、<font color='red'>DS1302</font>时钟 C语言入门编程
51单片机实验15:DS1302时钟模块应用
开发板DS1302模块电路图如下: 目的:单片机查询DS1302时钟模块时间,并将其显示在数码管上。 DS1302的初始化时间为2019年1月1日12:00(星期二) #include reg52.h #include dse1302.h sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; uc code x ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uc tim ; void delay(uc x) { uc i,j; for(i=1;i =x;i++) for(j=1;j =110;j++);
[单片机]
51单片机实验15:<font color='red'>DS1302</font>时钟模块应用
PIC16f877A读写24c02程序
P IC 16f877A读写24c02程序 #include pic.h #include string.h #define uchar unsigned char #define uint unsigned int static volatile unsigned char a CC @ 0x20; //发收数据暂存器 static volatile bit acc0 @ (unsigned)&acc*8+0; //接收 static volatile bit acc7 @ (unsigned)&acc*8+7; //发送 static volatile unsigned char err
[单片机]
DS1302-演示代码
参考DS1302数据手册,尽管数据手册是英文,但是很有帮助,再结合网上众多的代码写出了下面这个例子,除了涓流充电(trickle charger)功能没使用外,内部的RAM和寄存器功能都使用到了,包括多字节方式(burst mode)。自认为我写的比网上大多数程序清晰,当然已经硬件测试过了。 1 #include reg52.h 2 3 /*DS1302部分*/ 4 5 //全部为写入地址,读取地址需要+1 6 #define YEAR 0x8c 7 #define MON 0x88 8 #define DATE 0x86 9 #define DAY 0x8a 10 #define HOUR 0x84
[单片机]
DS1302+AT89C2051控制的红外遥控LED电子钟设计
自制LED电子钟在很多电子类报刊杂志上都可以见到,但多数在断电后要重新设置时间等参数,给使用带来不便。也有用电池作为备用电源的,但往往体积较大。本文介绍的LED电子钟克服了上述弊端,加上采用家电通用的红外遥控器进行控制,使用方便。该电子钟有一路闹铃输出,可以通过遥控器设置闹铃时间及闹铃允许。   一、工作原理   实时时钟芯片DS1302采用串行数据传输,可为掉电保护电源提供可编程的充电功能,也可以关闭充电功能,芯片采用32768Hz晶振。   AT89C2051作为主控芯片,其功能一是对接收到的红外遥控编码进行判断识别,并进行相应的处理;二是定期读取DS1302中的时间,并把小时和分钟送显示;三是比较设置的闹铃时间与实时时间,如
[单片机]
<font color='red'>DS1302</font>+AT89C2051控制的红外遥控LED电子钟设计
基于DS1302数字芯片的“电子台历”设计调试心得
DS1302是一款价格低廉,精度高的时钟芯片;该芯片具有年、月、日、分、秒、闰年、电池涓流充电,等优秀的功能,其芯片发明是DALLS 达拉斯 公司的产品,在电脑、相机等需要时间的数字产品中都有用到。于是本人针对该芯片准备设计一款具有 实时时间、室温测量、年月日实时显示、国际节日提醒功能、自动背光调整 为一体的电子台历。 电子台历原理图在本月15号设计完成,PCB电路板图于16号完成并发外打样。由于时间仓促在第一款PCB设计排板时,PCB走线比较杂乱,4天后收到成品PCB,于是开始进入焊接调试阶段;通过半小时的焊接,一个半成品完成,然而通过STC-ISP在线下载后,12684液晶屏能进入初始程序,同时能实时地测
[单片机]
基于<font color='red'>DS1302</font>数字芯片的“电子台历”设计调试心得
时钟程序(LED+DS1302+AT89S52)
#include reg51.h /*************************ds1302与at89s52引脚连接********************/ sbit T_RST=P3^5; sbit T_CLK=P3^6; sbit T_IO=P3^7; sbit ACC0=ACC^0; sbit ACC7=ACC^7; unsigned char seg ={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}; //0~~9段码 /******************DS1302:写入操作(上升沿)**
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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