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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3992|回復: 2
收起左側

多功能萬年歷DS1302+DS18B20+繼電器仿真與與源碼

[復制鏈接]
ID:154783 發表于 2018-5-7 15:47 | 顯示全部樓層 |閱讀模式
這是我前段時間弄好的,現在整理一下,分享給大家里面包含源程序和仿真。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png 0.png

單片機源程序如下:
  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 贊一個!對我的學習很有幫助

查看全部評分

回復

使用道具 舉報

ID:313328 發表于 2018-5-8 18:03 | 顯示全部樓層
很有用,值得借鑒
回復

使用道具 舉報

ID:368293 發表于 2018-7-16 14:39 | 顯示全部樓層
厲害,謝謝了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 超碰最新在线 | 欧美一级三级在线观看 | 国产在线观看不卡一区二区三区 | 国产一级片一区二区三区 | 日韩中文字幕在线播放 | 午夜日韩| 久久精品国产久精国产 | 国产精品久久 | 久久激情网 | 精品久久久久久久久久久久久久久久久 | av毛片在线免费观看 | www中文字幕 | 亚洲永久 | 成人精品鲁一区一区二区 | 国产精品揄拍一区二区 | 91久久国产综合久久 | 久久精品国产一区二区电影 | 午夜免费电影 | 国产精品亚洲视频 | 日日摸夜夜添夜夜添精品视频 | 成人二区 | 久久一区二区三区四区 | 午夜寂寞影院列表 | 久久综合av | 国产伦精品一区二区三区精品视频 | 亚洲狠狠丁香婷婷综合久久久 | 国产成人jvid在线播放 | 91视频精选 | 久久蜜桃av一区二区天堂 | 91一区二区三区在线观看 | 一级毛片视频在线观看 | 久久久久久九九九九九九 | 国产 日韩 欧美 在线 | 特黄视频 | 亚洲网在线 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 天天av网| 韩日在线 | 欧美日高清视频 | 国产成人精品久久 | 亚洲欧美一区二区三区国产精品 |