找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

我的12864超級時鐘制作資料 帶紅外遙控 鬧鈴 按鍵 完整源碼

[復(fù)制鏈接]
ID:161768 發(fā)表于 2017-5-28 17:33 | 顯示全部樓層 |閱讀模式
12864時鐘資料包:
0.png
單片機(jī)源程序如下:
  1. /*********************************************************
  2. 項目名稱:                萬年歷的制作
  3. 項目目的:                通過制作萬年歷熟悉并掌握51系列的單片機(jī)
  4. 項目制作時間:        10月12日到10月25日
  5. 項目制作人:        柳振
  6. 項目實現(xiàn)功能:1,通過 12864顯示DS1302的當(dāng)前時間
  7.                           2,可以通過按鍵調(diào)節(jié)DS1302的時間并保存調(diào)節(jié)的時間
  8.                                 到芯片里面去
  9.                           3,調(diào)節(jié)DS1302時間是屏幕的時間時有友情提示
  10.                           4,實現(xiàn)鬧鐘功能并且能設(shè)定鬧鐘,設(shè)定鬧鐘時屏幕上有
  11.                                 友情提示
  12.                           5,設(shè)定的鬧鐘時間能在掉電的時候儲存當(dāng)再次開啟時
  13.                                 鬧鐘的時間仍然是上次的鬧鐘時間
  14.                                         按s4鬧鈴?fù)V?br />
  15.                           6,紅外按下 1 鍵并且在走動時間時切換屏幕 再按一下時
  16.                                 返回走動時間的界面 或者按s2鍵返回原來的界面
  17.                           7,按下 s4鍵之后單片機(jī)進(jìn)入串口通訊 并調(diào)整        DS1302
  18.                                 的時分秒的時間 通訊完之后單片機(jī)自動返回原來的界面
  19.                                 在通訊時仍然可以走動時間并每隔5 s把時間發(fā)送費電腦
  20.                                 通過按s4鍵退出
  21. **********************************************************/




  22. #include                 "Initial.h"        //主要用于初始化
  23. #include                 "Alarm.h"        //主要用于按鍵掃描于紅外掃描








  24. void main(void)                                   //主函數(shù)
  25. {




  26.          Initial();                                //初始化
  27.         
  28.          while(1)                                //按鍵掃描主要在alarm.c文件里面
  29.           {         
  30.                 Key_Scan();                        
  31.           }
  32. }








  33. ……………………




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

alarm文件:

  1. /************************************************************
  2.         本文件主要用于寫按鍵處理 與鬧鈴處理
  3. ************************************************************/
  4. #include        "HongWai.h"//主要用于調(diào)用紅外的函數(shù)
  5. #include        "Alarm.h"
  6. #include        "Delay.h"
  7. #include        "control.h"
  8. #include        "12864.h"
  9. #include        "ds1302.h"
  10. #include        "Uart.h"




  11.                           //g_Flag1看鬧鈴      g_Flag2 設(shè)鬧鈴




  12. bit                        g_Alarm_Flag1,g_Alarm_Flag2;
  13. bit                        g_Uart_Work_Flag;
  14. bit         g_Turn_Poem_Flag;
  15. uchar                g_Alarm_hour,g_Alarm_min;
  16. uchar                g_Set_Alarm_Num;                                //鬧鈴設(shè)定功能的變量
  17. uchar                    g_Set_DS1302_Num;                                //DS1302的工能設(shè)置時間




  18. /****************************************************
  19.         函數(shù)名稱:         設(shè)置1302的時間
  20.         函數(shù)功能:        調(diào)整DS1302的時間數(shù)值
  21.         入口參數(shù):        無
  22.         出口參數(shù):        無
  23.         備          注:        按s1進(jìn)入設(shè)定時間    再次按下其他的按鍵開始調(diào)節(jié)
  24.                                 s1設(shè)定的項目增加        s2設(shè)定的項目減小
  25.                                 s3增加相應(yīng)的數(shù)值        s4減小相應(yīng)的數(shù)值
  26. *****************************************************/
  27. void Set_DS1302()                                
  28. {
  29.         if(s1 == 0)                                        //功能增加位置鍵
  30.         {
  31.                 DelayMs(15);                        //消抖
  32.                 if(s1 == 0)
  33.                 {
  34.                         while(!s1);                        //等待按鍵釋放
  35.                         Di();                                //響
  36.                     g_Set_DS1302_Num++;                                //功能鍵按下次數(shù)
  37.                         if(g_Set_DS1302_Num >= 9)                //第八次按下
  38.                         {
  39.                                 g_Set_DS1302_Num = 0;
  40.                                 g_Alarm_Flag1 = 0;
  41.                                 g_Alarm_Flag2 = 0;
  42.                         }
  43.                         if(g_Set_DS1302_Num > 0)
  44.                         {
  45.                                 Locate_DS1302();                        //一直定位
  46.                         }
  47.                 }
  48.         }
  49.         if(s2 == 0)                                          //功能位置返回按鍵
  50.         {
  51.                 DelayMs(15);                        //消抖
  52.                 if(s2 == 0)
  53.                 {
  54.                         while(!s2);                        //等待按鍵釋放
  55.                         Di();                                //響
  56.                     g_Set_DS1302_Num--;                                //功能鍵按下次數(shù)
  57.                         if(g_Set_DS1302_Num <= 0)                        //清零
  58.                         {
  59.                                 Write_1302_Date();        //寫入 存儲數(shù)據(jù)
  60.                                 g_Set_DS1302_Num = 0;
  61.                                 Initial_12864();
  62.                                 Write_12864_DS1302_Constant();
  63.                         }
  64.                         if(g_Set_DS1302_Num > 0)
  65.                         {
  66.                                 Locate_DS1302();                        //一直定位
  67.                         }
  68.                 }
  69.         }
  70.         




  71.         if(g_Set_DS1302_Num > 0)        //否則進(jìn)行調(diào)整
  72.         {
  73.                 if(s3 == 0)                                //增大鍵調(diào)節(jié)
  74.                 {
  75.                         DelayMs(5);                        //消抖        
  76.                         if(s3== 0)
  77.                         {
  78.                                 Di();                                //響
  79.                                 while(!s3);                        //等待按鍵釋放
  80.                                 Increase_DS1302();  //增大DS1302數(shù)值函數(shù)




  81.                         }
  82.                 }
  83.                 if(s4 == 0)                                //減小調(diào)節(jié)
  84.                 {
  85.                         DelayMs(5);                        //消抖        
  86.                         if(s4== 0)
  87.                         {
  88.                                 while(!s4);                 //等待按鍵釋放
  89.                                 Di();                         //響
  90.                                 Decrease_DS1302();//減小數(shù)值的函數(shù)
  91.                         }
  92.                 }
  93.         }




  94. }




  95. /**************************************************
  96.         函數(shù)名:        Set_A()
  97.         函數(shù)功能:        設(shè)定鬧鈴的時間
  98.         入口參數(shù):        無
  99.         出口參數(shù):        無
  100.         備          注:  s1設(shè)定的項目增加   s2設(shè)定的項目減小
  101.                                 s3增加相應(yīng)的數(shù)值   s4減小相應(yīng)的數(shù)值
  102. ***************************************************/
  103. void Set_A()                                        //設(shè)定鬧鈴的時間
  104. {
  105.         if(s1 == 0)                                        //鬧鈴設(shè)定的項目增加
  106.         {
  107.                 DelayMs(15);
  108.                 if(s1 == 0)
  109.                 {
  110.                         Di();
  111.                         while(!s1);




  112.                         g_Set_Alarm_Num ++;                                //鬧鈴的功能變量加
  113.                         Initial_12864();               




  114.                         if(g_Set_Alarm_Num >= 3)                        //退出鬧鈴設(shè)定的功能
  115.                         {
  116.                                 g_Set_Alarm_Num    = 0;
  117.                                 g_Set_DS1302_Num   = 0;                 //讓時間走起來
  118.                                 Write_12864_DS1302_Constant();
  119.                                 g_Alarm_Flag2 = 0;
  120.                                 g_Alarm_Flag1 = 0;
  121.                         }
  122.                         Locate_A();                                        //定位改變的鬧鐘數(shù)值
  123.                 }
  124.         }
  125.         
  126.         if(s2 == 0)                                        //鬧鈴設(shè)定的項目減小
  127.         {
  128.                 DelayMs(15);
  129.                 if(s2 == 0)
  130.                 {
  131.                         Di();
  132.                         while(!s2);
  133.                         g_Set_Alarm_Num --;
  134.                         Initial_12864();               
  135.                         if(g_Set_Alarm_Num <= 0)                //退出鬧鈴設(shè)置
  136.                         {
  137.                                 g_Set_Alarm_Num = 0;
  138.                                 g_Set_DS1302_Num   = 0;                 //讓時間走起來
  139.                                 Initial_12864();
  140.                                 Write_12864_DS1302_Constant();
  141.                                 g_Alarm_Flag2 = 0;
  142.                                 g_Alarm_Flag1 = 0;
  143.                         }
  144.                         Locate_A();                //定位改變的鬧鐘數(shù)值
  145.                 }
  146.         }
  147.         if(g_Set_Alarm_Num != 0)    //進(jìn)入鬧鈴時分秒的增大減小               
  148.         {
  149.                 if(s3 == 0)                                //對鬧鈴時分秒的數(shù)值進(jìn)行增大
  150.                 {
  151.                         DelayMs(15);
  152.                         if(s3 == 0)
  153.                         {
  154.                                 Di();
  155.                                 while(!s3);
  156.                                 A_Increase();
  157.                         }
  158.                 }
  159.                
  160.                 if(s4 == 0)                                //對鬧鈴的數(shù)值進(jìn)行減小
  161.                 {
  162.                         DelayMs(15);
  163.                         if(s4 == 0)
  164.                         {
  165.                                 Di();
  166.                                 while(!s4);
  167.                                 A_Decrease();
  168.                         }               
  169.                 }
  170.         }
  171.         
  172. }




  173. /***********************************************
  174.         函數(shù)名:        沒有中斷處理的標(biāo)志位掃描
  175.         函數(shù)功能:        用于沒有串口中斷的各種各的標(biāo)志位掃描
  176.                                 與按鍵掃描         包括鬧鈴 ,DS1302 ,紅外
  177.         入口參數(shù):        無
  178.         出口參數(shù):        無
  179.         備          注:        友情提示在液晶上有顯示
  180.                                 按下s1進(jìn)入        DS1302的時間修訂
  181.                                 按下s3進(jìn)入  鬧鈴的的查看與修正
  182.                                 按下s4進(jìn)入        串口中斷的處理
  183. ***********************************************/
  184. void Without_Uart()                                                                                                                                                                                                                        
  185. {
  186.         static        bit        Stop_A_Flag = 0;        //停止鬧鈴的標(biāo)志位
  187.         
  188.         if(g_Alarm_Flag1 == 0 && g_Alarm_Flag2 == 0 && g_HongWai_Work_Flag == 0)        //DS1302的有關(guān)函數(shù) 主要看行走的時間與DS1302的時間修改
  189.         {
  190.                 Set_DS1302();                                                                                        //設(shè)置DS1302時間
  191.                 if(g_Set_DS1302_Num == 0)                                                                                        //當(dāng)功能鍵的數(shù)值為零時進(jìn)行讀取DS1302的所有數(shù)據(jù)
  192.                 {
  193.                         Read_All_DS1302_Date();
  194.                 }
  195.         Display_DS1302_Time();
  196.         }




  197.         if(g_Alarm_Flag1 == 0 && g_Alarm_Flag2 == 0 && g_HongWai_Work_Flag == 0 && g_Set_DS1302_Num == 0)//s3鬧鈴查看與修正
  198.         {
  199.                 if(s3 == 0)
  200.                 {
  201.                         DelayMs(15);
  202.                         if(s3 == 0)
  203.                         {
  204.                                 Di();
  205.                                 while(!s3);
  206.                                 g_Alarm_Flag1 = 1;
  207.                                 Initial_12864();
  208.                                 Remind_Whether_Set_Alarm();        
  209.                         }
  210.                 }
  211.         }
  212.         if(g_Alarm_Flag1 == 1 && g_Alarm_Flag2 == 0 && g_HongWai_Work_Flag == 0)        //判斷是否進(jìn)入鬧鈴
  213.         {
  214.                 if(s1 == 0)                                //退出鬧鈴設(shè)定
  215.                 {
  216.                         DelayMs(15);
  217.                         if(s1 == 0)
  218.                         {
  219.                                 Di();
  220.                                 while(!s1);
  221.                                 g_Alarm_Flag2    = 0;
  222.                 g_Alarm_Flag1    = 0;
  223.                                 g_Set_DS1302_Num = 0;
  224.                                 Write_12864_DS1302_Constant();                        //寫12864固定的部分
  225.                         }
  226.                 }
  227.                 if(s2 == 0)                                //進(jìn)入鬧鈴的設(shè)定
  228.                 {
  229.                         DelayMs(15);
  230.                         if(s2 == 0)
  231.                         {
  232.                                 Di();
  233.                                 while(!s2);
  234.                                 g_Alarm_Flag2 = 1;
  235.                 g_Set_Alarm_Num ++;                 //開始調(diào)節(jié)分鐘
  236.                 Locate_A();
  237.                         }
  238.                 }
  239.         }




  240.         if(g_Alarm_Flag2 == 1 && g_HongWai_Work_Flag == 0)//設(shè)定鬧鈴的時間
  241.         {
  242.                 Set_A();        
  243.                 Stop_A_Flag = 0;                                                                                //設(shè)置好后讓鬧鈴繼續(xù)響
  244.         }
  245.         
  246.         if(g_HongWai_Work_Flag == 1)
  247.     {
  248.         if(g_Turn_Poem_Flag == 0)
  249.         {
  250.             Turn_Page_Poem();
  251.         }
  252.     }
  253.         if(g_Alarm_hour == g_hour && g_Alarm_min == g_min && Stop_A_Flag == 0
  254.                                                   && g_Alarm_Flag1   ==  0  && g_Alarm_Flag2 == 0 && g_Set_DS1302_Num == 0)        //進(jìn)入鬧鐘報響
  255.         {
  256.                 Di();
  257.                
  258.                 Locate_pos                (0,0);
  259.                 Write_String        ("鬧鈴來了  現(xiàn)在是",0,16);
  260.                 Locate_pos                (3,0);                                        //友情提示
  261.                 Write_String        ("按s4退出退出鬧鈴",0,16);
  262.                 if(g_sec >= 59)
  263.                 {
  264.                         Write_12864_DS1302_Constant();               
  265.                 }
  266.                
  267.                 if(s4 == 0)                                                        //退出鬧鈴
  268.                 {
  269.                         DelayMs(15);
  270.                         if(s4 == 0)
  271.                         {
  272.                                 Di();
  273.                                 while(!s4);
  274.                                 Stop_A_Flag = 1;//鬧鈴標(biāo)志位置一 停止鬧鈴 如果想再次進(jìn)入鬧鈴重新設(shè)定                                
  275.                                 Write_12864_DS1302_Constant();
  276.                         }
  277.                 }
  278.                
  279.         }
  280.         
  281.         IRR_Work();                                                                                                        //紅外工作




  282. }
  283. /**************************************************
  284.         函數(shù)名:        Key_Scan()
  285.         函數(shù)功能:        各種各樣的標(biāo)志位掃描與按鍵掃描
  286.         入口參數(shù):        無
  287.         出口參數(shù):        無
  288.         備          注:        主要被主函數(shù)調(diào)用以便讓整個工程工作
  289.                                 主要用于各種各樣的按鍵掃描于標(biāo)志位掃描
  290. ***************************************************/        
  291. void        Key_Scan()
  292. {
  293.         
  294.         if(g_Uart_Work_Flag == 0)                                                                        //判斷是否進(jìn)入串口中斷
  295.         {




  296.                 if(g_Set_DS1302_Num == 0 && g_Alarm_Flag1 == 0 && g_Alarm_Flag2 == 0)
  297.                 {
  298.                         if(s4 == 0)
  299.                         {
  300.                                 DelayMs(15);
  301.                                 if(s4 == 0)
  302.                                 {
  303.                                         Di();
  304.                                         while(!s4);
  305.                                         g_Uart_Work_Flag = 1;
  306.                                         Initial_Uart        ();                        //初始化串口
  307.                                         Remind_Uart_process();                //提示進(jìn)行串口處理
  308.                                 }
  309. ……………………




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

所有資料51hei提供下載地址:
http://www.torrancerestoration.com/bbs/dpj-86188-1.html




回復(fù)

使用道具 舉報

ID:211258 發(fā)表于 2017-6-15 17:50 | 顯示全部樓層
非常好
回復(fù)

使用道具 舉報

ID:46943 發(fā)表于 2017-6-16 08:05 | 顯示全部樓層
看了下,感覺非常好
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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