找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6764|回复: 6
收起左侧

单片机电子时钟 闹钟程序lcd1602 ds1302 ds18b20温度传感器

  [复制链接]
ID:432572 发表于 2019-3-25 11:04 | 显示全部楼层 |阅读模式
单片机 电子时钟。这是一个完整的51单片机工程,里面包括 lcd1602 ds1302 ds18b20的综合应用。
有基本的时钟功能,还能通过按键设置时间及闹钟,另外,有温度传感器ds18b20测量温度,用1602显示

1.时钟有闹钟功能,当闹钟键按下时,闹钟启动。
2.只当设置键按下时,对当前时间进行设置,而设置与闹钟两个键同时按下时,对闹钟时间进行设置,不会影响到当前时间,不过当前时间会停,这里还不知道怎么解决。

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

  5. #define uint unsigned int
  6. #define uchar unsigned char

  7. uint b[6];
  8. //年月日时分秒

  9. uchar code row1[]={"2009-01-01"};
  10. uchar code row2[]={"00:00:00"};
  11. uchar year1[12]={31,28,31,30,31,30,31,31,30,31,30,31};//平年
  12. uchar year2[12]={31,29,31,30,31,30,31,31,30,31,30,31};//润年
  13. uchar j[6]={0x85,0x88,0x8b,0x84+0x40,0x87+0x40,0x8a+0x40};//LCD地址

  14. uchar i,k,jj=0,w,clock=0,bigclock=0,c=0,num;
  15. //i循环数  k温度缓存 jj地址位
  16. uint temp;

  17. sbit b1=P3^0;//设置
  18. sbit b2=P3^1;//上调
  19. sbit b3=P3^2;//下调
  20. sbit b4=P3^3;//转换
  21. sbit b5=P3^4;//闹钟
  22. sbit speaker=P3^5;

  23. lcdscan()
  24. {
  25.         for(i=0;i<6;i++)
  26.         {
  27.                 lcdwrite(j[i]);
  28.                 lcdshuju(a[11-i*2]+0x30);
  29.                 lcdwrite(j[i]+0x01);
  30.                 lcdshuju(a[10-i*2]+0x30);
  31.         }
  32. }

  33. void key()
  34. {
  35.         if(b1==0)
  36.         {
  37.                 dsaddshuju(0x80,(a[1]<<4)+a[0]+0x80);
  38.                 while(b1==0)
  39.                 {
  40.                         for(i=0;i<6;i++)
  41.                         {
  42.                                 b[i]=a[11-i*2+clock]*10+a[10-i*2+clock];
  43.                         }

  44.                         if(b4==0)
  45.                         {
  46.                                 delay(3);
  47.                                 jj++;
  48.                                 if(jj==6)
  49.                                 {
  50.                                         jj=0;
  51.                                 }
  52.                         }
  53.                         if(b2==0)
  54.                         {
  55.                                 delay(3);
  56.                                 b[jj]++;
  57.                                 if(b[5]==60)b[5]=0;
  58.                                 if(b[4]==60)b[4]=0;
  59.                                 if(b[3]==24)b[3]=0;
  60.                                 if((b[0]%4==0 && b[0]%100!=0) || b[0]%400==0){if(b[2]>year2[b[1]-1])b[2]=1;}
  61.                                 else {if(b[2]>year1[b[1]-1])b[2]=1;}
  62.                                 if(b[1]==13)b[1]=1;
  63.                                 if(b[0]==100)b[0]=0;
  64.                                
  65.                         }
  66.                         if(b3==0)
  67.                         {
  68.                                 delay(3);
  69.                                 b[jj]--;
  70.                                 if(b[5]==-1)b[5]=59;
  71.                                 if(b[4]==-1)b[4]=59;
  72.                                 if(b[3]==-1)b[3]=23;
  73.                                 if((b[0]%4==0 && b[0]%100!=0) || b[0]%400==0){if(b[2]<=0)b[2]=year2[b[1]-1];}
  74.                                 else {if(b[2]<=0)b[2]=year1[b[1]-1];}
  75.                                 if(b[1]==0)b[1]=12;
  76.                                 if(b[0]==-1)b[0]=99;
  77.                         }

  78.                         for(i=0;i<6;i++)
  79.                         {
  80.                                 a[11-i*2+clock]=b[i]/10;
  81.                                 a[10-i*2+clock]=b[i]%10;
  82.                         }

  83.                         lcdwrite(j[jj]);
  84.                         lcdshuju(0);
  85.                         lcdwrite(j[jj]+1);
  86.                         lcdshuju(0);
  87.                         delay(200);
  88.                         lcdwrite(j[jj]);
  89.                         lcdshuju(a[11-2*jj+clock]+0x30);
  90.                         lcdwrite(j[jj]+1);
  91.                         lcdshuju(a[10-2*jj+clock]+0x30);
  92.                         delay(200);
  93.                        
  94.                         if(b1==1)
  95.                         {
  96.                                 dsaddshuju(0x80,(a[1]<<4)+a[0]);
  97.                                 dson();
  98.                         }
  99.                         if(b5==0)clock=12;
  100.                 }
  101.         }
  102. }

  103. void main()
  104. {       
  105.         speaker=0;
  106.         lcdrw=0;
  107.         dson();
  108.         lcdon();
  109.         lcdwrite(0x83);
  110.         for(i=0;i<10;i++)
  111.         {
  112.                 lcdshuju(row1[i]);
  113.                 delay(1);
  114.         }
  115.         lcdwrite(0x84+0x40);
  116.         for(i=0;i<8;i++)
  117.         {
  118.                 lcdshuju(row2[i]);
  119.                 delay(1);
  120.         }
  121.         dsrst=0;
  122.         dssclk=0;
  123.         while(1)
  124.         {
  125.                 for(i=0;i<5;i++)
  126.                 {
  127.                         dsrst=1;
  128.                         dswrite(0x81+i*2);
  129.                         k=dsread();
  130.                         dsrst=0;
  131.                         a[i*2]=k&0x0f;
  132.                         a[i*2+1]=(k>>4)&0x0f;                       
  133.                 }
  134.                 dsrst=1;
  135.                 dswrite(0x8d);
  136.                 k=dsread();
  137.                 dsrst=0;
  138.                 a[10]=k&0x0f;
  139.                 a[11]=(k>>4)&0x0f;
  140.                
  141.                 delay(100);

  142.                 lcdscan();
  143.                 key();
  144.                 if(b5==0)
  145.                 {
  146.                         for(i=0;i<12;i++)
  147.                         {
  148.                                 if(a[i+12]==a[i])num++;
  149.                         }
  150.                         if(num==12)bigclock=1;
  151.                         else num=0;
  152.                         lcdwrite(0x8e);
  153.                         lcdshuju('&');
  154.                 }
  155.                 else
  156.                 {
  157.                         lcdwrite(0x8e);
  158.                         lcdshuju(0x00);
  159.                 }       
  160.                 if(bigclock==1)
  161.                 {
  162.                         speaker=1;
  163.                         c++;
  164.                         if(c==100){bigclock=0;speaker=0;}
  165.                 }
  166.                 temp=readtemperature();//temp是uint型的。不然会出现温度到25后回00的现象。可能是由于十六进制与十进制的差异。
  167.                 lcdwrite(0x8d+0x40);
  168.                 lcdshuju(temp/100+0x30);
  169.                 lcdwrite(0x8e+0x40);
  170.                 lcdshuju(temp/10%10+0x30);
  171.         }
  172. }
复制代码

所有资料51hei提供下载:
电子时钟 lcd1602 ds1302 ds18b20 闹钟.zip (52.01 KB, 下载次数: 210)

评分

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

查看全部评分

回复

使用道具 举报

ID:504761 发表于 2019-4-5 14:06 | 显示全部楼层
为啥有重复定义的IO口,而且还有三个警告没有返回值,程序的下载没有问题链接电路也检查没有问题,为啥1602只显示一个半的框框
回复

使用道具 举报

ID:426567 发表于 2019-4-17 12:24 | 显示全部楼层
感谢楼主
回复

使用道具 举报

ID:469510 发表于 2019-5-13 16:02 | 显示全部楼层
很给力!
回复

使用道具 举报

ID:568900 发表于 2019-6-21 15:35 | 显示全部楼层
这么nb
回复

使用道具 举报

ID:846185 发表于 2020-11-23 14:00 | 显示全部楼层
根本不显示我都怀疑这写的吗
回复

使用道具 举报

ID:847794 发表于 2020-11-23 14:23 | 显示全部楼层
这个程序写的很好,再加点霍尔细节就完美了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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