找回密码
 立即注册

QQ登录

只需一步,快速开始

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

P10 LED屏_DS3231_STC89C52单片机制作电子钟 附程序

  [复制链接]
跳转到指定楼层
楼主
      参考了在51黑电子论坛里查到了好几位坛友发表的P10LED屏,用STC来驱动的帖子,其主要参考了未署名的一位网友的程序,在此表示感谢!
      本帖子中采用了STC89C52作为MCU,DS3231作为时钟源,P10LED屏作为显示屏,显示效果如下几图和一个短视频。在这里值得一提的是P10供电电源问题,标准供电电压为5V,由于是远距离观看屏显示,在室内观看时亮度太高,非常刺眼,最关键是非常耗电,经过试验,把供电电压高低到2.3V左右就可以了,且电流只100MA左右,用普通的手机充电器供电都完全可以了。我再蒙上一层半透光的膜片效果更好了。

制作出来的实物图如下:



程序文件:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. //#define uchar unsigned char
  4. //#define uint unsigned int
  5. #define NOP _nop_()
  6. #define u8 unsigned char
  7. #define u16  unsigned int
  8. sbit OE = P2^0;  //P10
  9. sbit A1 = P2^1;  //P10
  10. sbit B1 = P2^2;  //P10
  11. sbit SHCP=P2^4; //P10 11脚SHCP 移位时钟
  12. sbit STCP=P2^3; //P10 12脚STCP 锁存时钟
  13. sbit DATA=P2^5; //P10 数据输入
  14. //时钟DS3231接口
  15. sbit DSSDA =P2^7;//接时钟DS3231的SDA脚于P2.7
  16. sbit DSSCL=P2^6; //接时钟DS3231的SCL脚于P2.6
  17. sbit LED=P1^2;    //定义LED端口
  18. //sbit LED1=P1^3;
  19. sbit SHEZ=P3^7;    //设置键,从年、月、日、周、时、分、秒顺序移动;键值1-7
  20. sbit JIA=P3^6;     //设置键值为1-7时,对应值加1;
  21. sbit JIAN=P3^5;    //设置键值为1-7时,对应值减1;
  22. sbit QUED=P3^4;    //完成设置后,使设置键的键值为0,保存到DS3231,完成时间的修改

  23. u8 code shisu[28][8]=   //时钟数字
  24. {
  25. {0x00,0x38,0x44,0x44,0x44,0x44,0x44,0x38},//0
  26. {0x00,0x18,0x38,0x18,0x18,0x18,0x18,0x3c},//1
  27. {0x00,0x38,0x44,0x44,0x08,0x10,0x20,0x7c},//2
  28. {0x00,0x38,0x44,0x04,0x18,0x04,0x44,0x38},//3
  29. {0x00,0x08,0x18,0x28,0x48,0x7c,0x08,0x08},//4
  30. {0x00,0x7c,0x40,0x78,0x04,0x04,0x44,0x38},//5
  31. {0x00,0x38,0x44,0x40,0x78,0x44,0x44,0x38},//6
  32. {0x00,0x7c,0x44,0x08,0x10,0x10,0x10,0x10},//7
  33. {0x00,0x38,0x44,0x44,0x38,0x44,0x44,0x38},//8
  34. {0x00,0x38,0x44,0x44,0x3c,0x04,0x44,0x38},//9
  35. {0x20,0x3c,0x48,0x3c,0x28,0x7e,0x08,0x08},//10年
  36. {0x00,0x3e,0x22,0x3e,0x22,0x3e,0x22,0x46},//11月
  37. {0x00,0xfe,0x92,0xba,0xfe,0xba,0xaa,0xba},//12周
  38. {0x00,0x02,0xe2,0xaf,0xe2,0xaa,0xe2,0x06},//13时
  39. {0x00,0x28,0x24,0x42,0xbc,0x14,0x24,0x4c},//14分
  40. {0x00,0x74,0x2e,0xf5,0x26,0x74,0xa8,0x30},//15秒
  41. {0x00,0x00,0x00,0x02,0x7f,0x00,0x00,0x00},//16一
  42. {0x00,0x00,0x3c,0x00,0x00,0x00,0x7e,0x00},//17二
  43. {0x00,0x00,0x3c,0x00,0x3c,0x00,0x7e,0x00},//18三
  44. {0x00,0xfe,0xaa,0xaa,0xaa,0xce,0x82,0xfe},//19四
  45. {0x00,0x3c,0x10,0x10,0x3c,0x14,0x24,0x7e},//20五
  46. {0x00,0x20,0x10,0x7c,0x00,0x28,0x44,0x00},//21 六
  47. {0x00,0x3e,0x22,0x22,0x3e,0x22,0x22,0x3e},//22日
  48. {0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x00},//23 :
  49. {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, //24 无显示
  50. {0x00,0x60,0x6c,0x12,0x10,0x10,0x12,0x0c},  //25℃
  51. {0x00,0x00,0xf8,0x20,0x22,0x20,0x22,0x20},    //26 T:
  52. {0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00}   //27 -
  53. };


  54. u8 code shisuz[4][8]=  //十位数
  55. {
  56. {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},  //0
  57. {0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20},   //1
  58. {0x00,0xc0,0x20,0x20,0x60,0x80,0x80,0x60},  //2
  59. {0x00,0xc0,0x20,0x20,0xc0,0x20,0x20,0xc0}  //3
  60. };
  61. u8 code shisuy[10][8]=  //个位数
  62. {
  63. {0x00,0x06,0x09,0x09,0x09,0x09,0x09,0x06},//0
  64. {0x00,0x02,0x06,0x02,0x02,0x02,0x02,0x07},//1
  65. {0x00,0x06,0x09,0x09,0x01,0x02,0x04,0x0f},//2
  66. {0x00,0x06,0x09,0x01,0x06,0x01,0x09,0x06},//3
  67. {0x00,0x02,0x06,0x0a,0x0a,0x0f,0x02,0x02},//4
  68. {0x00,0x0f,0x08,0x0e,0x01,0x01,0x09,0x06},//5
  69. {0x00,0x06,0x09,0x08,0x0e,0x09,0x09,0x06},//6
  70. {0x00,0x0f,0x09,0x02,0x02,0x02,0x02,0x02},//7
  71. {0x00,0x06,0x09,0x09,0x06,0x09,0x09,0x06},//8
  72. {0x00,0x06,0x09,0x09,0x07,0x01,0x09,0x06},//9
  73. };
  74. u8 table1[2][32];//P10写屏变量
  75. u8 T[7]=0,hp=0,js=0,sz,tt;   //定义时间变量:秒、分、时、周、日、月、年;换屏变量,温度
  76. bit f;   //定义温度符号
  77. void DS3231_IIC_delay(void);     //延时函数
  78. void DS3231_IIC_start(void) ;  //起始信号
  79. void DS3231_IIC_stop(void);   //停止信号
  80. void DS3231_IIC_Tack(void);   //接收应答
  81. void DS3231_IIC_write_byte(u8 Data);   //写入一个字节的数据函数
  82. u8 DS3231_IIC_read_byte(void);  //读取1个字节数据函数
  83. void DS3231_IIC_single_byte_write(u8 Waddr,u8 Data); //写入数据函数
  84. u8 DS3231_IIC_single_byte_read(u8 Waddr); //读取数据函数
  85. void DS3231_IIC_lianxu_read(void);  //连续读取0H-06H中的数据
  86. void DS3231_IIC_Init(void);  //初始化
  87. void Init_Timer0(void);    //定时零提供秒闪
  88. void dushu(u8 n);   //写数据
  89. void KEY(void);    //按键函数
  90. void get_T(void);   //温度获取
  91. /*******************************************************************************************/
  92. /*******************************************************************************************/

  93. void Delay1ms(u16 mm)                //11.0592MHz
  94. {
  95.   u8 i, j,k;
  96.   _nop_();  
  97. for(k=0;k<mm;k++)     
  98. { i = 2;
  99.   j = 199;        
  100.   do  {  while (--j);  } while (--i);
  101.   }
  102. }

  103. //P10数据串行输入
  104. void serial_input(u8 dat)
  105. {
  106. u16 m;
  107. for(m=0;m<8;m++)
  108. {
  109. if(dat & 0x80)
  110. DATA=0;  //
  111. else
  112. DATA=1;  //修改取反
  113. SHCP=0;
  114. SHCP=1;
  115. NOP;
  116. NOP;
  117. SHCP=0;
  118. NOP;
  119. NOP;
  120. dat=dat<<1;
  121. }
  122. }
  123. /*******************************************************************************************/
  124. //P10并出
  125. void serial_output()
  126. {
  127. STCP=1;
  128. NOP;
  129. NOP;
  130. STCP=0;
  131. }
  132. /*******************************************************************************************/
  133. /*******************************************************************************************/
  134. //P10行显控制
  135. void HC138_scan(u8 temp)
  136. {
  137. OE=1;
  138. A1=0x01 & temp;
  139. B1=0x01 &(temp>>1);
  140. }
  141. /*******************************************************************************************/
  142. //读取数字函数
  143. void dushu(u8 n)  //参数0正常显示,参数1为设置
  144. {
  145. u8 i;
  146. if(n==0)
  147. {        
  148.         for(i=0;i<8;i++)
  149.         table1[0][2*i]=shisu[T[2]>>4][i];//上部 0
  150.         for(i=0;i<8;i++)
  151.         if(LED==1) table1[0][2*i+1]=shisu[T[2]&0x0f][i]|shisu[23][i];        
  152.         else table1[0][2*i+1]=shisu[T[2]&0x0f][i];//上部 1|shisuz[2][i]
  153.         for(i=0;i<8;i++)        
  154.         table1[1][2*i]=shisu[T[1]>>4][i];//上部 2
  155.         for(i=0;i<8;i++)
  156.         table1[1][2*i+1]=shisu[T[1]&0x0f][i];//上部 3
  157.         switch(hp)
  158.                 {
  159.                 case 0:{
  160.                                 for(i=8;i<16;i++)
  161.                                 table1[0][2*i]=shisuz[T[6]>>4][i-8]|shisuy[T[6]&0x0f][i-8];  //下部 0
  162.                                 for(i=8;i<16;i++)
  163.                                 table1[0][2*i+1]=shisu[10][i-8];  //下部 1  年字
  164.                                 for(i=8;i<16;i++)
  165.                                 table1[1][2*i]=shisuz[T[5]>>4][i-8]|shisuy[T[5]&0x0f][i-8]; //下部 2  周字
  166.                                 for(i=8;i<16;i++)
  167.                                 table1[1][2*i+1]=shisu[11][i-8]; //下部 3  月
  168.                           }
  169.                                 break;  //显示年月
  170.                 case 1:{
  171.                                 for(i=8;i<16;i++)
  172.                                 table1[0][2*i]=shisuz[T[4]>>4][i-8]|shisuy[T[4]&0x0f][i-8];  //下部 0
  173.                                 for(i=8;i<16;i++)
  174.                                 table1[0][2*i+1]=shisu[22][i-8];  //下部 1  日字
  175.                                 for(i=8;i<16;i++)
  176.                                 table1[1][2*i]=shisu[12][i-8]; //下部 2  周字
  177.                                 for(i=8;i<16;i++)
  178.                                 table1[1][2*i+1]=shisu[T[3]+15][i-8]; //下部 3
  179.                           }
  180.                                 break;  //显示日和星期
  181.                 case 2:{
  182.                              get_T();    //首先获取温度
  183.                             if(f==0)
  184.                                 for(i=8;i<16;i++)
  185.                                 table1[0][2*i]=shisu[26][i-8];  //下部 首位显示T:
  186.                             else
  187.                                 for(i=8;i<16;i++)
  188.                                 table1[0][2*i]=shisu[27][i-8];        //下部首位显示-                           
  189.                                 for(i=8;i<16;i++)
  190.                                 table1[0][2*i+1]=shisu[tt/10][i-8];  //下部 1
  191.                                 for(i=8;i<16;i++)
  192.                                 table1[1][2*i]=shisu[tt%10][i-8]; //下部 2
  193.                                 for(i=8;i<16;i++)
  194.                                 table1[1][2*i+1]=shisu[25][i-8]; //下部 3
  195.                           }
  196.                                 break;  //显示温度


  197.          }               

  198. }
  199. else
  200. {
  201.         /********************设置日期时上半部分显示内容*************************************/
  202.         switch(sz)
  203.                 {
  204.                 case 1:{    //修改年份
  205.                                 for(i=0;i<8;i++)
  206.                                 table1[0][2*i]=shisu[T[6]/10][i];//上部 0 年的十位,不闪烁
  207.                                 for(i=0;i<8;i++)
  208.                                 if(LED==1) table1[0][2*i+1]=shisu[T[6]%10][i];        
  209.                                 else table1[0][2*i+1]=shisu[24][i];//上部 1
  210.                                 for(i=0;i<8;i++)        
  211.                                 table1[1][2*i]=shisu[10][i];//上部 2   显示年
  212.                                 for(i=0;i<8;i++)
  213.                                 table1[1][2*i+1]=shisu[24][i];//上部 3  不显示
  214.                           }
  215.                                 break;
  216.                 case 2:{    //修改月份
  217.                                 for(i=0;i<8;i++)
  218.                                 table1[0][2*i]=shisu[T[5]/10][i];//上部 0 月的十位,不闪烁
  219.                                 for(i=0;i<8;i++)
  220.                                 if(LED==1) table1[0][2*i+1]=shisu[T[5]%10][i];        
  221.                                 else table1[0][2*i+1]=shisu[24][i];//上部 1
  222.                                 for(i=0;i<8;i++)        
  223.                                 table1[1][2*i]=shisu[11][i];//上部 2   显示月
  224.                                 for(i=0;i<8;i++)
  225.                                 table1[1][2*i+1]=shisu[24][i];//上部 3  不显示
  226.                           }
  227.                                 break;
  228.                 case 3:{    //修改日期
  229.                                 for(i=0;i<8;i++)
  230.                                 table1[0][2*i]=shisu[T[4]/10][i];//上部 0 日的十位,不闪烁
  231.                                 for(i=0;i<8;i++)
  232.                                 if(LED==1) table1[0][2*i+1]=shisu[T[4]%10][i];        
  233.                                 else table1[0][2*i+1]=shisu[24][i];//上部 1
  234.                                 for(i=0;i<8;i++)        
  235.                                 table1[1][2*i]=shisu[22][i];//上部 2   显示日
  236.                                 for(i=0;i<8;i++)
  237.                                 table1[1][2*i+1]=shisu[24][i];//上部 3  不显示
  238.                           }
  239.                                 break;
  240.                 case 4:{    //修改星期
  241.                                 for(i=0;i<8;i++)
  242.                                 table1[0][2*i]=shisu[24][i];//上部 0 星期的十位,不显示
  243.                                 for(i=0;i<8;i++)
  244.                                 if(LED==1) table1[0][2*i+1]=shisu[T[3]][i];        
  245.                                 else table1[0][2*i+1]=shisu[24][i];//上部 1|shisuz[2][i]
  246.                                 for(i=0;i<8;i++)        
  247.                                 table1[1][2*i]=shisu[12][i];//上部 2   显示周
  248.                                 for(i=0;i<8;i++)
  249.                                 table1[1][2*i+1]=shisu[24][i];//上部 3  不显示
  250.                           }
  251.                                 break;
  252.                 case 5:{    //修改小时
  253.                                 for(i=0;i<8;i++)
  254.                                 table1[0][2*i]=shisu[T[2]/10][i];//上部 0 小时的十位,不闪烁
  255.                                 for(i=0;i<8;i++)
  256.                                 if(LED==1) table1[0][2*i+1]=shisu[T[2]%10][i];        
  257.                                 else table1[0][2*i+1]=shisu[24][i];//上部 1|shisuz[2][i]
  258.                                 for(i=0;i<8;i++)        
  259.                                 table1[1][2*i]=shisu[13][i];//上部 2   显示时
  260.                                 for(i=0;i<8;i++)
  261.                                 table1[1][2*i+1]=shisu[24][i];//上部 3  不显示
  262.                           }
  263.                                 break;
  264.                 case 6:{    //修改分钟
  265.                                 for(i=0;i<8;i++)
  266.                                 table1[0][2*i]=shisu[T[1]/10][i];//上部 0 分钟的十位,不闪烁
  267.                                 for(i=0;i<8;i++)
  268.                                 if(LED==1) table1[0][2*i+1]=shisu[T[1]%10][i];        
  269.                                 else table1[0][2*i+1]=shisu[24][i];//上部 1|shisuz[2][i]
  270.                                 for(i=0;i<8;i++)        
  271.                                 table1[1][2*i]=shisu[14][i];//上部 2   显示分
  272.                                 for(i=0;i<8;i++)
  273.                                 table1[1][2*i+1]=shisu[24][i];//上部 3  不显示
  274.                           }
  275.                                 break;
  276.                 case 7:{    //修改秒钟
  277.                                 for(i=0;i<8;i++)
  278.                                 table1[0][2*i]=shisu[T[0]/10][i];//上部 0 秒的十位,不闪烁
  279.                                 for(i=0;i<8;i++)
  280.                                 if(LED==1) table1[0][2*i+1]=shisu[T[0]%10][i];        
  281.                                 else table1[0][2*i+1]=shisu[24][i];//上部 1|shisuz[2][i]
  282.                                 for(i=0;i<8;i++)        
  283.                                 table1[1][2*i]=shisu[15][i];//上部 2   显示秒
  284.                                 for(i=0;i<8;i++)
  285.                                 table1[1][2*i+1]=shisu[24][i];//上部 3  不显示
  286.                           }
  287.                                 break;                           


  288.            }
  289.         
  290. /*************设置日期时下部均不显示************************/
  291.                                 for(i=8;i<16;i++)
  292.                                 table1[0][2*i]=shisu[24][i-8];  //下部 0
  293.                                 for(i=8;i<16;i++)
  294.                                 table1[0][2*i+1]=shisu[24][i-8];  //下部 1
  295.                                 for(i=8;i<16;i++)
  296.                                 table1[1][2*i]=shisu[24][i-8]; //下部 2
  297.                                 for(i=8;i<16;i++)
  298.                                 table1[1][2*i+1]=shisu[24][i-8]; //下部 3
  299. }
  300. }

  301. /*******************************************************************************************/
  302. //P10整屏显示
  303. void display(void)
  304. {
  305. u8 i,j,k;

  306. for(k=0;k<4;k++) //显示的四行
  307. {
  308. for(j=0;j<2;j++) //显示3、4列
  309. {
  310. for(i=0;i<2;i++) // 显示1、2列
  311. {
  312.         
  313. serial_input(table1[j][3*8+2*k+i]);
  314. serial_input(table1[j][2*8+2*k+i]);
  315. serial_input(table1[j][1*8+2*k+i]);
  316. serial_input(table1[j][0*8+2*k+i]);
  317. }
  318. }
  319. serial_output();
  320. HC138_scan(k);
  321. }
  322. }

  323. /*******************************************************************************************/
  324. /*******************************************************************************************/
  325. /*******************************************************************************************/
  326. /*******************************************************************************************/
  327. void main()
  328. {
  329. // u8 i, Waddr=0;        
  330. Init_Timer0();        
  331. Delay1ms(1);        
  332. DS3231_IIC_Init();
  333. /*   T[0]=0x00;  //0秒
  334.     T[1]=0x01;  //50分
  335.     T[2]=0x22;  //23点
  336.     T[3]=0x05;  //星期日
  337.     T[4]=0x07;  //7日
  338.     T[5]=0x05;  //5月
  339.     T[6]=0x21;  //21年
  340.         for(i=0;i<7;i++)  //写入日期和时间
  341.   {
  342.    DS3231_IIC_single_byte_write(Waddr,T[i]);
  343.    Waddr++;
  344.   }         */  
  345. Delay1ms(2);
  346. //display();
  347. DS3231_IIC_lianxu_read();  //连续读取0H-06H中的数据
  348. Delay1ms(2);
  349.   dushu(0);        
  350. while(1)
  351. {
  352. /* if(LED==1)
  353. {
  354.   DS3231_IIC_lianxu_read();  //连续读取0H-06H中的数据        
  355.   dushu();
  356.   }*/
  357.         display();  //显示
  358.         KEY();    //键盘扫描
  359.         if(sz!=0) dushu(1);
  360. /*Delay1ms();
  361. Delay1ms();        
  362. Delay1ms();
  363. Delay1ms();        */
  364. }
  365. }

  366. void DS3231_IIC_delay(void)     //延时函数
  367. {
  368. u8 i;
  369. for(i=0;i<1;i++);
  370. }
  371. void DS3231_IIC_start(void)   //起始信号
  372. {
  373. DSSDA=1;
  374.   DSSCL=1;
  375.    DS3231_IIC_delay();
  376.     DSSDA=0;
  377.    DS3231_IIC_delay();
  378.   DSSCL=0;
  379. }
  380. void DS3231_IIC_stop(void)   //停止信号
  381. {
  382. DSSDA=0;
  383.   DS3231_IIC_delay();
  384.    DSSCL=1;
  385.    DS3231_IIC_delay();
  386.   DSSDA=1;
  387. DS3231_IIC_delay();
  388. }
  389. void DS3231_IIC_Tack(void)   //接收应答
  390. {
  391.    DSSCL=1;  //拉高SCL
  392.    DS3231_IIC_delay();
  393.     while(DSSDA==1);       //由P2.7读入1,表示3231无应答,需要等待
  394.     DS3231_IIC_delay();
  395.    DSSCL=0;  //拉低SCL
  396.   DS3231_IIC_delay();
  397. }
  398. void DS3231_IIC_write_byte(u8 Data)   //写入一个字节的数据函数
  399. {
  400.   u8 i;
  401.   for (i=0;i<8;i++)
  402.   {
  403.    if(Data&0x80)
  404.     DSSDA=1;
  405.     else
  406.     DSSDA=0;
  407.     DS3231_IIC_delay();
  408.     DSSCL=1;
  409.     DS3231_IIC_delay();
  410.     DSSCL=0;
  411.     DS3231_IIC_delay();
  412.     Data=Data<<1;
  413.   }
  414. }
  415. u8 DS3231_IIC_read_byte(void)  //读取1个字节数据函数
  416. {
  417. u8 i,Data;
  418. for(i=0;i<8;i++)
  419. {
  420.     DSSCL=1;
  421.      DS3231_IIC_delay();
  422.       Data=Data<<1;
  423.        DS3231_IIC_delay();
  424.       if(DSSDA)
  425.        Data=Data|0x01;
  426.       DSSCL=0;
  427.     DS3231_IIC_delay();   
  428.   }
  429. return Data;
  430. }
  431. void DS3231_IIC_single_byte_write(u8 Waddr,u8 Data) //写入数据函数
  432. {
  433. DS3231_IIC_start();
  434. DS3231_IIC_write_byte(0xd0);//DS3231的地址
  435. DS3231_IIC_Tack();
  436.   DS3231_IIC_write_byte(Waddr);//欲写入的地址
  437. DS3231_IIC_Tack();
  438.    DS3231_IIC_write_byte(Data);//欲写入的地址数据
  439. DS3231_IIC_Tack();
  440. DS3231_IIC_stop();
  441. }
  442. u8 DS3231_IIC_single_byte_read(u8 Waddr) //读取数据函数
  443. {
  444. u8 Data;
  445.   DS3231_IIC_start();
  446.    DS3231_IIC_write_byte(0xd0);//DS3231的地址
  447.     DS3231_IIC_Tack();
  448.    DS3231_IIC_write_byte(Waddr);//欲读取的地址,本质上是移动指针
  449.   DS3231_IIC_Tack();
  450. DS3231_IIC_stop();
  451.   DS3231_IIC_start();
  452. DS3231_IIC_write_byte(0xd1);//告诉3231欲读取指针所指寄存器内容
  453. DS3231_IIC_Tack();
  454. Data=DS3231_IIC_read_byte();
  455. DS3231_IIC_delay();
  456. DS3231_IIC_stop();
  457. return Data;
  458. }
  459. void DS3231_IIC_lianxu_read(void)  //连续读取0H-06H中的数据
  460. {
  461. u8 i,Waddr;
  462. Waddr=0x00;
  463.   for(i=0;i<7;i++)
  464.   {
  465.    T[i]=DS3231_IIC_single_byte_read(Waddr);
  466.    Waddr=Waddr+1;
  467.   }        
  468. }        
  469. void DS3231_IIC_Init(void)  //初始化
  470. {
  471.     DSSDA=1;
  472.     DSSCL=1;
  473.     DS3231_IIC_single_byte_write(0x0e,0x00);
  474. }
  475. /*********温度获取***************/
  476. void get_T(void)         
  477. {
  478.     u8 Tem_L,Tem_H;
  479.     Tem_H=DS3231_IIC_single_byte_read(0x11);    //温度 高字节 整数部分
  480.         Tem_L=DS3231_IIC_single_byte_read(0x12);         //温度 低字节 小数部分
  481.         
  482.         Tem_L = (Tem_L>>6)*0.25+0.5;         //小数部分四舍五入
  483.      tt=Tem_H+Tem_L;
  484.         f=Tem_H>>7 ; //是1的话表示负温度,0为正温度
  485. }

  486. /*------------------------------------------------
  487.                     定时器初始化子程序
  488. ------------------------------------------------*/
  489. void Init_Timer0(void)
  490. {
  491. TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
  492. //TMOD |= 0x11;        
  493. TH0=(65536-2000)/256;              //给定初值 2毫秒
  494. TL0=(65536-2000)%256;
  495. EA=1;            //总中断打开
  496. ET0=1;           //定时器中断打开
  497. TR0=1;           //定时器开关打开
  498. /*TMOD |= 0x10;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
  499. TH1=0x00;              //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
  500. TL1=0x00;
  501. //EA=1;            //总中断打开
  502. ET1=1;           //定时器中断打开
  503. TR1=1;           //定时器开关打开        
  504.         IT1=1;*/
  505. }
  506. /*------------------------------------------------
  507.                  定时器中断子程序
  508. ------------------------------------------------*/
  509. void Timer0_isr(void) interrupt 1 //using 1
  510. {
  511.         static unsigned char num;
  512. TH0=(65536-2000)/256;                  //重新赋值 2毫秒
  513. TL0=(65536-2000)%256;

  514.   num++;
  515. if(num==250)
  516. {
  517.    num=0;
  518.    js++;
  519.    LED=~LED;          //指示灯反相,可以看到闪烁
  520. if(sz==0)
  521. {         
  522.          dushu(0);         
  523.   if(js==10)
  524.   {        
  525.     js=0;
  526.     hp++;
  527.          if(hp==3) hp=0;         
  528.     DS3231_IIC_lianxu_read();  //连续读取0H-06H中的数据        

  529.   }
  530. }
  531. /*display();         
  532.     */
  533.          
  534. }
  535. }
  536. /*
  537. //外部中断解码程序
  538. void intersvr1(void) interrupt 2 using 1
  539. {
  540.   LED1=~LED1;       //LED1闪烁
  541.         
  542. }
  543. */

  544. /*------------------------------------------------
  545.                  定时器中断子程序
  546. ------------------------------------------------
  547. void Timer1_isr(void) interrupt 3 using 1
  548. {
  549. TH1=(65536-2000)/256;                 //重新赋值
  550. TL1=(65536-2000)%256;
  551. ss++;
  552. if(ss==250)
  553. {
  554. ss=0;        
  555. LED=~LED;       //LED闪烁

  556. }


  557. }*/
  558. void KEY(void)    //按键函数
  559. {
  560.   u8 i,ss,Waddr=0;        
  561.   if(SHEZ==0)
  562.   {
  563.     Delay1ms(15);
  564.         if(SHEZ==0)       //如果没有按下就跳出
  565.         {
  566.           while(!SHEZ);  //等待按键松开
  567.           sz++;
  568.           if(sz==1)
  569.            for(i=0;i<7;i++)
  570.                    T[i]=(T[i]>>4)*10+(T[i]&0x0f) ;  //将BCD十六进制数转化为十进制数
  571.        if(sz==8) sz=1;               
  572.         }               
  573.   }         
  574.   if(JIA==0)  //加1键
  575.   {
  576.     Delay1ms(15);
  577.         if(JIA==0)       //如果没有按下就跳出
  578.         {
  579.           while(!JIA);  //等待按键松开
  580.                 switch(sz)
  581.                 {
  582.                 case 1:{
  583. ……………………

  584. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


完整程序请下载附件: P10_DS3231.rar (8.7 KB, 下载次数: 110)

评分

参与人数 1黑币 +90 收起 理由
admin + 90 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:284488 发表于 2021-7-2 09:17 | 只看该作者
正好需要,楼主是否可再分享下单片机板的电路图,感谢楼主无私的分享。
回复

使用道具 举报

板凳
ID:215984 发表于 2021-7-2 17:15 | 只看该作者
lon7085 发表于 2021-7-2 09:17
正好需要,楼主是否可再分享下单片机板的电路图,感谢楼主无私的分享。

你好!我家里是用太阳能板给蓄电池充电,供电系统是12V,两路降压,一路是用三端稳压1805给MCU供电,另一路用降压器调到2.3V给P10LED板供电,由于本电路比较简单,并没有画电路图,不过坛友既然需要,我把图画出来后再上传,目前我上传的是最基本的程序,而我现在已经加装了红外接收装置,可以成为学习红外遥控控制多路继电器,并且还没有把农历加入,正在慢慢改进。
回复

使用道具 举报

地板
ID:88256 发表于 2021-7-2 17:49 | 只看该作者
这个像素太低了,最好是用室内双色屏,这个更漂亮,如果不怕麻烦的话,P2.5的全彩屏最好
回复

使用道具 举报

5#
ID:229641 发表于 2021-7-2 20:12 来自手机 | 只看该作者
楼主能弄个0.96寸OLED的吗?
回复

使用道具 举报

6#
ID:948563 发表于 2021-7-3 08:20 | 只看该作者
动手能力好强
回复

使用道具 举报

7#
ID:284488 发表于 2021-7-3 11:56 | 只看该作者
huchunhb 发表于 2021-7-2 17:15
你好!我家里是用太阳能板给蓄电池充电,供电系统是12V,两路降压,一路是用三端稳压1805给MCU供电,另一 ...

谢谢楼主。
回复

使用道具 举报

8#
ID:215984 发表于 2021-7-3 16:45 | 只看该作者
hhdsdy 发表于 2021-7-2 17:49
这个像素太低了,最好是用室内双色屏,这个更漂亮,如果不怕麻烦的话,P2.5的全彩屏最好

赞成!其实我手中也有两块双色屏,但没有查到驱动程序,水平有限,很遗憾暂时无法弄出来。
回复

使用道具 举报

9#
ID:316832 发表于 2021-7-4 07:18 | 只看该作者
huchunhb 发表于 2021-7-3 16:45
赞成!其实我手中也有两块双色屏,但没有查到驱动程序,水平有限,很遗憾暂时无法弄出来。

http://www.51hei.com/bbs/dpj-196419-1.html
http://www.51hei.com/bbs/dpj-78536-1.html
http://www.51hei.com/bbs/dpj-38426-1.html
采取用论坛的搜索功能就全部出来了,你想要的东西也找到了
回复

使用道具 举报

10#
ID:215984 发表于 2021-7-7 22:05 | 只看该作者
lon7085 发表于 2021-7-2 09:17
正好需要,楼主是否可再分享下单片机板的电路图,感谢楼主无私的分享。

图画好了,不知道如何上传。
回复

使用道具 举报

11#
ID:88256 发表于 2021-7-7 22:10 | 只看该作者
huchunhb 发表于 2021-7-7 22:05
图画好了,不知道如何上传。

进入高级模式回复,上传本地图片
回复

使用道具 举报

12#
ID:69536 发表于 2021-7-8 07:56 | 只看该作者
这个精度高,就是这屏家用有点费电
回复

使用道具 举报

13#
ID:215984 发表于 2021-7-8 13:03 | 只看该作者
shuma520 发表于 2021-7-8 07:56
这个精度高,就是这屏家用有点费电

对P10LED屏的供电一定不要取5V,而是将电压降到2.3V左右,电流在100MA左右,这个问题已经解决。
回复

使用道具 举报

14#
ID:215984 发表于 2021-7-9 17:03 | 只看该作者
P10_DS3231_IR.rar (11.71 KB, 下载次数: 16)
回复

使用道具 举报

15#
ID:215984 发表于 2021-7-9 17:22 | 只看该作者

对不起,图中的复位电路中,电容和电阻的刚好放反了。
回复

使用道具 举报

16#
ID:34298 发表于 2021-9-25 10:45 | 只看该作者
用4块P10单色屏拼在一起显示 效果会更好,P10屏很常见,谢谢楼主分享!
回复

使用道具 举报

17#
ID:971672 发表于 2022-2-2 16:29 来自手机 | 只看该作者
请教如果时钟芯片是1302,怎么配置
回复

使用道具 举报

18#
ID:1003999 发表于 2022-2-3 08:59 来自手机 | 只看该作者
你好,想用2块P10制作飞行棋,20个按键,可以实现吗?
回复

使用道具 举报

19#
ID:826211 发表于 2022-2-3 22:30 | 只看该作者
感谢楼主无私的分享。
回复

使用道具 举报

20#
ID:168911 发表于 2022-6-29 12:43 | 只看该作者
亮度高了刺眼,你OE没弄好,消隐也没弄好,我发过一个帖子,也是p10单红,边上一个瞎亮的都没有,
回复

使用道具 举报

21#
ID:34298 发表于 2022-8-16 08:51 | 只看该作者
用rx8025比DS3231便宜 计时也很准确
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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