找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5835|回复: 10
打印 上一主题 下一主题
收起左侧

ds1302+1602+18b20+四个按键调时间制作成功

  [复制链接]
跳转到指定楼层
楼主
按键两个控制加减,再两个按键控制选择,选择的时候屏幕显示调整哪个,例如调整年,屏幕就显示1
16.9代表是温度
温度显示是实时温度



正常显示

调年份显示1


调月份显示2


单片机源程序如下:
  1. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  2. #include <stdio.h>
  3. #include "ds1302.h"
  4. #include "delay.h"
  5. #include"18b20.h"
  6. #include "1602.h"
  7. #define KeyPort P3 //定义按键端口

  8. unsigned char KeyScan(void);//键盘扫描
  9. bit ReadTimeFlag;//定义读时间标志
  10. bit SetFlag;    //更新时间标志位
  11. unsigned char time_buf2[16];
  12. sbit K1=P3^0;                //选择
  13. sbit K2=P3^1;                //加
  14. sbit K3=P3^2;                //减
  15. sbit K4=P3^3;         
  16. void Init_Timer0(void);//定时器初始化
  17. void UART_Init(void);
  18. unsigned char Change_Flag[]= "0123456789AB";
  19. unsigned char Adjust_Index=0;  //当前调节的时间对象:,,分,是,日,月,年(1,2,3,4,6)
  20. void DateTime_Adjust(char x);


  21. /*------------------------------------------------
  22.                     主函数
  23. ------------------------------------------------*/
  24. void main (void)
  25. {

  26. unsigned char temp1;
  27. float temperature;
  28. char displaytemp[16];
  29. char temp3[16];


  30.         //外部中断0开
  31.    
  32. LCD_Init();           //初始化液晶
  33. Init_Timer0();        //定时器0初始化
  34. Ds1302_Init();        //ds1302初始化
  35.       
  36. Init_DS18B20();

  37.   Ds1302_Write_Time();
  38.   K1=K2=K3=K4=1;
  39.    while(1)
  40.    {
  41.         if(K1==0)          //选择调整对象(Y M D H M)
  42.         {       
  43.                 DelayMs(10);
  44.                 if(K1==0)
  45.    {   DelayMs(10);
  46.      
  47.             DelayMs(10);       
  48.           DelayMs(10);       
  49.           Adjust_Index++;
  50.           LCD_Write_Char(12,0,Change_Flag[Adjust_Index]);
  51.           if(Adjust_Index==13)
  52.                  Adjust_Index=0;

  53.           switch( Adjust_Index)
  54.           {                            //第一行
  55.                     case 1:                LCD_Write_Char(0,0,0xff); break;       
  56.                     case 2:     LCD_Write_Char(1,0,0xff); break;
  57.                                 case 3:            LCD_Write_Char(3,0,0xff); break;
  58.                                 case 4:            LCD_Write_Char(4,0,0xff); break;
  59.                                 case 5:                LCD_Write_Char(6,0,0xff); break;       
  60.                                 case 6:     LCD_Write_Char(7,0,0xff); break;
  61.                            //第二行
  62.                                 case 7:                LCD_Write_Char(0,1,0xff); break;
  63.                                 case 8:           LCD_Write_Char(1,1,0xff); break;
  64.                                 case 9:                LCD_Write_Char(3,1,0xff); break;
  65.                                 case 10:        LCD_Write_Char(4,1,0xff); break;
  66.                                 case 11:        LCD_Write_Char(6,1,0xff); break;       
  67.                                 case 12:    LCD_Write_Char(7,1,0xff); break;



  68.                

  69.                 }
  70.         }          }
  71.         if(K2==0)                          //加
  72.         {        //while(K2==0);
  73.                        
  74.                 if(K2==0)
  75.                
  76.          switch(Adjust_Index)
  77.           {                  
  78.                              case 1:time_buf1[1]--;Ds1302_Write_Time();break;
  79.                                                   case 2:if(--time_buf1[2]<1)time_buf1[2]=12;Ds1302_Write_Time();break;
  80.                                                   case 3:{if(time_buf1[2]==1||time_buf1[2]==3||time_buf1[2]==5||time_buf1[2]==7||time_buf1[2]==8
  81.                                                   ||time_buf1[2]==10||time_buf1[2]==12)
  82.                                                   {if(--time_buf1[3]<1)time_buf1[3]=31;}else if(time_buf1[2]==2)
  83.                                                   {if(--time_buf1[3]<1)time_buf1[3]=28;}else {if(--time_buf1[3]<1)time_buf1[3]=30;}} Ds1302_Write_Time();
  84.                                                   break;
  85.                                                   case 4:if((--time_buf1[4])<1)time_buf1[4]=23;Ds1302_Write_Time();break;
  86.                                                   case 5:if((--time_buf1[5])<1)time_buf1[5]=59;Ds1302_Write_Time();break;
  87.                                         }
  88.         }
  89.          if(K3==0)                         //减
  90.         {
  91.           
  92.            DelayMs(10);
  93.            if(K3==0)
  94.            switch(Adjust_Index)
  95.                                           {
  96.                                                   case 1:time_buf1[1]++;Ds1302_Write_Time();break;
  97.                                                   case 3:if(++time_buf1[2]>12)time_buf1[2]=1;Ds1302_Write_Time();break;
  98.                                                   case 4:{if(time_buf1[2]==1||time_buf1[2]==3||time_buf1[2]==5||time_buf1[2]==7||time_buf1[2]==8
  99.                                                   ||time_buf1[2]==10||time_buf1[2]==12)
  100.                                                   {if(++time_buf1[3]>31)time_buf1[3]=1;}else if(time_buf1[2]==2)
  101.                                                   {if(++time_buf1[3]>28)time_buf1[3]=1;}else {if(++time_buf1[3]>30)time_buf1[3]=1;}}Ds1302_Write_Time();
  102.                                                   break;
  103.                                                   case 5:if(++time_buf1[4]>23)time_buf1[4]=0;Ds1302_Write_Time();break;
  104.                                                   case 6:if(++time_buf1[5]>59)time_buf1[5]=0;Ds1302_Write_Time();break;
  105.                                                    }   }
  106.                
  107.          if(K4==0)                           //确定
  108.         {
  109.                 //while(K4==0);
  110.                 DelayMs(10);
  111.                 TR0=1;
  112.                 if(K4==0)
  113.                 {
  114.                 Ds1302_Write_Time() ;                         //将调整后的时间写入DS1302
  115.                
  116.                 Adjust_Index=0;
  117.                    }}       




  118.            if(ReadTimeFlag==1) //定时读取ds1302 定时时间到 则标志位置1,处理过时间参数标志位清零
  119.         {
  120.           ReadTimeFlag=0;  //标志位清零
  121.           Ds1302_Read_Time(); temp1=ReadTemperature();
  122.   temperature=(float)temp1*0.0625+15;
  123.   sprintf(displaytemp,"%0.3f",temperature);//打印温度值
  124.   LCD_Write_String(12,1,displaytemp);
  125.         }
  126.          Ds1302_Read_Time();
  127.          LCD_Write_Char(0,0,(time_buf1[1]/10+0x30));
  128.          LCD_Write_Char(1,0,(time_buf1[1]%10+0x30));
  129.          LCD_Write_Char(2,0,'-');
  130.          LCD_Write_Char(3,0,(time_buf1[2]%10+0x30));
  131.          LCD_Write_Char(4,0,(time_buf1[2]/10+0x30));
  132.          LCD_Write_Char(5,0,'-');
  133.          LCD_Write_Char(6,0,(time_buf1[3]/10+0x30));
  134.          LCD_Write_Char(7,0,(time_buf1[3]%10+0x30));
  135.          LCD_Write_Char(0,1,(time_buf1[4]/10+0x30));
  136.          LCD_Write_Char(1,1,(time_buf1[4]%10+0x30));
  137.          LCD_Write_Char(2,1,':');
  138.          LCD_Write_Char(3,1,(time_buf1[5]/10+0x30));
  139.          LCD_Write_Char(4,1,(time_buf1[5]%10+0x30));
  140.          LCD_Write_Char(5,1,':');
  141.          LCD_Write_Char(6,1,(time_buf1[6]/10+0x30));
  142.          LCD_Write_Char(7,1,(time_buf1[6]%10+0x30));
  143.   
  144.      
  145.                   
  146.            }

  147. }   
  148.                  
  149.           



  150. ///*------------------------------------------------
  151. //                    定时器初始化子程序
  152. //------------------------------------------------*/
  153. void Init_Timer0(void)
  154. {
  155. TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
  156. TH0=(65536-2000)/256;                  //重新赋值 2ms
  157. TL0=(65536-2000)%256;
  158. EA=1;            //总中断打开
  159. ET0=1;           //定时器中断打开
  160. TR0=1;           //定时器开关打开
  161. }
  162. ……………………

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

所有资料51hei提供下载:
可调时钟.rar (51.07 KB, 下载次数: 123)




评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:164050 发表于 2018-1-29 23:08 | 只看该作者
这个不错,找了很久,谢谢楼主
回复

使用道具 举报

板凳
ID:183763 发表于 2018-4-14 21:32 | 只看该作者
楼主的截图里面怎么会有70和80的显示呢,似乎是月份的位置,应该还有bug吧
回复

使用道具 举报

地板
ID:308346 发表于 2018-4-19 10:19 | 只看该作者
下载了之后打不开
回复

使用道具 举报

5#
ID:248394 发表于 2018-4-20 15:24 | 只看该作者
666收藏了
回复

使用道具 举报

6#
ID:288065 发表于 2018-5-5 14:45 | 只看该作者
月份为啥有80啊,乱码还是错了
回复

使用道具 举报

7#
ID:242950 发表于 2018-6-4 17:04 | 只看该作者
YQQ 发表于 2018-5-5 14:45
月份为啥有80啊,乱码还是错了

这是好久之前写的,这个月份乱码了,或者程序本身有点问题
回复

使用道具 举报

8#
ID:242950 发表于 2018-6-7 22:40 | 只看该作者
减应该到255置0,这个没有注意,大家改一下就好了
回复

使用道具 举报

9#
ID:347372 发表于 2018-6-8 09:25 | 只看该作者
请问如何用通信来实现另一个单片机来调节时间了
回复

使用道具 举报

10#
ID:242950 发表于 2018-10-14 18:44 | 只看该作者
这个程序希望你们能看懂,而不是模仿,拷贝
回复

使用道具 举报

11#
ID:510084 发表于 2019-4-12 19:56 | 只看该作者

装WinRAR再试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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