找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1986|回复: 12
打印 上一主题 下一主题
收起左侧

ds1302走时比正常的快了十倍,不知道是什么原因

[复制链接]
回帖奖励 40 黑币 回复本帖可获得 2 黑币奖励! 每人限 2 次
跳转到指定楼层
楼主
ID:639106 发表于 2021-9-12 07:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gqzjl 于 2021-9-14 20:31 编辑

ds1302走时比正常的快了十倍,请大神们看一下单片机程序
  1.    
  2.     #include <STC12C5630AD.h>
  3.     #include <string.h>
  4.    
  5.     typedef unsigned char uint8;
  6.    
  7.     #define LCM2402_DB0_DB7 P2
  8.     sbit LCM2402_RS = P1 ^ 5;
  9.     sbit LCM2402_RW = P1 ^ 6;
  10.     sbit LCM2402_E = P1 ^ 7;
  11.     sbit LCM2402_Busy = P2 ^ 7;
  12.     sbit DQ = P1 ^ 3;
  13.     sbit clock_clk = P1 ^ 0;
  14.     sbit clock_dat = P1 ^ 1;
  15.     sbit clock_Rst = P1 ^ 2;

  16.     data unsigned int ii;
  17.     data unsigned char mode = 0;
  18.     data unsigned char TIME_WW;
  19.    

  20.    
  21.     #define CMD_clear 0x01
  22.     #define CMD_back 0x02
  23.     #define CMD_dec1 0x04
  24.     #define CMD_add1 0x06
  25.     #define CMD_dis_gb1 0x0f
  26.     #define CMD_dis_gb2 0x0e
  27.     #define CMD_dis_gb3 0x0c
  28.     #define CMD_OFF_dis 0x08
  29.     #define CMD_set82 0x38
  30.     #define CMD_set81 0x30
  31.     #define CMD_set42 0x28
  32.     #define CMD_set41 0x20
  33.     #define lin_1 0x80
  34.     #define lin_2 0xc0

  35.    
  36.     void MCU_MS (unsigned int a){
  37.     unsigned int i;
  38.     while( --a != 0){
  39.     for(i = 0; i < 600; i++);
  40.     }
  41.     }
  42.    
  43.     void PWM_init (void){
  44.     CMOD=0x02;
  45.     CL=0x00;
  46.     CH=0x00;
  47.     CCAPM0=0x42;
  48.     CCAP0L=0x00;
  49.     CCAP0H=0x00;

  50.    
  51.    
  52.    

  53.    
  54.    
  55.    

  56.    
  57.    
  58.    

  59.     CR=1;
  60.     }
  61.    

  62.    
  63.     void PWM0_set (unsigned char a){
  64.     CCAP0L= a;
  65.     CCAP0H= a;
  66.     }
  67.    

  68.    
  69.     void LCM2402_TestBusy(void){
  70.     LCM2402_DB0_DB7 = 0xff;
  71.     LCM2402_RS = 0;
  72.     LCM2402_RW = 1;
  73.     LCM2402_E = 1;
  74.     while(LCM2402_Busy);
  75.     LCM2402_E = 0;
  76.     }
  77.    
  78.     void LCM2402_WriteCMD(uint8 LCM2402_command) {
  79.     LCM2402_TestBusy();
  80.     LCM2402_RS = 0;
  81.     LCM2402_RW = 0;
  82.     LCM2402_DB0_DB7 = (LCM2402_command/16)*16;
  83.     LCM2402_E = 1;
  84.     LCM2402_E = 0;
  85.     LCM2402_DB0_DB7 = (LCM2402_command%16)*16;
  86.     LCM2402_E = 1;
  87.     LCM2402_E = 0;
  88.     }
  89.    
  90.     void LCM2402_WriteData(uint8 LCM2402_data){
  91.     LCM2402_TestBusy();
  92.     LCM2402_RS = 1;
  93.     LCM2402_RW = 0;
  94.     LCM2402_DB0_DB7 = (LCM2402_data/16)*16;
  95.     LCM2402_E = 1;
  96.     LCM2402_E = 0;
  97.     LCM2402_DB0_DB7 = (LCM2402_data%16)*16;
  98.     LCM2402_E = 1;
  99.     LCM2402_E = 0;
  100.     }
  101.    
  102.     void print(uint8 a,uint8 *str){
  103.     LCM2402_WriteCMD(a | 0x80);
  104.     while(*str != '\0'){
  105.     LCM2402_WriteData(*str++);
  106.     }
  107.     *str = 0;
  108.     }
  109.    
  110.     void print2(uint8 a,uint8 t){
  111.     LCM2402_WriteCMD(a | 0x80);
  112.     LCM2402_WriteData(t);
  113.     }
  114.    
  115.     uint8 code Xword[]={
  116.     0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00,
  117.     0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,
  118.     0x00,0x00,0x00,0x0e,0x00,0xff,0x00,0x00,
  119.     0x00,0x00,0xff,0x00,0x0e,0x00,0xff,0x00,
  120.     0x00,0x00,0xff,0xf5,0xfb,0xf1,0xff,0x00,
  121.     0x00,0xfe,0x08,0xfe,0x0a,0x0a,0xff,0x00,
  122.     0x00,0x04,0x00,0xff,0x00,0x0a,0x11,0x00,
  123.     0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00,
  124.     };
  125.     void CgramWrite(void) {
  126.     uint8 i;
  127.     LCM2402_WriteCMD(0x06);
  128.     LCM2402_WriteCMD(0x40);
  129.     for(i=0;i<64;i++) {
  130.     LCM2402_WriteData(Xword[i]);
  131.     }
  132.     }
  133.    
  134.     void LCM2402_Init(void){
  135.     LCM2402_WriteCMD(CMD_set42); /
  136.    
  137.    





  138.    
  139.    
  140.    
  141.    
  142.     sbit a0 = ACC ^ 0;
  143.     sbit a1 = ACC ^ 1;
  144.     sbit a2 = ACC ^ 2;
  145.     sbit a3 = ACC ^ 3;
  146.     sbit a4 = ACC ^ 4;
  147.     sbit a5 = ACC ^ 5;
  148.     sbit a6 = ACC ^ 6;
  149.     sbit a7 = ACC ^ 7;
  150.    
  151.    
  152.     void clock_out(unsigned char dd){
  153.     ACC=dd;
  154.     clock_dat=a0; clock_clk=1; clock_clk=0;
  155.     clock_dat=a1; clock_clk=1; clock_clk=0;
  156.     clock_dat=a2; clock_clk=1; clock_clk=0;
  157.     clock_dat=a3; clock_clk=1; clock_clk=0;
  158.     clock_dat=a4; clock_clk=1; clock_clk=0;
  159.     clock_dat=a5; clock_clk=1; clock_clk=0;
  160.     clock_dat=a6; clock_clk=1; clock_clk=0;
  161.     clock_dat=a7; clock_clk=1; clock_clk=0;
  162.     }
  163.    
  164.    
  165.     unsigned char clock_in(void){
  166.     clock_dat=1;
  167.     a0=clock_dat;
  168.     clock_clk=1; clock_clk=0; a1=clock_dat;
  169.     clock_clk=1; clock_clk=0; a2=clock_dat;
  170.     clock_clk=1; clock_clk=0; a3=clock_dat;
  171.     clock_clk=1; clock_clk=0; a4=clock_dat;
  172.     clock_clk=1; clock_clk=0; a5=clock_dat;
  173.     clock_clk=1; clock_clk=0; a6=clock_dat;
  174.     clock_clk=1; clock_clk=0; a7=clock_dat;
  175.     return(ACC);
  176.     }
  177.    
  178.    
  179.     void write_clock(unsigned char ord, unsigned char dd){
  180.     clock_clk=0;
  181.     clock_Rst=0;
  182.     clock_Rst=1;
  183.     clock_out(ord);
  184.     clock_out(dd);
  185.     clock_Rst=0;
  186.     clock_clk=1;
  187.     }
  188.    
  189.    
  190.     unsigned char read_clock(unsigned char ord){
  191.     unsigned char dd=0;
  192.     clock_clk=0;
  193.     clock_Rst=0;
  194.     clock_Rst=1;
  195.     clock_out(ord);
  196.     dd=clock_in();
  197.     clock_Rst=0;
  198.     clock_clk=1;
  199.     return(dd);
  200.     }
  201.    
  202.    
  203.    
  204.     void Init_1302(void){

  205.     if(read_clock(0xc1) != 0xaa){
  206.     write_clock(0x8e,0x00);
  207.     write_clock(0x8c,0x21);
  208.     write_clock(0x8a,0x07);
  209.     write_clock(0x88,0x09);
  210.     write_clock(0x86,0x015);
  211.     write_clock(0x84,0x00);
  212.     write_clock(0x82,0x00);
  213.     write_clock(0x80,0x00);
  214.     write_clock(0x90,0xa5);
  215.     write_clock(0xc0,0xaa);
  216.     write_clock(0x8e,0x80);
  217.     }
  218.     }
  219.    
  220.    
  221.    
  222.     void Delay(int num){
  223.     while(num--) ;
  224.     }
  225.    
  226.     void Init_DS18B20(void){
  227.     unsigned char x=0;
  228.     DQ = 1;
  229.     Delay(35);
  230.     DQ = 0;
  231.     Delay(480);
  232.     DQ = 1;
  233.     Delay(70);
  234.     x=DQ;
  235.     Delay(90);
  236.     }
  237.    
  238.     unsigned char ReadOneChar(void){
  239.     unsigned char i=0;
  240.     unsigned char dat = 0;
  241.     for (i=8;i>0;i--){
  242.     DQ = 0;
  243.     dat>>=1;
  244.     DQ = 1;
  245.     if(DQ)
  246.     dat|=0x80;
  247.     Delay(30);
  248.     }
  249.     return(dat);
  250.     }
  251.    
  252.     void WriteOneChar(unsigned char dat){
  253.     unsigned char i=0;
  254.     for (i=8; i>0; i--){
  255.     DQ = 0;
  256.     DQ = dat&0x01;
  257.     Delay(30);
  258.     DQ = 1;
  259.     dat>>=1;
  260.     }
  261.     }
  262.    
  263.     unsigned int ReadTemperature(void){
  264.     unsigned char a=0;
  265.     unsigned char b=0;
  266.     unsigned int t=0;
  267.     float tt=0;
  268.     Init_DS18B20();
  269.     WriteOneChar(0xCC);
  270.     WriteOneChar(0x44);
  271.     Init_DS18B20();
  272.     WriteOneChar(0xCC);
  273.     WriteOneChar(0xBE);
  274.     a=ReadOneChar();
  275.     b=ReadOneChar();
  276.     t=b;
  277.     t<<=8;
  278.     t=t|a;
  279.     tt=t*0.0625;
  280.     t= tt*10+0.5;
  281.     return(t);
  282.     }
  283.    
  284.    
  285.    
  286.     void RealTime_Display(void){
  287.     unsigned int i=0,o=0,o2=0;
  288.     unsigned char a=0,b=0,c=0;
  289.     i=ReadTemperature();
  290.     a=i/100;
  291.     print2(0x40,a+0x30);
  292.     b=i/10-a*10;
  293.     print2(0x41,b+0x30);
  294.     print(0x42,".");
  295.     c=i-a*100-b*10;
  296.     print2(0x43,c+0x30);
  297.     print2(0x44,0x00);

  298.    
  299.     print(0x00,"20");
  300.     print2(0x02,(read_clock(0x8d)/16)+0x30);
  301.     print2(0x03,(read_clock(0x8d)%16)+0x30);
  302.     print(0x04,"/");
  303.    
  304.     print2(0x05,(read_clock(0x89)/16)+0x30);
  305.     print2(0x06,(read_clock(0x89)%16)+0x30);
  306.     print(0x07,"/");
  307.    
  308.     print2(0x08,(read_clock(0x87)/16)+0x30);
  309.     print2(0x09,(read_clock(0x87)%16)+0x30);

  310.     print2(0x0b,(read_clock(0x85)/16)+0x30);
  311.     print2(0x0c,(read_clock(0x85)%16)+0x30);
  312.     print(0x0d,":");
  313.    
  314.     print2(0x0e,(read_clock(0x83)/16)+0x30);
  315.     print2(0x0f,(read_clock(0x83)%16)+0x30);
  316.     print(0x10,":");
  317.    
  318.     print2(0x11,(read_clock(0x81)/16)+0x30);
  319.     print2(0x12,(read_clock(0x81)%16)+0x30);
  320.    
  321.     TIME_WW=read_clock(0x8b)%16;
  322.     print(0x46,"[");
  323.     switch (TIME_WW){
  324.     case 1:print(0x47,"Mon");break;
  325.     case 2:print(0x47,"Tues");break;
  326.     case 3:print(0x47,"Wed");break;
  327.     case 4:print(0x47,"Thur");break;
  328.     case 5:print(0x47,"Fri");break;
  329.     case 6:print(0x47,"Sat");break;
  330.     case 7:print(0x47,"Sun");break;
  331.     default: print(0x47,"Error");break;
  332.     }
  333.     if(TIME_WW==2||TIME_WW==4)
  334.     print(0x4b,"]");
  335.     else print(0x4a,"]");



  336.     print(0x54,"Lamp brightness:");
  337.     o=(ii/100*10+ii/10%10)*4;
  338.     print2(0x64,o/100+0x30);
  339.     print2(0x65,o/10%10+0x30);
  340.     print2(0x66,o%10+0x30);
  341.     print(0x67,"%");


  342.     print(0x14,"-------b:");
  343.     print(0x20,"%-------");


  344.     print(0x4E,"MODE:");
  345.     print2(0x53,mode+0x30);

  346.     }
  347.    

  348.    
  349.     void main (void){
  350.     LCM2402_Init();
  351.     Init_1302();
  352.     PWM_init();


  353.     while(1){

  354.     RealTime_Display();

  355.     }
  356.     }

  357.    
复制代码
这注释怎么变成这样了啊不会弄视频,只好上传附件
视频.zip (1.65 MB, 下载次数: 6)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:584814 发表于 2021-9-12 08:46 | 只看该作者
超时快与程序无关。
换DS1302的晶振,如果不行就换DS1302,这东东国产的就几毛钱。

评分

参与人数 1黑币 +4 收起 理由
gqzjl + 4 赞一个!

查看全部评分

回复

使用道具 举报

板凳
ID:884998 发表于 2021-9-12 11:05 | 只看该作者
你是不是接的晶振频率不对?检查一下晶振频率,不行就换晶振和ds1302,跟程序应该是一点关系没有

评分

参与人数 1黑币 +4 收起 理由
gqzjl + 4 赞一个!

查看全部评分

回复

使用道具 举报

地板
ID:143767 发表于 2021-9-12 12:17 | 只看该作者
也有可能晶振或晶振两边的电容问题

评分

参与人数 1黑币 +4 收起 理由
gqzjl + 4 赞一个!

查看全部评分

回复

使用道具 举报

5#
ID:639106 发表于 2021-9-12 12:39 | 只看该作者
MirrAKe 发表于 2021-9-12 11:05
你是不是接的晶振频率不对?检查一下晶振频率,不行就换晶振和ds1302,跟程序应该是一点关系没有

晶振和1302都换了,还是没用
回复

使用道具 举报

6#
ID:639106 发表于 2021-9-12 12:42 | 只看该作者
MirrAKe 发表于 2021-9-12 11:05
你是不是接的晶振频率不对?检查一下晶振频率,不行就换晶振和ds1302,跟程序应该是一点关系没有

是32.768K赫兹
回复

使用道具 举报

7#
ID:624769 发表于 2021-9-12 15:53 | 只看该作者
把所有代码都屏蔽,只留读时间的代码,就是确保没有写时间,只有读时间的代码,然后,观察5分钟,你说快10倍,观察5分钟,应该就走50分钟了吧? 然后就能确定,是硬件问题,还是软件问题。理论上,硬件问题,不会快10倍,如果实在是硬件问题。参考这个资料整改。 AN58.pdf (184.56 KB, 下载次数: 21)

评分

参与人数 1黑币 +4 收起 理由
gqzjl + 4 很给力!

查看全部评分

回复

使用道具 举报

8#
ID:592807 发表于 2021-9-13 09:02 | 只看该作者
gqzjl 发表于 2021-9-12 12:39
晶振和1302都换了,还是没用

我也做1302但是我是一天块十几分钟,块10倍没见过。我觉得你的DS1302的读写函数不太对,rst高低时间间隔太短了,你找个好点的例程抄一下吧。

评分

参与人数 1黑币 +4 收起 理由
gqzjl + 4 很给力!

查看全部评分

回复

使用道具 举报

9#
ID:401564 发表于 2021-9-13 10:52 | 只看该作者
DS1302走时不会快10位,是你程序的问题
如果是晶振用得不对,超过了10倍频率的,1302是不走的
回复

使用道具 举报

10#
ID:81196 发表于 2021-9-13 11:32 | 只看该作者
首先从误差的量级来讲是不可能的 ,即使外部晶振再不好,误差不可能这么大。相对误差在分钟级别还可以接受,但是你这是成倍数的。那就建议检查程序,是不是自己读错了,或者是解码解析错误了。
回复

使用道具 举报

11#
ID:207030 发表于 2021-9-13 14:39 | 只看该作者
代码有问题哦   去某一个宝卖开发板的  找个例程看看
回复

使用道具 举报

12#
ID:639106 发表于 2021-10-3 08:53 | 只看该作者
谢谢各位大神的指点,是程序有问题,现在修改好了       代码:
  1. /********************************************************************************************
  2. 程序名:    1602智能液晶屏时钟
  3. 硬件支持:  LCD1602液晶屏  STC12C5608+外部12MHZ晶振 DS1302+32.768KHZ晶振
  4. 说明备注:    使用2402液晶屏程序,与1602液晶屏程序完全兼容
  5. /********************************************************************************************/
  6. #include <STC12C5630AD.h>                                                // 包含头文件 //
  7. #include <intrins.h>
  8. /********************************************************************************************/
  9. typedef unsigned char      uint8;          // 无符号8位整型变量 //
  10. typedef unsigned char      uchar;          // 无符号8位整型变量 //
  11. /********************************************************************************************
  12. // 引脚定义 // (使用者根据实际更改)
  13. /********************************************************************************************/
  14. #define                LCM2402_DB0_DB7                P2                        // 定义LCM2402的数据总线
  15. sbit LCM2402_RS   = P1 ^ 5;                                        // 定义LCM2402的RS控制线
  16. sbit LCM2402_RW   = P1 ^ 6;                                        // 定义LCM2402的RW控制线
  17. sbit LCM2402_E    = P1 ^ 7;                                        // 定义LCM2402的E控制线
  18. sbit LCM2402_Busy = P2 ^ 7;                                        // 定义LCM2402的测忙线(与LCM2402_DB0_DB7关联)
  19. sbit DQ           = P1 ^ 3;                                        // 定义18B20的数据端
  20. sbit SCLK              = P1 ^ 0;                                        //定义ds1302_clk(1302时钟线)
  21. sbit DSIO             = P1 ^ 1;                                        //定义ds1302_dat(1302数据线)
  22. sbit RST                      = P1 ^ 2;                                        //定义ds1302_Rst(1302复位线)

  23. data unsigned char TIME_WW;//设置星期存放区

  24. /********************************************************************************************
  25. // 定义LCM2402指令集 // (详细请见技术手册)
  26. /********************************************************************************************/
  27. #define                        CMD_clear                0x01             // 清除屏幕
  28. #define                        CMD_back                0x02             // DDRAM回零位
  29. #define                        CMD_dec1                0x04             // 读入后AC(指针)减1,向左写
  30. #define                        CMD_add1                0x06             // 读入后AC(指针)加1,向右写
  31. #define                        CMD_dis_gb1                0x0f             // 开显示_开光标_开光标闪烁
  32. #define                        CMD_dis_gb2                0x0e             // 开显示_开光标_关光标闪烁
  33. #define                        CMD_dis_gb3                0x0c             // 开显示_关光标_关光标闪烁
  34. #define                        CMD_OFF_dis                0x08             // 关显示_关光标_关光标闪烁
  35. #define                        CMD_set82                0x38             // 8位总线_2行显示
  36. #define                        CMD_set81                0x30             // 8位总线_1行显示(上边行)
  37. #define                        CMD_set42                0x28             // 4位总线_2行显示
  38. #define                        CMD_set41                0x20             // 4位总线_1行显示(上边行)
  39. #define                        lin_1                        0x80             // 4位总线_1行显示(上边行)
  40. #define                        lin_2                        0xc0             // 4位总线_1行显示(上边行)
  41. /********************************************************************************************
  42. // 读LCM忙程序 [底层协议] // (所有底层协议都无需关注)
  43. // LCM2402测忙,若LCM2402处于忙状态,本函数将等待至非忙状态 //
  44. /********************************************************************************************/
  45. void LCM2402_TestBusy(void){
  46.            LCM2402_DB0_DB7 = 0xff;                //设备读状态
  47.            LCM2402_RS = 0;
  48.            LCM2402_RW = 1;
  49.            LCM2402_E = 1;
  50.            while(LCM2402_Busy);                //等待LCM不忙
  51.            LCM2402_E = 0;                                //
  52. }
  53. /********************************************************************************************
  54. // 写指令程序 //
  55. // 向LCM2402写命令 本函数需要1个指令集的入口参数 //
  56. /********************************************************************************************/
  57. void LCM2402_WriteCMD(uint8 LCM2402_command) {
  58.           LCM2402_TestBusy();
  59.           LCM2402_RS = 0;
  60.           LCM2402_RW = 0;
  61.           LCM2402_DB0_DB7 = (LCM2402_command/16)*16;
  62.           LCM2402_E = 1;
  63.           LCM2402_E = 0;
  64.           LCM2402_DB0_DB7 = (LCM2402_command%16)*16;
  65.           LCM2402_E = 1;
  66.           LCM2402_E = 0;
  67. }
  68. /********************************************************************************************
  69. // 写数据程序 //
  70. // 向LCM2402写数据 //
  71. /********************************************************************************************/
  72. void LCM2402_WriteData(uint8 LCM2402_data){
  73.     LCM2402_TestBusy();
  74.           LCM2402_RS = 1;
  75.           LCM2402_RW = 0;
  76.         LCM2402_DB0_DB7 = (LCM2402_data/16)*16;
  77.           LCM2402_E = 1;
  78.           LCM2402_E = 0;
  79.         LCM2402_DB0_DB7 = (LCM2402_data%16)*16;
  80.           LCM2402_E = 1;
  81.           LCM2402_E = 0;
  82. }
  83. /********************************************************************************************
  84. // 打印字符串程序 // (本函数调用指针函数)
  85. // 向LCM发送一个字符串,长度48字符之内
  86. // 第一行位置 0x00~0x17  第二行位置 0x40~0x57
  87. // 应用举例:print(0x80,"abc"); //在第一行第一位处从左向右打印abc字符串
  88. /********************************************************************************************/
  89. void print(uint8 a,uint8 *str){
  90.         LCM2402_WriteCMD(a | 0x80);
  91.         while(*str != '\0'){
  92.                 LCM2402_WriteData(*str++);
  93.         }
  94.         *str = 0;
  95. }
  96. /********************************************************************************************
  97. // 打印单字符程序 //
  98. // 第一行位置 0x00~0x17  第二行位置 0x40~0x57
  99. // 向LCM发送一个字符,以十六进制(0x00)表示
  100. // 应用举例:print(0xc0,0x30); //在第二行第一位处打印字符“0”
  101. /********************************************************************************************/
  102. void print2(uint8 a,uint8 t){
  103.                 LCM2402_WriteCMD(a | 0x80);
  104.                 LCM2402_WriteData(t);
  105. }
  106. /********************************************************************************************
  107. // 定义小汉字 //
  108. // 可写入8个自字义字符,写入后可用其CGRAM代码直接提取显示。
  109. // 字符定义方法请参考技术手册
  110. /********************************************************************************************/
  111. uint8 code Xword[]={
  112.     0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00,        //℃,代码 0x00
  113.     0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,        //一,代码 0x01
  114.     0x00,0x00,0x00,0x0e,0x00,0xff,0x00,0x00,        //二,代码 0x02
  115.     0x00,0x00,0xff,0x00,0x0e,0x00,0xff,0x00,        //三,代码 0x03
  116.     0x00,0x00,0xff,0xf5,0xfb,0xf1,0xff,0x00,        //四,代码 0x04
  117.     0x00,0xfe,0x08,0xfe,0x0a,0x0a,0xff,0x00,        //五,代码 0x05
  118.     0x00,0x04,0x00,0xff,0x00,0x0a,0x11,0x00,        //六,代码 0x06
  119.     0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00,        //日,代码 0x07
  120. };
  121. void CgramWrite(void) {        // 装入CGRAM //
  122.     uint8 i;
  123.         LCM2402_WriteCMD(0x06);                        // CGRAM地址自动加1
  124.         LCM2402_WriteCMD(0x40);                        // CGRAM地址设为00处
  125.     for(i=0;i<64;i++) {
  126.             LCM2402_WriteData(Xword[i]);// 按数组写入数据
  127.     }
  128. }
  129. /********************************************************************************************
  130. // LCM2402初始化 //(使用者可自定义,加 * 号程序行必须保留但可修改)
  131. /********************************************************************************************/
  132. void LCM2402_Init(void){
  133.           LCM2402_WriteCMD(CMD_set42);        //* 显示模式设置:显示2行,每个字符为5*7个像素
  134.           LCM2402_WriteCMD(CMD_set42);        //* 显示模式设置:显示2行,每个字符为5*7个像素
  135.           LCM2402_WriteCMD(CMD_clear);        //  显示清屏
  136.           LCM2402_WriteCMD(CMD_back);                //* 数据指针指向第1行第1个字符位置
  137.           LCM2402_WriteCMD(CMD_add1);                //  显示光标移动设置:文字不动,光标右移
  138.           LCM2402_WriteCMD(CMD_dis_gb3);         //  显示开及光标设置:显示开,光标开,闪烁开
  139.         CgramWrite();                                        //  向CGRAM写入自定义字符
  140. }

  141. /******************************************************************************/
  142. //                        以上是LCM2402驱动程序                        //
  143. /*****************************************************************************/

  144. //---DS1302写入和读取时分秒的地址命令---//
  145. //---秒分时日月周年 最低位读写位;-------//
  146. uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
  147. uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

  148. //---DS1302时钟初始化2016年5月7日星期六12点00分00秒。---//
  149. //---存储顺序是秒分时日月周年,存储格式是用BCD码---//
  150. uchar TIME[7] = {0, 0, 0x12, 0x07, 0x05, 0x06, 0x16};

  151. /*******************************************************************************
  152. * 函 数 名         : Ds1302Write
  153. * 函数功能                   : 向DS1302命令(地址+数据)
  154. * 输    入         : addr,dat
  155. * 输    出         : 无
  156. *******************************************************************************/

  157. void Ds1302Write(uchar addr, uchar dat)
  158. {
  159.         uchar n;
  160.         RST = 0;
  161.         _nop_();_nop_();_nop_();_nop_();

  162.         SCLK = 0;//先将SCLK置低电平。
  163.         _nop_();_nop_();_nop_();_nop_();
  164.         RST = 1; //然后将RST(CE)置高电平。
  165.         _nop_();_nop_();_nop_();_nop_();

  166.         for (n=0; n<8; n++)//开始传送八位地址命令
  167.         {
  168.                 DSIO = addr & 0x01;//数据从低位开始传送
  169.                 addr >>= 1;
  170.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  171.                 _nop_();_nop_();_nop_();_nop_();
  172.                 SCLK = 0;
  173.                 _nop_();_nop_();_nop_();_nop_();
  174.         }
  175.         for (n=0; n<8; n++)//写入8位数据
  176.         {
  177.                 DSIO = dat & 0x01;
  178.                 dat >>= 1;
  179.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  180.                 _nop_();_nop_();_nop_();_nop_();
  181.                 SCLK = 0;
  182.                 _nop_();_nop_();_nop_();_nop_();       
  183.         }       
  184.                  
  185.         RST = 0;//传送数据结束
  186.         _nop_();_nop_();_nop_();_nop_();
  187. }

  188. /*******************************************************************************
  189. * 函 数 名         : Ds1302Read
  190. * 函数功能                   : 读取一个地址的数据
  191. * 输    入         : addr
  192. * 输    出         : dat
  193. *******************************************************************************/

  194. uchar Ds1302Read(uchar addr)
  195. {
  196.         uchar n,dat,dat1;
  197.         RST = 0;
  198.         _nop_();_nop_();_nop_();_nop_();

  199.         SCLK = 0;//先将SCLK置低电平。
  200.         _nop_();_nop_();_nop_();_nop_();
  201.         RST = 1;//然后将RST(CE)置高电平。
  202.         _nop_();_nop_();_nop_();_nop_();

  203.         for(n=0; n<8; n++)//开始传送八位地址命令
  204.         {
  205.                 DSIO = addr & 0x01;//数据从低位开始传送
  206.                 addr >>= 1;
  207.                 SCLK = 1;//数据在上升沿时,DS1302读取数据
  208.                 _nop_();_nop_();_nop_();_nop_();
  209.                 SCLK = 0;//DS1302下降沿时,放置数据
  210.                 _nop_();_nop_();_nop_();_nop_();
  211.         }
  212.         _nop_();_nop_();_nop_();_nop_();
  213.         for(n=0; n<8; n++)//读取8位数据
  214.         {
  215.                 dat1 = DSIO;//从最低位开始接收
  216.                 dat = (dat>>1) | (dat1<<7);
  217.                 SCLK = 1;
  218.                 _nop_();_nop_();_nop_();_nop_();
  219.                 SCLK = 0;//DS1302下降沿时,放置数据
  220.                 _nop_();_nop_();_nop_();_nop_();
  221.         }

  222.         RST = 0;
  223.         _nop_();_nop_();_nop_();_nop_();        //以下为DS1302复位的稳定时间,必须的。
  224.         SCLK = 1;
  225.         _nop_();_nop_();_nop_();_nop_();
  226.         DSIO = 0;
  227.         _nop_();_nop_();_nop_();_nop_();
  228.         DSIO = 1;
  229.         _nop_();_nop_();_nop_();_nop_();
  230.         return dat;       
  231. }

  232. /*******************************************************************************
  233. * 函 数 名         : Ds1302Init
  234. * 函数功能                   : 初始化DS1302.
  235. * 输    入         : 无
  236. * 输    出         : 无
  237. *******************************************************************************/

  238. void Ds1302Init()
  239. {
  240.         uchar n;
  241.         Ds1302Write(0x8E,0X00);                 //禁止写保护,就是关闭写保护功能
  242.         for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年
  243.         {
  244.                 Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);       
  245.                 _nop_();_nop_();
  246.         }
  247.         Ds1302Write(0x8E,0x80);                 //打开写保护功能
  248. }

  249. /*******************************************************************************
  250. * 函 数 名         : Ds1302ReadTime
  251. * 函数功能                   : 读取时钟信息
  252. * 输    入         : 无
  253. * 输    出         : 无
  254. *******************************************************************************/

  255. void Ds1302ReadTime()
  256. {
  257.         uchar n;
  258.         for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年
  259.         {
  260.                 TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
  261.                 _nop_();_nop_();
  262.         }
  263.                
  264. }

  265. /******************************************************************************/
  266. //DS18B20温度传感器驱动(显示0至60度)
  267. /******************************************************************************/
  268. void Delay(int num){//延时函数
  269.         while(num--) ;
  270. }       
  271. /******************************************************************************/
  272. void Init_DS18B20(void){//初始化ds1820
  273.         unsigned char x=0;
  274.         DQ = 1;    //DQ复位
  275.         Delay(35);  //稍做延时
  276.         DQ = 0;    //单片机将DQ拉低
  277.         Delay(480); //精确延时 大于 480us
  278.         DQ = 1;    //拉高总线
  279.         Delay(70);
  280.         x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  281.         Delay(90);
  282. }
  283. /******************************************************************************/
  284. unsigned char ReadOneChar(void){//读一个字节
  285.         unsigned char i=0;
  286.         unsigned char dat = 0;
  287.         for (i=8;i>0;i--){
  288.                 DQ = 0; // 给脉冲信号
  289.                 dat>>=1;
  290.                 DQ = 1; // 给脉冲信号
  291.                 if(DQ)
  292.                 dat|=0x80;
  293.                 Delay(30);
  294.         }
  295.         return(dat);
  296. }
  297. /******************************************************************************/
  298. void WriteOneChar(unsigned char dat){//写一个字节
  299.         unsigned char i=0;
  300.         for (i=8; i>0; i--){
  301.                 DQ = 0;
  302.                 DQ = dat&0x01;
  303.                 Delay(30);
  304.                 DQ = 1;
  305.                 dat>>=1;
  306.         }
  307. }
  308. /******************************************************************************/
  309. unsigned int ReadTemperature(void){//读取温度
  310.         unsigned char a=0;
  311.         unsigned char b=0;
  312.         unsigned int t=0;
  313.         float tt=0;
  314.         Init_DS18B20();
  315.         WriteOneChar(0xCC); // 跳过读序号列号的操作
  316.         WriteOneChar(0x44); // 启动温度转换
  317.         Init_DS18B20();
  318.         WriteOneChar(0xCC); //跳过读序号列号的操作
  319.         WriteOneChar(0xBE); //读取温度寄存器
  320.         a=ReadOneChar();  //读低8位
  321.         b=ReadOneChar(); //读高8位
  322.         t=b;
  323.         t<<=8;
  324.         t=t|a;
  325.         tt=t*0.0625;
  326.         t= tt*10+0.5; //放大10倍输出并四舍五入
  327.         return(t);
  328. }
  329. /*****************************************************************************/
  330. //显示项目 时间部分 在第一行全行显示时间
  331. /*********************************************************************************************/   
  332. // 测试用函数 //
  333. void main (void){
  334.         LCM2402_Init();//LCD初始化                                           
  335.         Ds1302Init();//DS1302初始化   

  336.         while(1){ //主线程//

  337.         unsigned int i=0,o=0,o2=0;
  338.         unsigned char a=0,b=0,c=0;
  339.                 i=ReadTemperature();           
  340.                 a=i/100;
  341.             print2(0x40,a+0x30);
  342.                 b=i/10-a*10;
  343.             print2(0x41,b+0x30);               
  344.                 print(0x42,".");
  345.                 c=i-a*100-b*10;
  346.                 print2(0x43,c+0x30);                //显示温度
  347.             print2(0x44,0x00);                        //显示℃

  348.                 //
  349.                 Ds1302ReadTime();
  350.             print(0x00,"20");       
  351.             print2(0x02,TIME[6]/16+0x30);   
  352.             print2(0x03,(TIME[6]&0x0f)+0x30);                           //个位要打括号(先算)
  353.                 print(0x04,"/");            // 显示年
  354.                 //
  355.             print2(0x05,TIME[4]/16+0x30);  
  356.             print2(0x06,(TIME[4]&0x0f)+0x30);
  357.                 print(0x07,"/");            // 显示月
  358.                 //
  359.             print2(0x08,TIME[3]/16+0x30);  
  360.             print2(0x09,(TIME[3]&0x0f)+0x30);  

  361.             print2(0x0b,TIME[2]/16+0x30);  
  362.             print2(0x0c,(TIME[2]&0x0f)+0x30);  
  363.                 print(0x0d,":");            
  364.                 ////小时

  365.             print2(0x0e,TIME[1]/16+0x30);  
  366.             print2(0x0f,(TIME[1]&0x0f)+0x30);  
  367.                 print(0x10,":");            
  368.                 ////分钟

  369.             print2(0x11,TIME[0]/16+0x30);
  370.             print2(0x12,(TIME[0]&0x0f)+0x30);  
  371.                 ////秒




  372.             TIME_WW=TIME[5]&0x0f;       
  373.                 print(0x46,"[");  
  374.         switch (TIME_WW){               
  375.                   case 1:print(0x47,"Mon");break;                        
  376.                   case 2:print(0x47,"Tues");break;                        
  377.                   case 3:print(0x47,"Wed");break;                        
  378.                   case 4:print(0x47,"Thur");break;                        
  379.                   case 5:print(0x47,"Fri");break;                        
  380.                   case 6:print(0x47,"Sat");break;                        
  381.                   case 7:print(0x47,"Sun");break;                        
  382.                   default: print(0x47,"Error");break;                                         
  383.                 }                                                                                 //显示星期
  384.                 if(TIME_WW==2||TIME_WW==4)                                                                       
  385.                         print(0x4b,"]");  
  386.                 else print(0x4a,"]");         
  387.                  
  388.         }
  389. }

  390. /*********************************************************************************************/
复制代码



回复

使用道具 举报

13#
ID:479619 发表于 2021-10-14 13:58 | 只看该作者
ds1320读函数错了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表