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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8317|回復: 11
收起左側

四腳OLED 12864,ds1302鬧鐘,按鍵調鬧鐘,調時間單片機程序

  [復制鏈接]
ID:473968 發表于 2019-1-29 19:41 | 顯示全部樓層 |閱讀模式
IMG_20190129_193915.jpg IMG_20190129_193741.jpg

單片機源程序如下:
  1. //////////////////////////////////////////////////////////////////////////////////        
  2. //
  3. //  文 件 名   : main.c
  4. //  版 本 號   : v2.0
  5. //  作    者   : HuangKai
  6. //  生成日期   : 2014-0101
  7. //  最近修改   :
  8. //  功能描述   : OLED 4接口演示例程(51系列)
  9. //              說明:
  10. //              ----------------------------------------------------------------
  11. //              GND    電源地
  12. //              VCC  接5V或3.3v電源
  13. //              D0   P1^0(SCL)
  14. //              D1   P1^1(SDA)
  15. //              RES  接P12
  16. //              DC   接P13
  17. //              CS   接P14               
  18. //              ----------------------------------------------------------------
  19. //All rights reserved
  20. //******************************************************************************/
  21. #include "REG51.h"
  22. #include "oled.h"
  23. #include "bmp.h"


  24. #define uchar unsigned char
  25. #define uint  unsigned int
  26.         //DS1302引腳定義,可根據實際情況自行修改端口定義
  27. sbit RST=P3^1;
  28. sbit IO=P3^2;
  29. sbit SCK=P3^3;
  30. //DS1302地址定義
  31. #define ds1302_sec_add                        0x80                //秒數據地址
  32. #define ds1302_min_add                        0x82                //分數據地址
  33. #define ds1302_hr_add                        0x84                //時數據地址
  34. #define ds1302_date_add                        0x86                //日數據地址
  35. #define ds1302_month_add                0x88                //月數據地址
  36. #define ds1302_day_add                        0x8a                //星期數據地址
  37. #define ds1302_year_add                        0x8c                //年數據地址
  38. #define ds1302_control_add                0x8e                //控制數據地址
  39. #define ds1302_charger_add                0x90                                          
  40. #define ds1302_clkburst_add                0xbe
  41. //初始時間定義
  42. uchar time_buf[8] = {0x20,0x10,0x09,0x14,0x23,0x59,0x50,0x02};//初始時間
  43. uchar readtime[14];//當前時間
  44. uchar set[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x03,0x00};//年月日的每一位
  45. uchar sec_buf=0;  //秒緩存
  46. uchar sec_flag=0; //秒標志位
  47. //功能:延時1毫秒
  48. //入口參數:x
  49. //出口參數:無
  50. //說明:晶振為12M

  51. /***********************按鍵定義*************************************************/
  52. sbit key1=P2^0;
  53. sbit key2=P2^1;
  54. sbit key3=P2^2;
  55. uchar status=0,sta=0;//按鍵功能選擇定義(年0,月1,日2,時3,分4 )
  56. /////////////////////////////////////////////
  57. sbit led = P0^0;
  58. sbit key_stop = P0^1;
  59. sbit nao1 = P0^2;
  60. sbit nao2 = P0^3;
  61. ////////////////

  62. void delay(uint t)  
  63. {
  64. uint b;
  65. for(;t;t--)
  66.   for(b=0;b<121;b++);
  67. }
  68. void Delay_xms(uint x)
  69. {
  70.   uint i,j;
  71.   for(i=0;i<x;i++)
  72.     for(j=0;j<112;j++);
  73. }
  74. //DS1302初始化函數
  75. void ds1302_init(void)
  76. {
  77.         RST=0;                        //RST腳置低
  78.         SCK=0;                        //SCK腳置低
  79. }
  80. //向DS1302寫入一字節數據
  81. void ds1302_write_byte(uchar addr, uchar d)
  82. {
  83.         uchar i;
  84.         RST=1;                                        //啟動DS1302總線        
  85.         //寫入目標地址:addr
  86.         addr = addr & 0xFE;   //最低位置零,寄存器0位為0時寫,為1時讀
  87.         for (i = 0; i < 8; i ++) {
  88.                 if (addr & 0x01) {
  89.                         IO=1;
  90.                         }
  91.                 else {
  92.                         IO=0;
  93.                         }
  94.                 SCK=1;      //產生時鐘
  95.                 SCK=0;
  96.                 addr = addr >> 1;
  97.                 }        
  98.         //寫入數據:d
  99.         for (i = 0; i < 8; i ++) {
  100.                 if (d & 0x01) {
  101.                         IO=1;
  102.                         }
  103.                 else {
  104.                         IO=0;
  105.                         }
  106.                 SCK=1;    //產生時鐘
  107.                 SCK=0;
  108.                 d = d >> 1;
  109.                 }
  110.         RST=0;                //停止DS1302總線
  111. }

  112. //從DS1302讀出一字節數據
  113. uchar ds1302_read_byte(uchar addr) {

  114.         uchar i,temp;        
  115.         RST=1;                                        //啟動DS1302總線
  116.         //寫入目標地址:addr
  117.         addr = addr | 0x01;    //最低位置高,寄存器0位為0時寫,為1時讀
  118.         for (i = 0; i < 8; i ++) {
  119.                 if (addr & 0x01) {
  120.                         IO=1;
  121.                         }
  122.                 else {
  123.                         IO=0;
  124.                         }
  125.                 SCK=1;
  126.                 SCK=0;
  127.                 addr = addr >> 1;
  128.                 }        
  129.         //輸出數據:temp
  130.         for (i = 0; i < 8; i ++) {
  131.                 temp = temp >> 1;
  132.                 if (IO) {
  133.                         temp |= 0x80;
  134.                         }
  135.                 else {
  136.                         temp &= 0x7F;
  137.                         }
  138.                 SCK=1;
  139.                 SCK=0;
  140.                 }        
  141.         RST=0;                                        //停止DS1302總線
  142.         return temp;
  143. }
  144. //向DS302寫入時鐘數據
  145. void ds1302_write_time(void)
  146. {
  147.         time_buf[1]=(set[0]<<4)|set[1];
  148.         time_buf[2]=(set[2]<<4)|set[3];
  149.         time_buf[3]=(set[4]<<4)|set[5];
  150.         time_buf[4]=(set[6]<<4)|set[7];
  151.         time_buf[5]=(set[8]<<4)|set[9];
  152.         time_buf[6]=(set[10]<<4)|set[11];
  153.         time_buf[7]=(set[12]<<4)|set[13];
  154.         
  155.         ds1302_write_byte(ds1302_control_add,0x00);                        //關閉寫保護
  156.         ds1302_write_byte(ds1302_sec_add,0x80);                                //暫停時鐘
  157.         //ds1302_write_byte(ds1302_charger_add,0xa9);            //涓流充電
  158.         ds1302_write_byte(ds1302_year_add,time_buf[1]);                //年
  159.         ds1302_write_byte(ds1302_month_add,time_buf[2]);        //月
  160.         ds1302_write_byte(ds1302_date_add,time_buf[3]);                //日
  161.         ds1302_write_byte(ds1302_hr_add,time_buf[4]);                //時
  162.         ds1302_write_byte(ds1302_min_add,time_buf[5]);                //分
  163.         ds1302_write_byte(ds1302_sec_add,time_buf[6]);                //秒
  164.         ds1302_write_byte(ds1302_day_add,time_buf[7]);                //周
  165.         ds1302_write_byte(ds1302_control_add,0x80);                        //打開寫保護     
  166. }
  167. //從DS302讀出時鐘數據
  168. void ds1302_read_time(void)  
  169. {
  170.         time_buf[1]=ds1302_read_byte(ds1302_year_add);                //年
  171.         time_buf[2]=ds1302_read_byte(ds1302_month_add);                //月
  172.         time_buf[3]=ds1302_read_byte(ds1302_date_add);                //日
  173.         time_buf[4]=ds1302_read_byte(ds1302_hr_add);                //時
  174.         time_buf[5]=ds1302_read_byte(ds1302_min_add);                //分
  175.         time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;//秒,屏蔽秒的第7位,避免超出59
  176.         time_buf[7]=ds1302_read_byte(ds1302_day_add);                //周         
  177.         
  178.         readtime[0]=(time_buf[0]>>4);   //分離出年千位
  179.   readtime[1]=(time_buf[0]&0x0F); //分離出年百位
  180.   readtime[2]=(time_buf[1]>>4);   //分離出年十位
  181.   readtime[3]=(time_buf[1]&0x0F); //分離出年個位

  182.   readtime[4]=(time_buf[2]>>4);   //分離出月十位
  183.   readtime[5]=(time_buf[2]&0x0F); //分離出月個位

  184.   readtime[6]=(time_buf[3]>>4);   //分離出日十位
  185.   readtime[7]=(time_buf[3]&0x0F); //分離出日個位

  186.   readtime[8]=(time_buf[4]>>4);   //分離出小時十位
  187.   readtime[9]=(time_buf[4]&0x0F); //分離出小時個位
  188.   readtime[10]=(time_buf[5]>>4);   //分離出分鐘十位
  189.   readtime[11]=(time_buf[5]&0x0F); //分離出分鐘個位
  190.   readtime[12]=(time_buf[6]>>4);   //分離出秒鐘十位
  191.   readtime[13]=(time_buf[6]&0x0F); //分離出秒鐘個位
  192. }
  193. /////////////////////////////分離日期函數//////////////////////////


  194.         

  195. /******************************************************************************/
  196. /*****************************按鍵功能函數*************************************/
  197. void key_1()     //選擇變量函數
  198. {
  199.         
  200.          key1=1;
  201.          if(key1==0)
  202.           delay(10);                                                                                                                                                                                                                                
  203.          {
  204.           if(key1==0)
  205.           {
  206.            if(++status>12)status=0; //1控制年千位的變化,2控制年百位的變化,3控制年十位的變化
  207.           }       //4控制年個位的變化,5控制月十位的變化,6月個位,
  208.           while(key1==0);
  209.          }
  210. }
  211. /******************************************************************************/
  212. void key_2()       //加函數
  213. {
  214.         
  215.          key2=1;
  216.          if(key2==0)
  217.          {
  218.                   delay(10);
  219.                   if(key2==0)
  220.                   {
  221.                    switch(status)
  222.                    {
  223.                             case 1:if(++set[0]>9)set[0]=0;break;
  224.                             case 2:if(++set[1]>9)set[1]=0;break;
  225.                             case 3:if(++set[2]>1)set[2]=0;break;
  226.                             case 4:if(++set[3]>9)set[3]=1;break;
  227.                             case 5:if(++set[4]>9)set[4]=0;break;
  228.                                   case 6:if(++set[5]>9)set[5]=0;break;
  229.                                   case 7:if(++set[6]>9)set[6]=0;break;
  230.                                   case 8:if(++set[7]>9)set[7]=0;break;
  231.                                   case 9:if(++set[8]>9)set[8]=0;break;
  232.                                  case 10:if(++set[9]>9)set[9]=0;break;
  233.                                  case 11:if(++set[10]>9)set[10]=0;break;
  234.                                  case 12:if(++set[11]>9)set[11]=0;break;
  235.                                  
  236.                                  
  237.                    }
  238.           }
  239.         while(key2==0);
  240.          }
  241. }
  242. /*****************************************************************************/
  243. void key_3()//減函數
  244. {
  245.         
  246.           key3=1;
  247.          if(key3==0)
  248.          {
  249.                   delay(10);
  250.                   if(key3==0)
  251.                   {
  252.                    switch(status)
  253.                    {
  254.                             case 1:if((set[0]--)<=0)set[0]=9;break;
  255.                             case 2:if((set[1]--)<=0)set[1]=9;break;
  256.                             case 3:if((set[2]--)<=0)set[2]=1;break;
  257.                             case 4:if((set[3]--)<1)set[3]=9;break;
  258.                             case 5:if((set[4]--)<=0)set[4]=9;break;
  259.                                   case 6:if((set[5]--)<=0)set[5]=9;break;
  260.                                   case 7:if((set[6]--)<=0)set[6]=9;break;
  261.                                   case 8:if((set[7]--)<=0)set[7]=9;break;
  262.                                   case 9:if((set[8]--)<=0)set[8]=9;break;
  263.                                   case 10:if((set[9]--)<=0)set[9]=9;break;
  264.                                  case 11:if((set[10]--)<=0)set[10]=9;break;
  265.                                  case 12:if((set[11]--)<=0)set[11]=9;break;
  266. //                                 case 13:if((set[12]--)<=0)set[12]=9;break;
  267. //                                 case 14:if((set[13]--)<=0)set[13]=9;break;
  268. //                                 case 15:if((set[14]--)<=0)set[14]=9;break;
  269. //                                 case 16:if((set[15]--)<=0)set[15]=9;break;
  270.                                  
  271.         
  272.                    }
  273.                   }
  274.                   while(key3==0);
  275.          }
  276. }

  277. /*****************************************************************************/
  278. void key_time()    //按鍵設置時間的處理
  279. {
  280. if(status>0)
  281. {
  282.          ds1302_write_time();
  283. }
  284. }
  285. ///////////////////////////////鬧鐘/////////////////////

  286. void naozhong()    //鬧鐘
  287. {
  288.         if((readtime[8]==set[12])&&(readtime[9]==set[13])&&(readtime[10]==set[14])&&(readtime[11]==set[15])&&(readtime[12]==0)&&(readtime[13]==0))
  289.            led = 0;
  290. }

  291. void stop()
  292. {
  293.         
  294.          key_stop=1;
  295.          if(key_stop==0)
  296.           delay(10);                                                                                                                                                                                                                                
  297.          {
  298.           if(key_stop==0)
  299.           {
  300.            led =1;
  301.           }      
  302.           while(key_stop==0);
  303.          }
  304. }
  305. /////////////////////////////////////
  306. void nao_key1()
  307. {
  308.         nao1=1;
  309.          if(nao1==0)
  310.           delay(10);                                                                                                                                                                                                                                
  311.          {
  312.           if(nao1==0)
  313.           {
  314.            if(++sta>4)sta=0;
  315.           }      
  316.           while(nao1==0);
  317.          }
  318. }
  319. void nao_key2()       //加函數
  320. {
  321.         
  322.         nao2=1;
  323.          if(nao2==0)
  324.          {
  325.                   delay(10);
  326.                   if(nao2==0)
  327.                   {
  328.                    switch(sta)
  329.                    {
  330.                            case 1:if(++set[12]>9)set[12]=0;break;
  331.                                  case 2:if(++set[13]>9)set[13]=0;break;
  332.                                  case 3:if(++set[14]>9)set[14]=0;break;
  333.                                  case 4:if(++set[15]>9)set[15]=0;break;         
  334.                    }
  335.           }
  336.         while(nao2==0);
  337.          }
  338. }


  339. /////////////////////////////////////////////////////////
  340. int main(void)
  341. {        u8 t;
  342.          Delay_xms(50);//等待系統穩定
  343. ds1302_init(); //DS1302初始化
  344. // Uart_init(0); //波特率初始化為2400
  345. Delay_xms(10);
  346. ds1302_write_time(); //寫入初始值
  347.                         OLED_Init();                        //初始化OLED  
  348.                 OLED_Clear()          ;
  349.         
  350.                 t=' ';
  351. //                OLED_ShowCHinese(0,2,0);//中
  352. //                                OLED_ShowCHinese(18,2,1);//景
  353. //                OLED_ShowCHinese(36,2,2);//園
  354. //                OLED_ShowCHinese(54,2,3);//電
  355. //                OLED_ShowCHinese(72,2,4);//子
  356. //                OLED_ShowCHinese(90,2,5);//科
  357. //                OLED_ShowCHinese(108,2,6);//技
  358.          led = 1;
  359.         while(1)
  360.         {               
  361.                 ds1302_read_time();  //讀取時間
  362.    
  363.   
  364.   
  365.                   
  366. //                OLED_Clear();
  367. //                 if(readtime[13]!=sec_buf)      
  368. //   {
  369. //
  370. //      sec_flag=0;   
  371. //            sec_buf=readtime[13];        
  372.                   OLED_ShowNum(0,0,readtime[0],1,16);          //年千位
  373.             OLED_ShowNum(17,0,readtime[1],1,16);  //年百位
  374.                   OLED_ShowNum(33,0,readtime[2],1,16);        //年十位
  375.                   OLED_ShowNum(49,0,readtime[3],1,16);        //年個位
  376.                  
  377.                   OLED_ShowNum(33,2,readtime[4],1,16);        //月十位
  378.                   OLED_ShowNum(49,2,readtime[5],1,16);        //月個位
  379.                  
  380.                   OLED_ShowNum(33,4,readtime[6],1,16);        //月十位
  381.                   OLED_ShowNum(49,4,readtime[7],1,16);        //月個位
  382.                  
  383.      OLED_ShowNum(0,6,readtime[8],1,16);        //小時十位
  384.                  OLED_ShowNum(17,6,readtime[9],1,16);        //小時個位
  385.                  OLED_ShowString(33,6,":",16);
  386.                  OLED_ShowNum(49,6,readtime[10],1,16);//分鐘十位
  387.                  OLED_ShowNum(65,6,readtime[11],1,16);//分鐘個位
  388.      OLED_ShowString(81,6,":",16);//冒號                 
  389.                  OLED_ShowNum(97,6,readtime[12],1,16);        //秒鐘十位
  390.                  OLED_ShowNum(113,6,readtime[13],1,16);//秒鐘個位
  391.            
  392. //   }
  393.                 OLED_ShowCHinese(65,0,0);//年
  394.                 OLED_ShowCHinese(65,2,1);//月
  395. ……………………

  396. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png
所有資料51hei提供下載:
ds1302&amp;&amp;OLED.rar (98.06 KB, 下載次數: 325)

評分

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

查看全部評分

回復

使用道具 舉報

ID:362076 發表于 2019-1-30 18:54 | 顯示全部樓層
挺好的,界面UI可以再優化一下
回復

使用道具 舉報

ID:692368 發表于 2020-2-18 17:25 | 顯示全部樓層
很有參考價值
回復

使用道具 舉報

ID:430492 發表于 2020-2-29 17:54 | 顯示全部樓層
挺好的,界面UI確實可以再優化一下,這樣看起來更舒服些。
回復

使用道具 舉報

ID:110278 發表于 2020-3-6 16:13 | 顯示全部樓層
參考參考
回復

使用道具 舉報

ID:476465 發表于 2020-3-19 10:48 | 顯示全部樓層
顯示了時間,但計時總是會停下來不動
回復

使用道具 舉報

ID:315554 發表于 2020-3-19 17:57 | 顯示全部樓層
OLED時鐘程序比較少見,看起來不錯,學習了,謝謝!
回復

使用道具 舉報

ID:723958 發表于 2020-4-21 07:21 來自手機 | 顯示全部樓層
ak333 發表于 2020-3-19 17:57
OLED時鐘程序比較少見,看起來不錯,學習了,謝謝!

謝謝分享
回復

使用道具 舉報

ID:526108 發表于 2020-4-21 09:57 | 顯示全部樓層
鐘,按鍵調鬧鐘,調時間單片機程序 [修改]
回復

使用道具 舉報

ID:805457 發表于 2020-7-19 15:40 | 顯示全部樓層
這個代碼能有少一點的嗎
回復

使用道具 舉報

ID:976703 發表于 2021-11-8 15:52 | 顯示全部樓層
您好,下載里面和您上面描述的不一致,這個時間不可調,只有重量加溫度
回復

使用道具 舉報

ID:976703 發表于 2021-11-8 15:53 | 顯示全部樓層
你好,這個下載里面的程序和上面描述不一致,有上面描述的程序嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区三区在线播放 | 亚洲天堂精品一区 | 91久久久久久久久久久 | 日本 欧美 国产 | 亚洲精品一区二区三区四区高清 | 欧美毛片免费观看 | 91视频观看 | 国产视频精品在线观看 | 日韩欧美一区二区三区 | 精品国产一区二区三区久久 | 久久精品国产亚洲 | 美女黄视频网站 | 国产精品久久精品 | 色综合一区二区 | 久久精品一区二区三区四区 | 欧洲亚洲一区二区三区 | 91在线观看视频 | 久草视频在线播放 | 在线播放亚洲 | 日本久久久一区二区三区 | 老外黄色一级片 | 免费能直接在线观看黄的视频 | 午夜私人影院在线观看 | 久久久影院 | 一区二区三区免费 | 亚洲精品成人免费 | 免费黄色av | 操亚洲 | 久草.com | 成人蜜桃av| 中文字幕欧美在线观看 | 亚洲欧洲在线观看视频 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 中文字幕高清 | 奇米av| 国产精品一级 | 99精品久久久 | 国产一级特黄真人毛片 | 欧美国产精品久久久 | 国产在线二区 | 春色av|