找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3929|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

OLED電子時(shí)鐘12864源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
主控stc89C52RC
時(shí)鐘芯片DS3231
屏幕0.9/13寸OLED 屏幕
使用引腳非常少,精度高,制作非常簡單


單片機(jī)源程序如下:
  1. sbit SCL=P1^0; //串行時(shí)鐘
  2. sbit SDA=P1^1; //串行數(shù)據(jù)

  3. sbit KEY1=  P2^0;                  //調(diào)整
  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; //時(shí)間調(diào)整相關(guān)



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

  12. /********************************************************************************************************
  13. **         DS3231常數(shù)定義
  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    //時(shí)
  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    //溫度寄存器高字節(jié)(8位)        整數(shù)部分
  25. #define DS3231_TEMPERATUREL 0x12    //溫度寄存器低字節(jié)(低2位) 小數(shù)部分



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

  28. uchar shan_count; //:號閃爍計(jì)時(shí)變量
  29. uchar shan_js;    //校時(shí)閃爍計(jì)時(shí)變量
  30. bit flag;                //校時(shí)閃爍標(biāo)志
  31. char hour,minute,second,year,month,day,date,week;
  32. uint TH3231;
  33. bit        ack;                //應(yīng)答標(biāo)志位
  34. /*********************OLED驅(qū)動程序用的延時(shí)程序************************************/
  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           延時(shí)5us
  42. {
  43.    _nop_(); _nop_();        //_nop_();_nop_(); //1T單片機(jī)用4個nop,12T用1個nop
  44. }


  45. /**************************/
  46. void Timer0Init(void)                //10毫秒@11.0592MHz
  47. {
  48. //        AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式
  49.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  50.         TMOD |= 0x01;                //設(shè)置定時(shí)器0,16位模式
  51.         TL0 = 0x00;                //設(shè)置定時(shí)初值
  52.         TH0 = 0xDC;                //設(shè)置定時(shí)初值
  53.         TF0 = 0;                //清除TF0標(biāo)志
  54.         TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
  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++)         //要傳送的數(shù)據(jù)長度為8位
  94.     {
  95.         if((c<<BitCnt)&0x80)
  96.             SDA=1;                          //判斷發(fā)送位
  97.         else
  98.             SDA=0;     
  99.         SCL=1;                            //置時(shí)鐘線為高,通知被控器開始接收數(shù)據(jù)位
  100.         Delay5US();                       //保證時(shí)鐘高電平周期大于4μs   
  101.         SCL=0;
  102.     }
  103.     SDA=1;                                  //8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位
  104.     SCL=1;
  105.     Delay5US();
  106.     if(SDA==1)
  107.         ack=0;   
  108.     else
  109.         ack=1;                              //判斷是否接收到應(yīng)答信號
  110.     SCL=0;
  111.     Delay5US();
  112. }          

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

  117.    retc=0;
  118.    SDA=1;                           //置數(shù)據(jù)線為輸入方式
  119.    for(BitCnt=0;BitCnt<8;BitCnt++)
  120.    {
  121.         SCL=0;                      //置時(shí)鐘線為低,準(zhǔn)備接收數(shù)據(jù)位      
  122.         Delay5US();                 //時(shí)鐘低電平周期大于4.7μs                       
  123.         SCL=1;                      //置時(shí)鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效
  124.         Delay5US();
  125.         retc=retc<<1;
  126.         if(SDA==1)
  127.             retc=retc+1;            //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入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();             //時(shí)鐘低電平周期大于4us   
  138.     SCL=0;                  //清時(shí)鐘線,鉗住I2C總線以便繼續(xù)接收
  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));//都轉(zhuǎn)10進(jìn)制輸出
  188. }

  189. /***********************/
  190. uchar read_random1(uchar random_addr)  //這個是讀溫度函數(shù)
  191. {
  192.     uchar Tmp;
  193.         write_byte(0x0e,0x20);//0x0e寄存器的CONV位置1開啟溫度轉(zhuǎn)換,要這句,溫度實(shí)時(shí)刷新,這句不要,溫度要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.                 //溫度數(shù)據(jù)是以2 進(jìn)制格式存儲的并不需要數(shù)制轉(zhuǎn)換
  217.                 write_byte(0x0e,0x20);//0x0e寄存器的CONV位置1開啟溫度轉(zhuǎn)換

  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. }          */

復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:85865 發(fā)表于 2020-4-12 20:22 | 只看該作者
主控用stc8只腳的MCU就夠了,
回復(fù)

使用道具 舉報(bào)

板凳
ID:282650 發(fā)表于 2020-4-21 22:02 來自手機(jī) | 只看該作者
這個人是個垃圾,半桶水出來騙人,大家可要小心
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表