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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3949|回復: 3
打印 上一主題 下一主題
收起左側

STC15W408AS單片機+DS3231+OLED便攜式鋰電池手表制作 附程序

  [復制鏈接]
跳轉到指定樓層
樓主
本文介紹了STC15W408AS單片機+DS3231+OLED便攜式鋰電池手表。 由于DS3231備用電池供電,可以記錄當時時間,所以沒有用到睡眠,用按鍵開關機來查看時間。
附件包括嘉立創格式PCB項目文件(3D外殼文件還沒改好),源代碼。
由于計時的問題還是存在(有時莫名其妙為零),用另外3個按鍵控制對時間的修改。歡迎大家討論。
制作出來的實物圖如下:


單片機源程序如下:
  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=P1^2; //串行時鐘
  10. sbit SDA=P1^3; //串行數據

  11. sbit KEY1=  P1^5;                  //調整
  12. sbit KEY2=  P1^4;                  //++
  13. sbit KEY3=  P1^6;                  //--

  14. uchar  a1,a2,a3;                      //按鍵消斗用
  15. uchar  disflag=0; //時間調整相關

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

  19. /********************************************************************************************************
  20. **         DS3231常數定義
  21. ********************************************************************************************************/
  22. #define DS3231_WriteAddress 0xD0    //器件寫地址
  23. #define DS3231_ReadAddress  0xD1    //器件讀地址
  24. #define DS3231_SECOND       0x00    //秒
  25. #define DS3231_MINUTE       0x01    //分
  26. #define DS3231_HOUR         0x02    //時
  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;                                                        //應答標志位
  36. /*********************OLED驅動程序用的延時程序************************************/
  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           延時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++)         //要傳送的數據長度為8位
  83.     {
  84.         if((c<<BitCnt)&0x80)
  85.             SDA=1;                          //判斷發送位
  86.         else
  87.             SDA=0;     
  88.         SCL=1;                            //置時鐘線為高,通知被控器開始接收數據位
  89.         Delay5US();                       //保證時鐘高電平周期大于4μs   
  90.         SCL=0;
  91.     }
  92.     SDA=1;                                  //8位發送完后釋放數據線,準備接收應答位
  93.     SCL=1;
  94.     Delay5US();
  95.     if(SDA==1)
  96.         ack=0;   
  97.     else
  98.         ack=1;                              //判斷是否接收到應答信號
  99.     SCL=0;
  100.     Delay5US();
  101. }          

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

  106.    retc=0;
  107.    SDA=1;                           //置數據線為輸入方式
  108.    for(BitCnt=0;BitCnt<8;BitCnt++)
  109.    {
  110.         SCL=0;                      //置時鐘線為低,準備接收數據位      
  111.         Delay5US();                 //時鐘低電平周期大于4.7μs                       
  112.         SCL=1;                      //置時鐘線為高使數據線上數據有效
  113.         Delay5US();
  114.         retc=retc<<1;
  115.         if(SDA==1)
  116.             retc=retc+1;            //讀數據位,接收的數據位放入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();             //時鐘低電平周期大于4us   
  127.     SCL=0;                  //清時鐘線,鉗住I2C總線以便繼續接收
  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));//都轉10進制輸出
  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.                 //溫度數據是以2 進制格式存儲的并不需要數制轉換
  190.                 write_byte(0x0e,0x20);//0x0e寄存器的CONV位置1開啟溫度轉換

  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寫數據************************************/
  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寫命令************************************/
  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 設置坐標************************************/
  218. void OLED_Set_Pos(unsigned char x, unsigned char y)
  219. {
  220. ……………………

  221. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei附件下載:
Keil代碼.7z (30.11 KB, 下載次數: 83)
eprj文件.7z (158.67 KB, 下載次數: 45)

評分

參與人數 1黑幣 +90 收起 理由
admin + 90 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:430492 發表于 2022-10-19 16:15 | 只看該作者
樓主可以考慮把它設計得美觀一點,這樣自己用起來不是更好點??
回復

使用道具 舉報

板凳
ID:249376 發表于 2022-10-27 10:07 | 只看該作者
OLED和DS3231是共用SDA和SCL口的哦
回復

使用道具 舉報

地板
ID:34298 發表于 2023-6-14 11:05 | 只看該作者
我做了一個 用半天就沒有電了   不實用
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 麻豆av一区二区三区久久 | 日本手机看片 | 一区二区精品 | 久久人人网 | 九九99久久| 91麻豆精品国产91久久久久久久久 | 人人干人人超 | 日韩成人 | 久久久久久a | 国产精品亚洲二区 | 亚洲精品一区二区三区蜜桃久 | 久久久久久久久久爱 | 性生生活大片免费看视频 | 久久久91精品国产一区二区三区 | 伊久在线| 欧洲性生活视频 | 精品三级在线观看 | 久久久久国 | 米奇成人网| 亚洲一区二区久久 | 欧美精品一区三区 | 亚洲成人自拍 | 三级黄色片在线播放 | 91九色porny首页最多播放 | 中文字幕第二十页 | 福利一区二区 | 成人天堂 | 四虎永久免费黄色影片 | 女生羞羞网站 | 婷婷久久五月 | 欧美阿v| 欧美色性| 在线免费观看毛片 | 欧美福利在线 | 很很干很很日 | 一级做a爰片性色毛片视频停止 | 国产高清精品一区二区三区 | 欧美精品一区三区 | 一级毛片免费完整视频 | 亚洲天堂999 | 欧美成人精品在线观看 |