找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6815|回复: 5
收起左侧

电子钟加上温度显示,AT89C51+DS1302+DS18B20 六位数码管显示

[复制链接]
ID:75926 发表于 2015-4-3 01:16 | 显示全部楼层 |阅读模式
  1. /* 电子钟加上温度显示,AT89C51+DS1302+DS18B20  六位数码管显示,四位用于时间显示,两位用于温度显示
  2. 陈永飞同志于2016-2-13写,信箱:baiyoyni888@163.com  QQ:495204743
  3. 地址:江苏省仪征市 电话:13584816200
  4. 晶振用12MHz,数码管用共阳的*/
  5. #include<reg52.h>
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. #include"DS1302.h"
  9. #include"DS18B20.h"
  10. #define sec 0x80
  11. #define min 0x82
  12. #define hou 0x84
  13. #define read 0x01
  14. unsigned char hour,minute,second,id=0,timecount,re_disp=0,p,n0,n1;
  15. bit flag;
  16. #define leddata P0 //定义数码管的段选
  17. sbit ssw=P2^7;  //小时十位
  18. sbit sw=P2^6;  //小时个位
  19. sbit sfw=P2^5;  //分十位
  20. sbit fw=P2^4;  //分个位
  21. sbit wdsw=P2^3;  //温度十位
  22. sbit wdgw=P2^2;  //温度个位
  23. sbit DOWN=P2^1;  //加按键
  24. sbit UP=P2^0;  //减按键
  25. //sbit DQ=P3^0;  //DS18B20信号端
  26. //sbit T_CLK=P3^1; //DS1302的时钟端
  27. //sbit T_IO=P3^2; //DS1302的数据端
  28. //sbit T_RES=P3^3; //DS1302的复位端
  29. sbit SET=P3^4;  //时间设定键
  30. unsigned int ok;
  31. unsigned char code tab[]={0x48,0xEE,0x54,0xC4,0xE2,0xC1,0x41,0xEC,0x40,0xC0,0x60};
  32. unsigned char inittime[7]={0x00,0x00,0x12,0x16,0x11,0x06,0x04};
  33. //                          秒  分钟 小时  日   月   年  星期
  34. void Set_id(unsigned char sel,unsigned char sel_1);
  35. void delays(unsigned char k)
  36. {
  37. unsigned char i,j;
  38. for(i=0;i<k;i++)
  39.   for(j=0;j<50;j++);
  40. }
  41. void display(void)
  42. {
  43. if(flag&hour)  //为真时是设定时间
  44.   {
  45.    ssw=0;leddata=0xff;delays(10);ssw=1;
  46.    sw=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);sw=1;
  47.   }
  48. else   //为假时为正常走时
  49.   {
  50.    leddata=tab[Read1302(hou+1)/16];ssw=0;delays(10);ssw=1;
  51.    leddata=tab[Read1302(hou+1)%16]&~((unsigned char)~flag<<6);sw=0;delays(10);sw=1;
  52.   }
  53. if(flag&minute)
  54.   {
  55.    sfw=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);sfw=1;
  56.    fw=0;leddata=0xff;delays(10);fw=1;
  57.   }
  58. else
  59.   {
  60.    leddata=tab[Read1302(min+1)/16]&~((unsigned char)~flag<<6);sfw=0;delays(10);sfw=1;
  61.    leddata=tab[Read1302(min+1)%16];fw=0;delays(10);fw=1;
  62.   }
  63. TR0=0;  //关定时器
  64. ok=Read_Temperature();  //调用读温度函数
  65. TR0=1;  //开定时器
  66. p=(unsigned char)(ok>>4); //温度数据转换
  67. wdsw=0;leddata=tab[p%100/10];delays(10);wdsw=1; //温度显示十位
  68. wdgw=0;leddata=tab[p%10];delays(10);wdgw=1;  //温度显示个位
  69. }
  70. void id_case1_key(void)  //按键加减子程序
  71. {
  72. display();
  73.    if (!DOWN) //减少
  74.        {
  75.          while(!DOWN)display();
  76.    re_disp=0;
  77.       Set_id(id,0);   
  78.        }
  79.     if (!UP)  //增加
  80.        {
  81.          while(!UP)display();
  82.    re_disp=0;
  83.       Set_id(id,1);   
  84.        }
  85. }
  86. void Scan_Key(void)  //按键扫描程序
  87. {
  88. display();
  89. if(!SET)
  90.   {
  91.    while(!SET)display();
  92.    re_disp=0;
  93.    id++;if(id>2)id=0;
  94.   }
  95. if(id==0){hour=0;minute=0;second=0;}
  96. if(id==1){hour=1;id_case1_key();}
  97. if(id==2){hour=0;minute=1;id_case1_key();}
  98. // if(id==3){minute=0;second=1;id_case1_key();}
  99. }

  100. //根据选择调整相应项目并写入DS1302
  101. void Set_id(unsigned char sel,unsigned char sel_1)
  102. {
  103.    signed char max,mini,address,item;
  104. if(sel==1)  {address=hou; max=23;mini=0;}    //小时
  105. if(sel==2)  {address=min; max=59;mini=0;}    //分钟
  106.   // if(sel==3)  {address=sec; max=0;mini=0;}     //秒
  107.    item=Read1302(address+1)/16*10+Read1302(address+1)%16;
  108.    if (sel_1==0) item--;  else item++;
  109.   if(item>max) item=mini;  
  110.    if(item<mini) item=max;
  111. Write1302(0x8e,0x00);//允许写操作
  112.    Write1302(address,item/10*16+item%10);
  113.    Write1302(0x8e,0x80);//写保护,禁止写操作  
  114. }
  115. void main()
  116. {  TMOD=0x01;
  117.     TH0=(65535-50000)/256;
  118.     TL0=(65535-50000)%256;
  119.     EA=1;
  120.     ET0=1;
  121.   TR0=1;
  122.   Write1302(0x90,0xa5);//打开充电二级管  一个二级管串联一个2K电阻
  123.    Write1302(0x8e,0x80);//写保护,禁止写操作
  124.   if(!UP&!DOWN)Set1302(inittime);
  125.   adjust_res(0x7f); //调整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.125; 0x7f:0.0625
  126. while(1)
  127. {
  128.   Scan_Key();  //调用按键扫描程序
  129.   display();  //调用数码管显示程序
  130.    
  131. }
  132. }
  133. void t0(void) interrupt 1 using 0
  134. {
  135.    TH0=(65535-50000)/256; //50ms定时
  136.    TL0=(65535-50000)%256;  
  137.    timecount++;re_disp++;
  138.    if(timecount>9)
  139.      {
  140.    timecount=0;
  141.       flag=~flag;
  142.      }
  143. if(re_disp>200){re_disp=0;if(id)id=0;}
  144. }
复制代码


回复

使用道具 举报

ID:89183 发表于 2015-9-8 21:19 | 显示全部楼层
编译无法通过啊
回复

使用道具 举报

ID:89183 发表于 2015-9-8 21:19 | 显示全部楼层
编译无法通过啊
回复

使用道具 举报

ID:77498 发表于 2017-5-4 15:32 | 显示全部楼层
编译无法通过啊
回复

使用道具 举报

ID:143805 发表于 2017-5-8 20:06 来自手机 | 显示全部楼层
缺少1302和18b20的.h和.c文件
回复

使用道具 举报

ID:97811 发表于 2018-6-9 07:00 | 显示全部楼层
楼上说的对,这个应该是缺少文件的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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