找回密码
 立即注册

QQ登录

只需一步,快速开始

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

多功能万年历DS1302+DS18B20+继电器仿真与与源码

[复制链接]
跳转到指定楼层
楼主
这是我前段时间弄好的,现在整理一下,分享给大家里面包含源程序和仿真。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include "reg52.h"
  2. #include "lcd1602.h"
  3. #include "ds18b20.h"
  4. #include "ds1302.h"

  5. /*********按键*********/
  6. sbit s1=P0^0;
  7. sbit s2=P0^1;
  8. sbit s3=P0^2;
  9. sbit s4=P0^3;
  10. /****时间结构体变量****/
  11. Ds1302_Date Date;
  12. /*********继电器*********/
  13. sbit ji_dian_qi=P3^6;  //1动作ji_dian_qi
  14. unsigned char SetTemp =25,t;
  15. /*********标志位*************/
  16. unsigned char flag=0;
  17. unsigned char flag1=0;
  18. unsigned char flag2=0;

  19. int wendu;
  20. //十进制转化为BC码
  21. unsigned char dectobcd(unsigned char dec)
  22. {
  23.         unsigned char bcd;
  24.         bcd = 0;
  25.         while(dec >= 10)
  26.         {              
  27.                 dec -= 10;                        
  28.                 bcd++;
  29.         }
  30.         bcd <<= 4;
  31.         bcd |= dec;
  32.         return bcd;
  33. }
  34. void Delay(uint z)
  35. {
  36.         uint x,y;
  37.         for(x=z;x>0;x--)
  38.     for(y=110;y>0;y--);
  39. }

  40. void LCD_SetTemp(unsigned char X,unsigned char Y,unsigned char temp)
  41. {
  42.     unsigned char ge,shi;
  43.     unsigned char tab1[3];
  44.     ge =temp%10;
  45.     shi=temp/10%10;
  46.    
  47.     tab1[1] ='0'+ge;
  48.     tab1[0] ='0'+shi;
  49.     tab1[2] ='\0';
  50.     Lcd1602_Write_Cmd(0x0c);//取消光标闪烁
  51.     LcdShowStr(X,Y,tab1);

  52. }
  53. void key()
  54. {
  55.      if(s1==0)
  56.                 {
  57.                      Delay(1);
  58.                          if(s1==0)                                        //
  59.                          {
  60.                                                  while(!s1);
  61.                                                  if(flag2==0)
  62.                             {
  63.                                 flag=~flag;
  64.                             }
  65.                             else if(flag2==1)
  66.                                                         {
  67.                                                              Date.Minute++;
  68.                                                                  if(Date.Minute==60)
  69.                                                                  Date.Minute=0;
  70.                                                                  Date.Minute=dectobcd(Date.Minute);
  71.                                                                  Write1302 (WRITE_PROTECT,0X00);         //禁止写保护
  72.                                                                Write1302 (WRITE_MINUTE,Date.Minute);         //分钟初始化
  73.                                                                 Write1302 (WRITE_PROTECT,0x80);                 //允许写保护
  74.                                                         }
  75.                             else if(flag2==2)
  76.                             {
  77.                                  Date.Hour++;
  78.                                                                  if(Date.Hour==24)
  79.                                                                  Date.Hour=0;
  80.                                                                  Date.Hour=dectobcd(Date.Hour);
  81.                                                                  Write1302 (WRITE_PROTECT,0X00);         //禁止写保护
  82.                                                                Write1302 (WRITE_HOUR,Date.Hour);         //小时初始化
  83.                                                                 Write1302 (WRITE_PROTECT,0x80);                 //允许写保护
  84.                             }
  85.                             else if(flag2==3)
  86.                             {
  87.                                  Date.Year++;
  88.                                  if(Date.Year==80)
  89.                                                                  Date.Year=0;
  90.                                  Date.Year=dectobcd(Date.Year);
  91.                                                                  Write1302 (WRITE_PROTECT,0X00);         //禁止写保护
  92.                                                                Write1302 (WRITE_YEAR,Date.Year);         //年初始化
  93.                                                                 Write1302 (WRITE_PROTECT,0x80);                 //允许写保护
  94.                                  
  95.                             }
  96.                             else if(flag2==4)
  97.                             {
  98.                                  Date.Month++;
  99.                                  if(Date.Month==13)
  100.                                                                  Date.Month=0;
  101.                                  Date.Month=dectobcd(Date.Month);
  102.                                                                  Write1302 (WRITE_PROTECT,0X00);         //禁止写保护
  103.                                                                Write1302 (WRITE_MONTH,Date.Month);         //月初始化
  104.                                                                 Write1302 (WRITE_PROTECT,0x80);                 //允许写保护
  105.                             }
  106.                             else if(flag2==5)
  107.                             {
  108.                                        Date.Day++;
  109.                                       if(Date.Month==2)
  110.                                       {
  111.                                          if(Date.Day==29)
  112.                                             Date.Day=0;
  113.                                       }else  if(Date.Month==4 || Date.Month==6 || Date.Month==9  || Date.Month==11)
  114.                                       {
  115.                                          if(Date.Day==31)
  116.                                             Date.Day=0;
  117.                                       }
  118.                                       else
  119.                                       {
  120.                                          if(Date.Day==32)
  121.                                             Date.Day=0;
  122.                                       }
  123.                                  
  124.                                  Date.Day=dectobcd(Date.Day);
  125.                                                                  Write1302 (WRITE_PROTECT,0X00);         //禁止写保护
  126.                                                                Write1302 (WRITE_DAY,Date.Day);         //日初始化
  127.                                                                 Write1302 (WRITE_PROTECT,0x80);                 //允许写保护
  128.                                  
  129.                             }
  130.                             else if(flag2==6)
  131.                             {
  132.                                  SetTemp++;
  133.                                  LCD_SetTemp(1,1,SetTemp);
  134.                             }
  135.                         
  136.                                                                                    
  137.                          }                  
  138.                        
  139.                           
  140.             }
  141.                 if(s2==0)
  142.                 {
  143.                      Delay(1);
  144.                          if(s2==0)                                        //功能键
  145.                          {
  146.                                                     while(!s2);
  147.                             if(flag2==0)
  148.                             {
  149.                                 flag1=~flag1;
  150.                             }
  151.                             else if(flag2==1)
  152.                                                         {
  153.                                                              Date.Minute--;
  154.                                                                  if(Date.Minute==255)
  155.                                                                  Date.Minute=59;
  156.                                                                  Date.Minute=dectobcd(Date.Minute);
  157.                                                                  Write1302 (WRITE_PROTECT,0X00);         //禁止写保护
  158.                                                                Write1302 (WRITE_MINUTE,Date.Minute);         //分钟初始化
  159.                                                                 Write1302 (WRITE_PROTECT,0x80);                 //允许写保护
  160.                                                         } else if(flag2==2)
  161.                             {
  162.                                   Date.Hour--;
  163.                                                                   if(Date.Hour==255)
  164.                                                                   Date.Hour=23;
  165.                                                                   Date.Hour=dectobcd(Date.Hour);
  166.                                                                   Write1302 (WRITE_PROTECT,0X00);         //禁止写保护
  167.                                                                 Write1302 (WRITE_HOUR,Date.Hour);         //小时初始化
  168.                                                                  Write1302 (WRITE_PROTECT,0x80);                 //允许写保护
  169.                             }
  170.                             else if(flag2==3)
  171.                             {
  172.                                   Date.Year--;
  173.                                   if(Date.Year==255)
  174.                                                                   Date.Year=79;
  175.                                   Date.Year=dectobcd(Date.Year);
  176.                                                                   Write1302 (WRITE_PROTECT,0X00);         //禁止写保护
  177.                                                                 Write1302 (WRITE_YEAR,Date.Year);         //年初始化
  178.                                                                  Write1302 (WRITE_PROTECT,0x80);                 //允许写保护
  179.                             }
  180.                             else if(flag2==4)
  181.                             {
  182.                                  Date.Month--;
  183.                                  if(Date.Month==255)
  184.                                                                  Date.Month=12;
  185.                                  Date.Month=dectobcd(Date.Month);
  186.                                                                  Write1302 (WRITE_PROTECT,0X00);         //禁止写保护
  187.                                                                Write1302 (WRITE_MONTH,Date.Month);         //月初始化
  188.                                                                 Write1302 (WRITE_PROTECT,0x80);                 //允许写保护
  189.                             }
  190.                             else if(flag2==5)
  191.                             {
  192.                                             Date.Day--;
  193.                                             
  194.                                             if(Date.Month==2)
  195.                                             {
  196.                                                     if(Date.Day == 255)
  197.                                                     Date.Day=28;
  198.                                             }else  if(Date.Month==4 || Date.Month==6 || Date.Month==9  || Date.Month==11)
  199.                                             {
  200.                                                     if(Date.Day == 255)
  201.                                                     Date.Day=30;
  202.                                             }
  203.                                             else
  204.                                             {
  205.                                                     if(Date.Day == 255)
  206.                                                     Date.Day=31;
  207.                                             }
  208.                                        
  209.                                 
  210.                                  Date.Day=dectobcd(Date.Day);
  211.                                                                  Write1302 (WRITE_PROTECT,0X00);         //禁止写保护
  212.                                                                Write1302 (WRITE_DAY,Date.Day);         //天初始化
  213.                                                                 Write1302 (WRITE_PROTECT,0x80);                 //允许写保护
  214.                                  
  215.                             }
  216.                             else if(flag2==6)
  217.                             {
  218.                                    SetTemp--;
  219.                                 LCD_SetTemp(1,1,SetTemp);
  220.                             }
  221.                                                        
  222.                          }   
  223.             }
  224.                 if(s3==0)
  225.                 {
  226.                     Delay(1);
  227.                         if(s3==0)
  228.                         {
  229.                                 while(!s3);
  230.                                 flag2++;
  231.                                 if(flag2==7)
  232.                                 flag2=0;
  233.                         }
  234.                 }
  235.         switch(flag2)
  236.         {
  237.             case 0:Lcd1602_Write_Cmd(0x0c); break;//取消光标闪烁
  238.             case 1:LcdShowCursor(13,1) ; break;//光标闪烁
  239.             case 2:LcdShowCursor(10,1) ; break;//光标闪烁
  240.             case 3:LcdShowCursor(2,0) ; break;//光标闪烁
  241.             case 4:LcdShowCursor(5,0) ; break;//光标闪烁
  242.             case 5:LcdShowCursor(8,0) ; break;//光标闪烁
  243.             case 6:LcdShowCursor(3,1) ; break;//光标闪烁
  244.             
  245.         }
  246. }


  247. void Lcd_Ds1302_Display(unsigned char Hour,unsigned char Minute,unsigned char Second,unsigned char X,unsigned char Y)
  248. {
  249.             unsigned char Hour_Shi,Hour_Ge;
  250.             unsigned char Minute_Shi,Minute_Ge;
  251.             unsigned char Second_Shi,Second_Ge;
  252.             unsigned char tab[8];
  253.    
  254.             Hour_Shi   = Hour/10;
  255.             Hour_Ge    = Hour%10;
  256.             Minute_Shi = Minute/10;
  257.             Minute_Ge  = Minute%10;
  258.             Second_Shi = Second/10;
  259.             Second_Ge  = Second%10;
  260.    
  261.             
  262.                 tab[0] ='0'+Hour_Shi;
  263.                 tab[1] ='0'+Hour_Ge;
  264.                 tab[2] ='-';
  265.                 tab[3] ='0'+Minute_Shi;
  266.                 tab[4] ='0'+Minute_Ge;
  267.                 tab[5] ='-';
  268.                 tab[6] ='0'+Second_Shi;
  269.                 tab[7] ='0'+Second_Ge;
  270.            
  271.                     Lcd1602_Write_Cmd(0x0c); //取消光标闪烁
  272.                     LcdShowStr(X,Y,tab);
  273.                
  274.             
  275.    
  276. }
  277. void Lcd_Ds18b20_Display(unsigned char X,unsigned char Y,int i)
  278. {
  279.     unsigned char ge,shi,bai,qian;
  280.      unsigned char tab6[6];
  281.     if(flag2==0)
  282.     {
  283.     if(i>SetTemp*100)
  284.         ji_dian_qi=0;
  285.      else if(i<SetTemp*100)
  286.         ji_dian_qi=1;
  287.     }
  288.     if(i<0)
  289.     {
  290.         tab6[0] ='-';
  291.         i=-i;
  292.     }
  293.     else
  294.         tab6[0] ='+';

  295.       
  296.     ge =i%10;
  297.     shi=i/10%10;
  298.     bai=i/100%10;
  299.     qian=i/1000%10;

  300.         tab6[5] ='0'+ge;
  301.         tab6[4] ='0'+shi;
  302.         tab6[3] ='.';
  303.         tab6[2] ='0'+bai;
  304.         tab6[1] ='0'+qian;


  305.     Lcd1602_Write_Cmd(0x0c);//取消光标闪烁
  306.     LcdShowStr(X,Y,tab6);
  307. }
  308. void Init_Tim()
  309. {
  310.      TMOD=0X01;                                //启动定时器0为工作方式1
  311.          TH0=(65536-50000)/256;        //求模
  312.          TL0=(65536-50000)%256;        //求余
  313. ……………………

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

所有资料51hei提供下载:
LCD DS18B20.zip (157.35 KB, 下载次数: 95)




评分

参与人数 1黑币 +5 收起 理由
songjj6 + 5 赞一个!对我的学习很有帮助

查看全部评分

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

使用道具 举报

沙发
ID:313328 发表于 2018-5-8 18:03 | 只看该作者
很有用,值得借鉴
回复

使用道具 举报

板凳
ID:368293 发表于 2018-7-16 14:39 | 只看该作者
厉害,谢谢了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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