[PIC®/AVR®/dsPIC®产品] PIC18单片机驱动DS1302

[复制链接]
 楼主| 比神乐 发表于 2024-10-13 22:03 | 显示全部楼层 |阅读模式
代码:
  1. #include <xc.h>
  2. #include "OLED.h"
  3. //CONFIG1L芯片配置字
  4. #pragma config RETEN = OFF           //超低功耗稳压器禁止
  5. #pragma config INTOSCSEL = HIGH      //休眠期间 LF-INTOSC 于高功耗模式
  6. #pragma config SOSCSEL = DIG         //SOSC配置为( SCLKI)模式;使能 RC0 和 RC1 数字I/O
  7. #pragma config XINST = OFF           //扩展指令集使能位,禁止指令集扩展和变址寻址模式 (传统模式)

  8. // CONFIG1H
  9. #pragma config FOSC = HS1            //4 MHz - 16 MHz 外部晶振设置HS中等功耗振荡器,
  10. #pragma config PLLCFG = ON           //使能PLL x4功能,8M晶振经4倍频变为32MHz系统时钟
  11. #pragma config FCMEN = OFF           //禁止故障保护时钟监视器
  12. #pragma config IESO = OFF            //禁止双速启动

  13. // CONFIG2L
  14. #pragma config PWRTEN = OFF          //禁止上电延时
  15. #pragma config BOREN = SBORDIS       //由硬件使能欠压复位
  16. #pragma config BORV = 3              //设置电压为1.8v欠压复位
  17. #pragma config BORPWR = ZPBORMV      //选择ZPBORMV而不是BORMV

  18. // CONFIG2H
  19. #pragma config WDTEN = OFF           //关看门狗
  20. //#pragma config WDTEN = SWDTDIS     //由硬件使能WDT,禁止SWDTEN位
  21. #pragma config WDTPS = 256           //看门狗后分频1:256,溢出时间1.024s

  22. // CONFIG3H
  23. #pragma config CANMX = PORTB         //CAN通信引脚设置到 RB2 和 RB3
  24. #pragma config MSSPMSK = MSK7        //使能 7 位地址掩码模式
  25. #pragma config MCLRE = ON            //使能MCLR外部复位功能

  26. // CONFIG4L
  27. #pragma config STVREN = ON         // 堆栈满/下溢复位
  28. #pragma config BBSIZ = BB2K        // 配置引导区大小为2K

  29. // CONFIG5L
  30. #pragma config CP0 = OFF           //00800-01FFF代码不加密
  31. #pragma config CP1 = OFF           //02000-03FFF代码不加密
  32. #pragma config CP2 = OFF           //04000-05FFF代码不加密
  33. #pragma config CP3 = OFF           //06000-07FFF代码不加密

  34. // CONFIG5H
  35. #pragma config CPB = OFF        //引导区代码不加密
  36. #pragma config CPD = OFF        //EEPROM数据不不加密

  37. // CONFIG6L
  38. #pragma config WRT0 = OFF       // 00800-01FFF 写保护位不使能
  39. #pragma config WRT1 = OFF       // 02000-03FFF 写保护位不使能
  40. #pragma config WRT2 = OFF       // 04000-05FFF 写保护位不使能
  41. #pragma config WRT3 = OFF       // 06000-07FFF 写保护位不使能

  42. // CONFIG6H
  43. #pragma config WRTC = OFF       //配置寄存器不受写保护
  44. #pragma config WRTB = OFF       //引导区不受写保护
  45. #pragma config WRTD = OFF       //EEPROM数据不受写保护

  46. // CONFIG7L
  47. #pragma config EBTR0 = OFF      //00800-01FFF表读保护位不使能
  48. #pragma config EBTR1 = OFF      //02000-03FFF表读保护位不使能
  49. #pragma config EBTR2 = OFF      //04000-05FFF表读保护位不使能
  50. #pragma config EBTR3 = OFF      //06000-07FFF表读保护位不使能
  51. // CONFIG7H
  52. #pragma config EBTRB = OFF      //引导区不受写保护

  53. #define uint unsigned int
  54. #define u8  unsigned char

  55. #define LED1   LATDbits.LATD4  //定义LED1端口
  56. #define LED2   LATEbits.LATE1  //定义LED2端口

  57. #define io     LATCbits.LATC5  //数据输入输出线
  58. #define ce     LATCbits.LATC6  //复位信号线
  59. #define sclk   LATCbits.LATC4   //时钟信号线

  60. u8 const write_addr[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};   //写的地址
  61. u8 const read_addr[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};   //读的地址

  62. u8 const read[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //读的地址
  63. u8 const write[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//秒分时日月周年,写的地址
  64. u8 time[7]={0x40,0x59,0x23,0x31,0x12,0x07,0x23};//存读的数据
  65. //MS延时函数
  66. void MS_delay(uint MS)
  67. {
  68.     uint x,y;
  69.     for(y=MS;y>0;y--)
  70.     {
  71.             for(x=796;x>0;x--);
  72.     }
  73. }
  74. //---存储顺序是秒分时日月周年,存储格式是用BCD码---//
  75. //uchar time[7]={0,0,0x12,0x12,0x12,0x20,0x15};  //初始化的时间为2015年12月12日12:00

  76. void Ds1302Write(u8 address,u8 date)
  77. {
  78.         u8 n;
  79.         ce=0;
  80.         sclk=0;//
  81.         ce=1;
  82.         for (n=0;n<8;n++)                        //写地址
  83.         {
  84.                 io=address & 0x01        ;        //只保留1位
  85.                 address>>=1;                                //右移一位
  86.                 sclk=1;                                                //写
  87.                 sclk=0;
  88.         }
  89.         for (n=0; n<8; n++)//写数据
  90.         {
  91.                 io=date & 0x01;
  92.                 date>>=1;
  93.                 sclk=1;
  94.                 sclk=0;
  95.         }         
  96.         ce=0;
  97. }
  98. u8 Ds1302Read(u8 address)
  99. {
  100.         u8 n,date,date1;
  101.         ce=0;
  102.         sclk=0;
  103.         ce=1;
  104.         for(n=0;n<8;n++)                //发地址
  105.         {
  106.                 io=address & 0x01;
  107.                 address>>= 1;
  108.                 sclk= 1;
  109.                 sclk= 0;
  110.         }
  111.     TRISCbits.TRISC5=1;
  112.     for(n=0;n<10;n++);
  113.         for(n=0;n<8;n++)                //收数据
  114.         {
  115.                 date1=PORTCbits.RC5;
  116.                 date=(date>>1)|(date1<<7);//存入date中
  117.                 sclk=1;
  118.                 sclk=0;
  119.         }
  120.         ce=0;
  121.         sclk=1;//保证1302稳定,必须的
  122.         io=0;
  123.         io=1;
  124.     TRISCbits.TRISC5=0;
  125.     for(n=0;n<10;n++);
  126.         return date;       
  127. }
  128. void Ds1302ReadTime()//读时间
  129. {
  130.         u8 n;
  131.         for(n=0;n<7;n++)//读取7个字节的时钟信号:分秒时日月周年
  132.         {
  133.                 time[n] =Ds1302Read(read[n]);
  134.         }
  135. }
  136. void Ds1302Init()
  137. {
  138.         u8 n;
  139.         Ds1302Write(0x8E,0x00);                 //8E为写保护寄存器地址,00为不写保护
  140.         for(n=0;n<7;n++)                                         //
  141.         {
  142.                 Ds1302Write(write[n],time[n]);        //地址加数据
  143.         }
  144.         Ds1302Write(0x8E,0x80);                 //开写保护
  145. }
  146. void main(void)
  147. {
  148.     u8 i,j;
  149.      ANCON0bits.ANSEL6=0;    //RE1(AN6)配置为数字IO
  150.      ANCON1=0x00;            //将部分带模拟输入功能的引脚设置为数字IO

  151.      //输出使用LAT寄存器,输入使用PORT寄存器
  152.      TRISDbits.TRISD4=0;     //PORD4配置为输出
  153.      TRISEbits.TRISE1=0;     //PORE1配置为输出
  154.      TRISC=0X00;
  155.      LCD_Init();
  156.      LCD_CLS();
  157.         LCD_P8x16Str(20,4,(u8*)"20  -  -  ");
  158.         LCD_P8x16Str(20,6,(u8*)"  :  :  ");
  159.         //Draw_BMP(0,0,100,3,(u8*)Dot);
  160.     Ds1302Init();
  161.      while(1)
  162.      {
  163.           Ds1302ReadTime();
  164.                         i=(time[0]>>4)+0x30;
  165.                         j=(time[0]&0x0f)+0x30;
  166.             LCD_P8x16Char(68,6,i);
  167.             LCD_P8x16Char(76,6,j);
  168.             
  169.             i=(time[1]>>4)+0x30;
  170.                         j=(time[1]&0x0f)+0x30;
  171.             LCD_P8x16Char(44,6,i);
  172.             LCD_P8x16Char(52,6,j);
  173.             
  174.             i=(time[2]>>4)+0x30;
  175.                         j=(time[2]&0x0f)+0x30;
  176.             LCD_P8x16Char(20,6,i);
  177.             LCD_P8x16Char(28,6,j);
  178.             
  179.             i=(time[3]>>4)+0x30;
  180.                         j=(time[3]&0x0f)+0x30;
  181.             LCD_P8x16Char(84,4,i);
  182.             LCD_P8x16Char(92,4,j);
  183.             
  184.             i=(time[4]>>4)+0x30;
  185.                         j=(time[4]&0x0f)+0x30;
  186.             LCD_P8x16Char(60,4,i);
  187.             LCD_P8x16Char(68,4,j);
  188.             
  189.             i=(time[6]>>4)+0x30;
  190.                         j=(time[6]&0x0f)+0x30;
  191.             LCD_P8x16Char(36,4,i);
  192.             LCD_P8x16Char(44,4,j);
  193.             
  194.             i=time[5]+0x30;
  195.                        
  196.             LCD_P8x16Char(36,2,i);
  197.            
  198.           MS_delay(500);
  199.                  
  200.          
  201.      }
  202. }



效果图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评论

[url=home.php?mod=space&uid=2716984]@比神乐[/url] :不是的,也就是个维修电工习惯维修电子线路。  发表于 2024-11-8 08:30
[url=home.php?mod=space&uid=1150904]@王栋春[/url] :你是搞硬件的吗  发表于 2024-11-8 08:16
俺就纳闷了,为啥大家都是软件高手,可俺就是一窍不通!  发表于 2024-11-7 19:16
chenqianqian 发表于 2024-10-14 08:02 来自手机 | 显示全部楼层
DS1302是我用的第一颗时钟芯片型号
chineseboyzxy 发表于 2024-10-14 10:29 | 显示全部楼层
我第一次用的RTC是HT1380。51汇编,折腾了好多天才搞定读写数据。边看书边写程序。
xionghaoyun 发表于 2024-10-14 15:35 | 显示全部楼层
能不能打包一个工程啊
 楼主| 比神乐 发表于 2024-10-14 15:37 | 显示全部楼层
DS1302的代码都在里面了。
heisexingqisi 发表于 2024-10-14 20:50 | 显示全部楼层
挺不错,有图有真相。
田舍郎 发表于 2024-10-14 22:52 来自手机 | 显示全部楼层
1302一桶天下
dongnanxibei 发表于 2024-10-28 21:57 | 显示全部楼层
时钟芯片吗,不错不错。
gejigeji521 发表于 2024-10-30 09:55 | 显示全部楼层
GPIO模拟时序,这种方法移植非常容易。
xionghaoyun 发表于 2024-11-6 09:03 | 显示全部楼层
兄弟放工程好点
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3535

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部