久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3920|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产不卡一区二区三区 | 国产一区二 | 国产精品爱久久久久久久 | 99综合在线 | 做a网站| 国产欧美一区二区三区在线看 | 欧美一区二区三区视频 | 久久成人人人人精品欧 | 九九精品久久久 | 国产一级特黄真人毛片 | 麻豆精品国产91久久久久久 | 国内精品久久久久久 | 一区观看| 国产精品一区二区三区在线播放 | 成人午夜免费福利视频 | 女同久久| 日韩和的一区二在线 | 91精品久久久久久久久 | 日韩精品免费在线观看 | 在线视频第一页 | 亚洲国产免费 | 91视频在线观看 | 久久久久亚洲精品 | 久久国内精品 | 国产精品久久一区 | 日韩一区二区三区在线 | 欧美一区二区免费在线 | 精品亚洲一区二区 | 免费毛片www com cn | 免费一级欧美在线观看视频 | 国产成人精品一区二区三区四区 | 婷婷激情综合 | 国产 日韩 欧美 在线 | 日韩视频高清 | 女生羞羞网站 | 91大神新作在线观看 | 99资源站 | 免费国产一区二区 | 成人国产精品一级毛片视频毛片 | 国产一区91精品张津瑜 | 国产在线视频一区二区 |