找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 18712|回復(fù): 42
收起左側(cè)

STC15F104E+DS3231+12864OLED做的時(shí)鐘

  [復(fù)制鏈接]
ID:164850 發(fā)表于 2017-10-1 12:47 | 顯示全部樓層 |閱讀模式
硬件連接方式很簡(jiǎn)單,因?yàn)?231和OLED都是IIC,所以共用接口


sbit SCL=P3^4; //
sbit SDA=P3^3; //

sbit KEY1=  P3^2;                  //set
sbit KEY2=  P3^0;                  //+
sbit KEY3=  P3^5;                  //-

IMG_20171001_123156.jpg IMG_20171001_122609.jpg IMG_20171001_114940.jpg IMG_20171001_114928.jpg IMG_20171001_111453.jpg IMG_20171001_111436.jpg IMG_20171001_111345.jpg
0.png

固件和源代碼
單片機(jī)源程序如下:
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #include "codetab.h"



  4. #define uint  unsigned int
  5. #define uchar unsigned char

  6. // ------------------------------------------------------------
  7. // IO口模擬I2C通信

  8. // ------------------------------------------------------------
  9. sbit SCL=P3^4; //串行時(shí)鐘
  10. sbit SDA=P3^3; //串行數(shù)據(jù)

  11. sbit KEY1=  P3^2;                  //調(diào)整
  12. sbit KEY2=  P3^0;                  //++
  13. sbit KEY3=  P3^5;                  //--

  14. uchar  a1,a2,a3;                      //按鍵消斗用
  15. uchar  disflag=0; //時(shí)間調(diào)整相關(guān)



  16. #define        Brightness        0xcf //
  17. #define X_WIDTH         128
  18. #define Y_WIDTH         64

  19. /********************************************************************************************************
  20. **         DS3231常數(shù)定義
  21. ********************************************************************************************************/
  22. #define DS3231_WriteAddress 0xD0    //器件寫(xiě)地址
  23. #define DS3231_ReadAddress  0xD1    //器件讀地址
  24. #define DS3231_SECOND       0x00    //秒
  25. #define DS3231_MINUTE       0x01    //分
  26. #define DS3231_HOUR         0x02    //時(shí)
  27. #define DS3231_WEEK         0x03    //星期
  28. #define DS3231_DAY          0x04    //日
  29. #define DS3231_MONTH        0x05    //月
  30. #define DS3231_YEAR         0x06    //年

  31. #define NACK    1
  32. #define ACK     0

  33. char hour,minute,second,year,month,day,week;
  34. uchar TH3231;
  35. bit        ack;                                                        //應(yīng)答標(biāo)志位
  36. /*********************OLED驅(qū)動(dòng)程序用的延時(shí)程序************************************/
  37. /*void delay(unsigned int z)
  38. {
  39.         unsigned int x,y;
  40.         for(x=z;x>0;x--)
  41.                 for(y=1100;y>0;y--);  
  42. }        */
  43. void        Delay5US()           //@12.000MHz           延時(shí)5us
  44. {
  45.    _nop_(); _nop_();        _nop_();_nop_();
  46. }

  47. /**********************************************
  48. //IIC Start
  49. **********************************************/
  50. void IIC_Start()
  51. {
  52.    SCL = 1;               
  53.    SDA = 1;
  54.    SDA = 0;
  55.    SCL = 0;
  56. }

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


  67. /********************************************************************************************************
  68. **         3231
  69. ********************************************************************************************************/


  70. uchar        BCD2HEX(uchar val)
  71. {
  72.         return        ((val>>4)*10)+(val&0x0f);
  73. }

  74. uchar        HEX2BCD(uchar val)
  75. {
  76.         return        (((val%100)/10)<<4)|(val%10);
  77. }


  78. void SendByte(uchar c)
  79. {
  80.     uchar BitCnt;
  81.    
  82.     for(BitCnt=0;BitCnt<8;BitCnt++)         //要傳送的數(shù)據(jù)長(zhǎng)度為8位
  83.     {
  84.         if((c<<BitCnt)&0x80)
  85.             SDA=1;                          //判斷發(fā)送位
  86.         else
  87.             SDA=0;     
  88.         SCL=1;                            //置時(shí)鐘線為高,通知被控器開(kāi)始接收數(shù)據(jù)位
  89.         Delay5US();                       //保證時(shí)鐘高電平周期大于4μs   
  90.         SCL=0;
  91.     }
  92.     SDA=1;                                  //8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位
  93.     SCL=1;
  94.     Delay5US();
  95.     if(SDA==1)
  96.         ack=0;   
  97.     else
  98.         ack=1;                              //判斷是否接收到應(yīng)答信號(hào)
  99.     SCL=0;
  100.     Delay5US();
  101. }           

  102. uchar RcvByte()
  103. {
  104.    uchar retc;
  105.    uchar BitCnt;

  106.    retc=0;
  107.    SDA=1;                           //置數(shù)據(jù)線為輸入方式
  108.    for(BitCnt=0;BitCnt<8;BitCnt++)
  109.    {
  110.         SCL=0;                      //置時(shí)鐘線為低,準(zhǔn)備接收數(shù)據(jù)位      
  111.         Delay5US();                 //時(shí)鐘低電平周期大于4.7μs                       
  112.         SCL=1;                      //置時(shí)鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效
  113.         Delay5US();
  114.         retc=retc<<1;
  115.         if(SDA==1)
  116.             retc=retc+1;            //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中
  117.         Delay5US();
  118.    }
  119.    SCL=0;
  120.    return(retc);
  121. }                           

  122. void Ack_I2C(bit a)
  123. {
  124.         SDA        =        a;  
  125.     SCL=1;                     
  126.     Delay5US();             //時(shí)鐘低電平周期大于4us   
  127.     SCL=0;                  //清時(shí)鐘線,鉗住I2C總線以便繼續(xù)接收
  128.     Delay5US();   
  129. }                                            

  130. uchar write_byte(uchar addr, uchar write_data)
  131. {
  132.     IIC_Start();
  133.     SendByte(DS3231_WriteAddress);
  134.     if (ack == 0)
  135.         return 0;
  136.    
  137.     SendByte(addr);   
  138.     if (ack == 0)
  139.         return 0;
  140.    
  141.     SendByte(write_data);
  142.     if (ack == 0)
  143.         return 0;
  144.    
  145.     IIC_Stop();
  146.     Delay5US();      
  147.     Delay5US();      
  148.     return 1;
  149. }                                          

  150. uchar read_current()
  151. {
  152.     uchar read_data;
  153.     IIC_Start();
  154.     SendByte(DS3231_ReadAddress);
  155.     if(ack==0)
  156.         return(0);              
  157.     read_data = RcvByte();
  158.     Ack_I2C(1);
  159.     IIC_Stop();
  160.     return read_data;
  161. }                                                

  162. uchar read_random(uchar random_addr)
  163. {
  164.     uchar Tmp;
  165.         IIC_Start();
  166.     SendByte(DS3231_WriteAddress);
  167.     if(ack==0)
  168.         return(0);            
  169.     SendByte(random_addr);
  170.     if(ack==0)
  171.         return(0);
  172.         Tmp=read_current();
  173.         if(random_addr==DS3231_HOUR)
  174.                 Tmp&=0x3f;
  175.                                             
  176.     return(BCD2HEX(Tmp));//都轉(zhuǎn)10進(jìn)制輸出
  177. }                                 

  178. void ModifyTime(uchar address,uchar num)
  179. {
  180.     uchar temp=0;
  181.            if(address>6 && address <0) return;
  182.     temp=HEX2BCD(num);
  183.         write_byte(address,temp);
  184. }
  185. uint    read_temp()      
  186. {
  187.                 int     itemp;
  188.                 float   ftemp;
  189.                 //溫度數(shù)據(jù)是以2 進(jìn)制格式存儲(chǔ)的并不需要數(shù)制轉(zhuǎn)換
  190.                 write_byte(0x0e,0x20);//0x0e寄存器的CONV位置1開(kāi)啟溫度轉(zhuǎn)換

  191.         itemp = ( (int) read_random(0x11) << 5 );          //放大32倍
  192.         itemp += ( read_random(0x12)>> 3);
  193.         IIC_Stop();
  194.         if(itemp & 0x1000)
  195.                         itemp += 0xe000;      

  196.         ftemp = 0.3125 * (float) itemp+0.5;    //放大10倍
  197.                 return  (uint) ftemp;
  198. }

  199. /*********************OLED寫(xiě)數(shù)據(jù)************************************/
  200. void OLED_WrDat(unsigned char IIC_Data)
  201. {
  202.         IIC_Start();
  203.         SendByte(0x78);
  204.         SendByte(0x40);                        //write data
  205.         SendByte(IIC_Data);
  206.         IIC_Stop();
  207. }
  208. /*********************OLED寫(xiě)命令************************************/
  209. void OLED_WrCmd(unsigned char IIC_Command)
  210. {
  211.         IIC_Start();
  212.         SendByte(0x78);            //Slave address,SA0=0
  213.         SendByte(0x00);                        //write command
  214.         SendByte(IIC_Command);
  215.         IIC_Stop();
  216. }
  217. /*********************OLED 設(shè)置坐標(biāo)************************************/
  218. void OLED_Set_Pos(unsigned char x, unsigned char y)
  219. {
  220.         OLED_WrCmd(0xb0+y);
  221.         OLED_WrCmd(((x&0xf0)>>4)|0x10);
  222.         OLED_WrCmd((x&0x0f)|0x01);
  223. }
  224. /*********************OLED全屏************************************/
  225. void OLED_Fill(unsigned char bmp_dat)
  226. {
  227.         unsigned char y,x;
  228.         for(y=0;y<8;y++)
  229.         {
  230.                 OLED_WrCmd(0xb0+y);
  231.                 OLED_WrCmd(0x01);
  232.                 OLED_WrCmd(0x10);
  233.                 for(x=0;x<X_WIDTH;x++)
  234.                 OLED_WrDat(bmp_dat);
  235.         }
  236. }
  237. /*********************OLED復(fù)位************************************/
  238. void OLED_CLS(void)
  239. {
  240.         unsigned char y,x;
  241.         for(y=0;y<8;y++)
  242.         {
  243.                 OLED_WrCmd(0xb0+y);
  244.                 OLED_WrCmd(0x01);
  245.                 OLED_WrCmd(0x10);
  246.                 for(x=0;x<X_WIDTH;x++)
  247.                 OLED_WrDat(0);
  248.         }
  249. }
  250. /*********************OLED初始化************************************/
  251. void OLED_Init(void)
  252. {
  253.         Delay5US();//初始化之前的延時(shí)很重要!
  254.         OLED_WrCmd(0xae);//--turn off oled panel
  255.         OLED_WrCmd(0x00);//---set low column address
  256.         OLED_WrCmd(0x10);//---set high column address
  257.         OLED_WrCmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
  258.         OLED_WrCmd(0x81);//--set contrast control register
  259.         OLED_WrCmd(Brightness); // Set SEG Output Current Brightness
  260.         OLED_WrCmd(0xa1);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  261.         OLED_WrCmd(0xc8);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  262.         OLED_WrCmd(0xa6);//--set normal display
  263.         OLED_WrCmd(0xa8);//--set multiplex ratio(1 to 64)
  264.         OLED_WrCmd(0x3f);//--1/64 duty
  265.         OLED_WrCmd(0xd3);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
  266.         OLED_WrCmd(0x00);//-not offset
  267.         OLED_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency
  268.         OLED_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
  269.         OLED_WrCmd(0xd9);//--set pre-charge period
  270.         OLED_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  271.         OLED_WrCmd(0xda);//--set com pins hardware configuration
  272.         OLED_WrCmd(0x12);
  273.         OLED_WrCmd(0xdb);//--set vcomh
  274.         OLED_WrCmd(0x40);//Set VCOM Deselect Level
  275.         OLED_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
  276.         OLED_WrCmd(0x02);//
  277.         OLED_WrCmd(0x8d);//--set Charge Pump enable/disable
  278.         OLED_WrCmd(0x14);//--set(0x10) disable
  279.         OLED_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
  280.         OLED_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)
  281.         OLED_WrCmd(0xaf);//--turn on oled panel
  282.         OLED_Fill(0x00); //初始清屏
  283.         OLED_Set_Pos(0,0);
  284. }

  285. /*******************功能描述:顯示8*16一組標(biāo)準(zhǔn)ASCII字符串         顯示的坐標(biāo)(x,y),y為頁(yè)范圍0~7****************/
  286. /*void OLED_P8x16List(unsigned char x, y,unsigned char ch[])
  287. {

  288. ……………………

  289. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
OLED.rar (48.69 KB, 下載次數(shù): 456)



評(píng)分

參與人數(shù) 2黑幣 +111 收起 理由
WseriesY + 11 很給力!
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:68875 發(fā)表于 2017-10-2 21:53 | 顯示全部樓層

不錯(cuò)喲
回復(fù)

使用道具 舉報(bào)

ID:164988 發(fā)表于 2017-10-2 23:07 | 顯示全部樓層
挺好的,下載學(xué)習(xí)。
回復(fù)

使用道具 舉報(bào)

ID:85865 發(fā)表于 2017-10-10 11:03 | 顯示全部樓層
這個(gè)之前我也做過(guò)沒(méi)成功,如果將農(nóng)歷也集成了就完美了
回復(fù)

使用道具 舉報(bào)

ID:236780 發(fā)表于 2017-10-11 16:54 | 顯示全部樓層
沒(méi)事的,你可用翻譯軟件啊,51是基礎(chǔ),沒(méi)問(wèn)題的,加油!
回復(fù)

使用道具 舉報(bào)

ID:227832 發(fā)表于 2017-10-16 21:09 | 顯示全部樓層
謝謝分享!
回復(fù)

使用道具 舉報(bào)

ID:164850 發(fā)表于 2017-10-22 08:43 來(lái)自手機(jī) | 顯示全部樓層
升級(jí)數(shù)字
IMG_20171022_083533.jpg
IMG_20171022_083711.JPG
回復(fù)

使用道具 舉報(bào)

ID:250564 發(fā)表于 2017-11-17 21:37 | 顯示全部樓層
很好的一個(gè)貼子,可惜我下載不了.
回復(fù)

使用道具 舉報(bào)

ID:240780 發(fā)表于 2017-12-12 11:03 | 顯示全部樓層
想問(wèn)一下硬件咋連接,有圖嘛
回復(fù)

使用道具 舉報(bào)

ID:164850 發(fā)表于 2017-12-12 22:08 | 顯示全部樓層
漫威 發(fā)表于 2017-12-12 11:03
想問(wèn)一下硬件咋連接,有圖嘛


硬件連接方式很簡(jiǎn)單,因?yàn)?231和OLED都是IIC,所以共用接口


sbit SCL=P3^4; //
sbit SDA=P3^3; //

sbit KEY1=  P3^2;                  //set
sbit KEY2=  P3^0;                  //+
sbit KEY3=  P3^5;                  //-
回復(fù)

使用道具 舉報(bào)

ID:183763 發(fā)表于 2017-12-20 20:08 | 顯示全部樓層
有原理圖嗎,想學(xué)做一個(gè)
回復(fù)

使用道具 舉報(bào)

ID:164850 發(fā)表于 2017-12-31 07:54 | 顯示全部樓層
A17094430 發(fā)表于 2017-12-20 20:08
有原理圖嗎,想學(xué)做一個(gè)

硬件連接方式很簡(jiǎn)單,因?yàn)?231和OLED都是IIC,所以共用接口


sbit SCL=P3^4; //
sbit SDA=P3^3; //

sbit KEY1=  P3^2;                  //set
sbit KEY2=  P3^0;                  //+
sbit KEY3=  P3^5;                  //-
回復(fù)

使用道具 舉報(bào)

ID:251133 發(fā)表于 2018-1-7 21:19 來(lái)自手機(jī) | 顯示全部樓層
luxianjun 發(fā)表于 2017-12-31 07:54
硬件連接方式很簡(jiǎn)單,因?yàn)?231和OLED都是IIC,所以共用接口



怎么燒錄程序啊
回復(fù)

使用道具 舉報(bào)

ID:164850 發(fā)表于 2018-1-13 21:06 | 顯示全部樓層

就是電腦那里掐幾個(gè)線,單片機(jī)也接幾條線,下載過(guò)去就行了,很簡(jiǎn)單的。我說(shuō)了如果還不懂,可以再問(wèn)我。
回復(fù)

使用道具 舉報(bào)

ID:66287 發(fā)表于 2018-2-9 09:06 | 顯示全部樓層
OLED真漂亮
回復(fù)

使用道具 舉報(bào)

ID:285069 發(fā)表于 2018-2-24 21:04 | 顯示全部樓層
先謝謝了!!黑幣不夠下載
回復(fù)

使用道具 舉報(bào)

ID:251133 發(fā)表于 2018-3-11 18:48 | 顯示全部樓層
不知怎么燒錄程序的
回復(fù)

使用道具 舉報(bào)

ID:272625 發(fā)表于 2018-4-7 20:33 來(lái)自手機(jī) | 顯示全部樓層
104單片機(jī)用51頭文件,嚴(yán)重懷疑不能用呀!
回復(fù)

使用道具 舉報(bào)

ID:16936 發(fā)表于 2018-4-18 20:58 | 顯示全部樓層
不錯(cuò),給樓主點(diǎn)贊
回復(fù)

使用道具 舉報(bào)

ID:319730 發(fā)表于 2018-5-3 08:34 | 顯示全部樓層
下載試試看,謝謝了
回復(fù)

使用道具 舉報(bào)

ID:243748 發(fā)表于 2018-5-3 23:42 來(lái)自手機(jī) | 顯示全部樓層
歷害哦,有時(shí)間做一個(gè)玩下
回復(fù)

使用道具 舉報(bào)

ID:343102 發(fā)表于 2018-6-29 07:32 | 顯示全部樓層
謝謝分享,下來(lái)學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:159122 發(fā)表于 2018-8-25 19:24 | 顯示全部樓層
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

ID:359281 發(fā)表于 2018-8-30 13:20 | 顯示全部樓層
感謝樓主分享,能提供電路圖嗎?
回復(fù)

使用道具 舉報(bào)

ID:386381 發(fā)表于 2018-10-13 17:41 來(lái)自手機(jī) | 顯示全部樓層
104只支持4k,而這個(gè)hex文件18k怎么下載里面呀
回復(fù)

使用道具 舉報(bào)

ID:334500 發(fā)表于 2018-10-26 22:38 | 顯示全部樓層
謝謝分享

回復(fù)

使用道具 舉報(bào)

ID:416105 發(fā)表于 2018-10-29 00:24 | 顯示全部樓層
樓主您好,我的STC單片機(jī)晶振是11.0592MHz,那么delay5us()函數(shù)里的語(yǔ)句要改動(dòng)嗎?要怎么改?謝謝了
回復(fù)

使用道具 舉報(bào)

ID:1989 發(fā)表于 2018-11-29 10:53 | 顯示全部樓層
3231比1302要高級(jí)一些哈。
回復(fù)

使用道具 舉報(bào)

ID:371527 發(fā)表于 2018-12-5 20:17 | 顯示全部樓層
下載運(yùn)行正常!謝謝!溫度加入顯示就更好了
回復(fù)

使用道具 舉報(bào)

ID:371527 發(fā)表于 2018-12-5 20:21 | 顯示全部樓層
溫度是補(bǔ)碼,負(fù)溫度要變換
回復(fù)

使用道具 舉報(bào)

ID:287061 發(fā)表于 2018-12-8 21:21 | 顯示全部樓層
下載下來(lái)看看怎么樣!
回復(fù)

使用道具 舉報(bào)

ID:474901 發(fā)表于 2019-2-3 22:18 | 顯示全部樓層
用你的程序讀出的秒正確, 分正確,小時(shí)竟然是30點(diǎn),想看余下的代碼,積分不足,等待積分
回復(fù)

使用道具 舉報(bào)

ID:476677 發(fā)表于 2019-2-15 08:25 | 顯示全部樓層
謝謝分享!
回復(fù)

使用道具 舉報(bào)

ID:348540 發(fā)表于 2019-6-9 00:40 | 顯示全部樓層
謝謝分享!
回復(fù)

使用道具 舉報(bào)

ID:626593 發(fā)表于 2019-10-20 10:51 | 顯示全部樓層
怎么直接顯示字符?
回復(fù)

使用道具 舉報(bào)

ID:67274 發(fā)表于 2020-3-22 00:51 | 顯示全部樓層
好經(jīng)典的程序,大小剛好4K.
回復(fù)

使用道具 舉報(bào)

ID:34298 發(fā)表于 2020-4-5 10:22 | 顯示全部樓層
我也仿制了一個(gè)
7ab326b93d24f7a8b8015383b62e6c7.jpg
273cd42b30bce96919366ee975b0af9.jpg
回復(fù)

使用道具 舉報(bào)

ID:275966 發(fā)表于 2020-5-17 20:25 | 顯示全部樓層
fancunwu 發(fā)表于 2020-4-5 10:22
我也仿制了一個(gè)

我也做了一下,可是時(shí)間不走
回復(fù)

使用道具 舉報(bào)

ID:75864 發(fā)表于 2020-5-18 17:34 | 顯示全部樓層
謝謝分享~!想做一個(gè)玩
回復(fù)

使用道具 舉報(bào)

ID:755548 發(fā)表于 2020-5-19 11:32 | 顯示全部樓層
哇,學(xué)習(xí)到了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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