找回密码
 立即注册

QQ登录

只需一步,快速开始

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

OLED电子时钟12864源程序

[复制链接]
跳转到指定楼层
楼主
主控stc89C52RC
时钟芯片DS3231
屏幕0.9/13寸OLED 屏幕
使用引脚非常少,精度高,制作非常简单


单片机源程序如下:
  1. sbit SCL=P1^0; //串行时钟
  2. sbit SDA=P1^1; //串行数据

  3. sbit KEY1=  P2^0;                  //调整
  4. sbit KEY2=  P2^1;                  //++
  5. sbit KEY3=  P2^2;                  //--
  6. sbit KEY4=  P2^3;                  //退出

  7. uchar  a1,a2,a3,a4;                      //按键消抖用
  8. uchar  disflag=0; //时间调整相关



  9. #define        Brightness        0xcf //
  10. #define X_WIDTH         128
  11. #define Y_WIDTH         64

  12. /********************************************************************************************************
  13. **         DS3231常数定义
  14. ********************************************************************************************************/
  15. #define DS3231_WriteAddress 0xD0    //器件写地址
  16. #define DS3231_ReadAddress  0xD1    //器件读地址
  17. #define DS3231_SECOND       0x00    //秒
  18. #define DS3231_MINUTE       0x01    //分
  19. #define DS3231_HOUR         0x02    //时
  20. #define DS3231_WEEK         0x03    //星期
  21. #define DS3231_DAY          0x04    //日
  22. #define DS3231_MONTH        0x05    //月
  23. #define DS3231_YEAR         0x06    //年

  24. #define DS3231_TEMPERATUREH 0x11    //温度寄存器高字节(8位)        整数部分
  25. #define DS3231_TEMPERATUREL 0x12    //温度寄存器低字节(低2位) 小数部分



  26. #define NACK    1
  27. #define ACK     0

  28. uchar shan_count; //:号闪烁计时变量
  29. uchar shan_js;    //校时闪烁计时变量
  30. bit flag;                //校时闪烁标志
  31. char hour,minute,second,year,month,day,date,week;
  32. uint TH3231;
  33. bit        ack;                //应答标志位
  34. /*********************OLED驱动程序用的延时程序************************************/
  35. /*void delay(unsigned int z)
  36. {
  37.         unsigned int x,y;
  38.         for(x=z;x>0;x--)
  39.                 for(y=1100;y>0;y--);  
  40. }        */
  41. void        Delay5US()           //@12.000MHz           延时5us
  42. {
  43.    _nop_(); _nop_();        //_nop_();_nop_(); //1T单片机用4个nop,12T用1个nop
  44. }


  45. /**************************/
  46. void Timer0Init(void)                //10毫秒@11.0592MHz
  47. {
  48. //        AUXR &= 0x7F;                //定时器时钟12T模式
  49.         TMOD &= 0xF0;                //设置定时器模式
  50.         TMOD |= 0x01;                //设置定时器0,16位模式
  51.         TL0 = 0x00;                //设置定时初值
  52.         TH0 = 0xDC;                //设置定时初值
  53.         TF0 = 0;                //清除TF0标志
  54.         TR0 = 1;                //定时器0开始计时
  55.         ET0 = 1;
  56.         EA = 1;
  57. }

  58. /**********************************************
  59. //IIC Start
  60. **********************************************/
  61. void IIC_Start()
  62. {
  63.    SCL = 1;               
  64.    SDA = 1;
  65.    SDA = 0;
  66.    SCL = 0;
  67. }

  68. /**********************************************
  69. //IIC Stop
  70. **********************************************/
  71. void IIC_Stop()
  72. {
  73.    SCL = 0;
  74.    SDA = 0;
  75.    SCL = 1;
  76.    SDA = 1;
  77. }


  78. /********************************************************************************************************
  79. **         3231
  80. ********************************************************************************************************/


  81. uchar        BCD2HEX(uchar val)
  82. {
  83.         return        ((val>>4)*10)+(val&0x0f);
  84. }

  85. uchar        HEX2BCD(uchar val)
  86. {
  87.         return        (((val%100)/10)<<4)|(val%10);
  88. }


  89. void SendByte(uchar c)
  90. {
  91.     uchar BitCnt;
  92.    
  93.     for(BitCnt=0;BitCnt<8;BitCnt++)         //要传送的数据长度为8位
  94.     {
  95.         if((c<<BitCnt)&0x80)
  96.             SDA=1;                          //判断发送位
  97.         else
  98.             SDA=0;     
  99.         SCL=1;                            //置时钟线为高,通知被控器开始接收数据位
  100.         Delay5US();                       //保证时钟高电平周期大于4μs   
  101.         SCL=0;
  102.     }
  103.     SDA=1;                                  //8位发送完后释放数据线,准备接收应答位
  104.     SCL=1;
  105.     Delay5US();
  106.     if(SDA==1)
  107.         ack=0;   
  108.     else
  109.         ack=1;                              //判断是否接收到应答信号
  110.     SCL=0;
  111.     Delay5US();
  112. }          

  113. uchar RcvByte()
  114. {
  115.    uchar retc;
  116.    uchar BitCnt;

  117.    retc=0;
  118.    SDA=1;                           //置数据线为输入方式
  119.    for(BitCnt=0;BitCnt<8;BitCnt++)
  120.    {
  121.         SCL=0;                      //置时钟线为低,准备接收数据位      
  122.         Delay5US();                 //时钟低电平周期大于4.7μs                       
  123.         SCL=1;                      //置时钟线为高使数据线上数据有效
  124.         Delay5US();
  125.         retc=retc<<1;
  126.         if(SDA==1)
  127.             retc=retc+1;            //读数据位,接收的数据位放入retc中
  128.         Delay5US();
  129.    }
  130.    SCL=0;
  131.    return(retc);
  132. }                            

  133. void Ack_I2C(bit a)
  134. {
  135.         SDA        =        a;  
  136.     SCL=1;                     
  137.     Delay5US();             //时钟低电平周期大于4us   
  138.     SCL=0;                  //清时钟线,钳住I2C总线以便继续接收
  139.     Delay5US();   
  140. }                                            

  141. uchar write_byte(uchar addr, uchar write_data)
  142. {
  143.     IIC_Start();
  144.     SendByte(DS3231_WriteAddress);
  145.     if (ack == 0)
  146.         return 0;
  147.    
  148.     SendByte(addr);   
  149.     if (ack == 0)
  150.         return 0;
  151.    
  152.     SendByte(write_data);
  153.     if (ack == 0)
  154.         return 0;
  155.    
  156.     IIC_Stop();
  157.     Delay5US();      
  158.     Delay5US();      
  159.     return 1;
  160. }                                          

  161. uchar read_current()
  162. {
  163.     uchar read_data;
  164.     IIC_Start();
  165.     SendByte(DS3231_ReadAddress);
  166.     if(ack==0)
  167.         return(0);             
  168.     read_data = RcvByte();
  169.     Ack_I2C(1);
  170.     IIC_Stop();
  171.     return read_data;
  172. }                                                 

  173. uchar read_random(uchar random_addr)
  174. {
  175.     uchar Tmp;
  176.         IIC_Start();
  177.     SendByte(DS3231_WriteAddress);
  178.     if(ack==0)
  179.         return(0);            
  180.     SendByte(random_addr);
  181.     if(ack==0)
  182.         return(0);
  183.         Tmp=read_current();
  184.         if(random_addr==DS3231_HOUR)
  185.                 Tmp&=0x3f;
  186.                                             
  187.     return(BCD2HEX(Tmp));//都转10进制输出
  188. }

  189. /***********************/
  190. uchar read_random1(uchar random_addr)  //这个是读温度函数
  191. {
  192.     uchar Tmp;
  193.         write_byte(0x0e,0x20);//0x0e寄存器的CONV位置1开启温度转换,要这句,温度实时刷新,这句不要,温度要64s才刷新1次
  194.         IIC_Start();
  195.     SendByte(DS3231_WriteAddress);
  196.     if(ack==0)
  197.         return(0);            
  198.     SendByte(random_addr);
  199.     if(ack==0)
  200.         return(0);
  201.         Tmp=read_current();
  202.         return Tmp;
  203. }                                  

  204. void ModifyTime(uchar address,uchar num)
  205. {
  206.     uchar temp=0;
  207.            if(address>6 && address <0) return;
  208.     temp=HEX2BCD(num);
  209.         write_byte(address,temp);
  210. }

  211. /*
  212. uint read_temp()      
  213. {
  214.                 int     itemp;
  215.                 float   ftemp;
  216.                 //温度数据是以2 进制格式存储的并不需要数制转换
  217.                 write_byte(0x0e,0x20);//0x0e寄存器的CONV位置1开启温度转换

  218.         itemp = ( (int) read_random(0x11) << 5 );          //放大32倍
  219.         itemp += ( read_random(0x12)>> 3);
  220.         IIC_Stop();
  221.         if(itemp & 0x1000)
  222.                         itemp += 0xe000;      

  223.         ftemp = 0.3125 * (float) itemp+0.5;    //放大10倍
  224.                 return  (uint) ftemp;
  225. }          */

复制代码


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

使用道具 举报

沙发
ID:85865 发表于 2020-4-12 20:22 | 只看该作者
主控用stc8只脚的MCU就够了,
回复

使用道具 举报

板凳
ID:282650 发表于 2020-4-21 22:02 来自手机 | 只看该作者
这个人是个垃圾,半桶水出来骗人,大家可要小心
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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