找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4040|回复: 2
收起左侧

我的12864超级时钟制作资料 带红外遥控 闹铃 按键 完整源码

[复制链接]
ID:161768 发表于 2017-5-28 17:33 | 显示全部楼层 |阅读模式
12864时钟资料包:
0.png
单片机源程序如下:
  1. /*********************************************************
  2. 项目名称:                万年历的制作
  3. 项目目的:                通过制作万年历熟悉并掌握51系列的单片机
  4. 项目制作时间:        10月12日到10月25日
  5. 项目制作人:        柳振
  6. 项目实现功能:1,通过 12864显示DS1302的当前时间
  7.                           2,可以通过按键调节DS1302的时间并保存调节的时间
  8.                                 到芯片里面去
  9.                           3,调节DS1302时间是屏幕的时间时有友情提示
  10.                           4,实现闹钟功能并且能设定闹钟,设定闹钟时屏幕上有
  11.                                 友情提示
  12.                           5,设定的闹钟时间能在掉电的时候储存当再次开启时
  13.                                 闹钟的时间仍然是上次的闹钟时间
  14.                                         按s4闹铃停止
  15.                           6,红外按下 1 键并且在走动时间时切换屏幕 再按一下时
  16.                                 返回走动时间的界面 或者按s2键返回原来的界面
  17.                           7,按下 s4键之后单片机进入串口通讯 并调整        DS1302
  18.                                 的时分秒的时间 通讯完之后单片机自动返回原来的界面
  19.                                 在通讯时仍然可以走动时间并每隔5 s把时间发送费电脑
  20.                                 通过按s4键退出
  21. **********************************************************/




  22. #include                 "Initial.h"        //主要用于初始化
  23. #include                 "Alarm.h"        //主要用于按键扫描于红外扫描








  24. void main(void)                                   //主函数
  25. {




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








  33. ……………………




  34. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

alarm文件:

  1. /************************************************************
  2.         本文件主要用于写按键处理 与闹铃处理
  3. ************************************************************/
  4. #include        "HongWai.h"//主要用于调用红外的函数
  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 设闹铃




  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;                                //闹铃设定功能的变量
  17. uchar                    g_Set_DS1302_Num;                                //DS1302的工能设置时间




  18. /****************************************************
  19.         函数名称:         设置1302的时间
  20.         函数功能:        调整DS1302的时间数值
  21.         入口参数:        无
  22.         出口参数:        无
  23.         备          注:        按s1进入设定时间    再次按下其他的按键开始调节
  24.                                 s1设定的项目增加        s2设定的项目减小
  25.                                 s3增加相应的数值        s4减小相应的数值
  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++;                                //功能键按下次数
  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--;                                //功能键按下次数
  57.                         if(g_Set_DS1302_Num <= 0)                        //清零
  58.                         {
  59.                                 Write_1302_Date();        //写入 存储数据
  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)        //否则进行调整
  72.         {
  73.                 if(s3 == 0)                                //增大键调节
  74.                 {
  75.                         DelayMs(5);                        //消抖        
  76.                         if(s3== 0)
  77.                         {
  78.                                 Di();                                //响
  79.                                 while(!s3);                        //等待按键释放
  80.                                 Increase_DS1302();  //增大DS1302数值函数




  81.                         }
  82.                 }
  83.                 if(s4 == 0)                                //减小调节
  84.                 {
  85.                         DelayMs(5);                        //消抖        
  86.                         if(s4== 0)
  87.                         {
  88.                                 while(!s4);                 //等待按键释放
  89.                                 Di();                         //响
  90.                                 Decrease_DS1302();//减小数值的函数
  91.                         }
  92.                 }
  93.         }




  94. }




  95. /**************************************************
  96.         函数名:        Set_A()
  97.         函数功能:        设定闹铃的时间
  98.         入口参数:        无
  99.         出口参数:        无
  100.         备          注:  s1设定的项目增加   s2设定的项目减小
  101.                                 s3增加相应的数值   s4减小相应的数值
  102. ***************************************************/
  103. void Set_A()                                        //设定闹铃的时间
  104. {
  105.         if(s1 == 0)                                        //闹铃设定的项目增加
  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)                        //退出闹铃设定的功能
  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();                                        //定位改变的闹钟数值
  123.                 }
  124.         }
  125.         
  126.         if(s2 == 0)                                        //闹铃设定的项目减小
  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)                //退出闹铃设置
  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();                //定位改变的闹钟数值
  145.                 }
  146.         }
  147.         if(g_Set_Alarm_Num != 0)    //进入闹铃时分秒的增大减小               
  148.         {
  149.                 if(s3 == 0)                                //对闹铃时分秒的数值进行增大
  150.                 {
  151.                         DelayMs(15);
  152.                         if(s3 == 0)
  153.                         {
  154.                                 Di();
  155.                                 while(!s3);
  156.                                 A_Increase();
  157.                         }
  158.                 }
  159.                
  160.                 if(s4 == 0)                                //对闹铃的数值进行减小
  161.                 {
  162.                         DelayMs(15);
  163.                         if(s4 == 0)
  164.                         {
  165.                                 Di();
  166.                                 while(!s4);
  167.                                 A_Decrease();
  168.                         }               
  169.                 }
  170.         }
  171.         
  172. }




  173. /***********************************************
  174.         函数名:        没有中断处理的标志位扫描
  175.         函数功能:        用于没有串口中断的各种各的标志位扫描
  176.                                 与按键扫描         包括闹铃 ,DS1302 ,红外
  177.         入口参数:        无
  178.         出口参数:        无
  179.         备          注:        友情提示在液晶上有显示
  180.                                 按下s1进入        DS1302的时间修订
  181.                                 按下s3进入  闹铃的的查看与修正
  182.                                 按下s4进入        串口中断的处理
  183. ***********************************************/
  184. void Without_Uart()                                                                                                                                                                                                                        
  185. {
  186.         static        bit        Stop_A_Flag = 0;        //停止闹铃的标志位
  187.         
  188.         if(g_Alarm_Flag1 == 0 && g_Alarm_Flag2 == 0 && g_HongWai_Work_Flag == 0)        //DS1302的有关函数 主要看行走的时间与DS1302的时间修改
  189.         {
  190.                 Set_DS1302();                                                                                        //设置DS1302时间
  191.                 if(g_Set_DS1302_Num == 0)                                                                                        //当功能键的数值为零时进行读取DS1302的所有数据
  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)        //判断是否进入闹铃
  213.         {
  214.                 if(s1 == 0)                                //退出闹铃设定
  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)                                //进入闹铃的设定
  228.                 {
  229.                         DelayMs(15);
  230.                         if(s2 == 0)
  231.                         {
  232.                                 Di();
  233.                                 while(!s2);
  234.                                 g_Alarm_Flag2 = 1;
  235.                 g_Set_Alarm_Num ++;                 //开始调节分钟
  236.                 Locate_A();
  237.                         }
  238.                 }
  239.         }




  240.         if(g_Alarm_Flag2 == 1 && g_HongWai_Work_Flag == 0)//设定闹铃的时间
  241.         {
  242.                 Set_A();        
  243.                 Stop_A_Flag = 0;                                                                                //设置好后让闹铃继续响
  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)        //进入闹钟报响
  255.         {
  256.                 Di();
  257.                
  258.                 Locate_pos                (0,0);
  259.                 Write_String        ("闹铃来了  现在是",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;//闹铃标志位置一 停止闹铃 如果想再次进入闹铃重新设定                                
  275.                                 Write_12864_DS1302_Constant();
  276.                         }
  277.                 }
  278.                
  279.         }
  280.         
  281.         IRR_Work();                                                                                                        //红外工作




  282. }
  283. /**************************************************
  284.         函数名:        Key_Scan()
  285.         函数功能:        各种各样的标志位扫描与按键扫描
  286.         入口参数:        无
  287.         出口参数:        无
  288.         备          注:        主要被主函数调用以便让整个工程工作
  289.                                 主要用于各种各样的按键扫描于标志位扫描
  290. ***************************************************/        
  291. void        Key_Scan()
  292. {
  293.         
  294.         if(g_Uart_Work_Flag == 0)                                                                        //判断是否进入串口中断
  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();                //提示进行串口处理
  308.                                 }
  309. ……………………




  310. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

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




回复

使用道具 举报

ID:211258 发表于 2017-6-15 17:50 | 显示全部楼层
非常好
回复

使用道具 举报

ID:46943 发表于 2017-6-16 08:05 | 显示全部楼层
看了下,感觉非常好
回复

使用道具 举报

无效楼层,该帖已经被删除
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表