找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5046|回复: 4
收起左侧

12864 ds1302时间和ds18b20温度仿真图+源程序

  [复制链接]
ID:263655 发表于 2018-5-30 23:14 | 显示全部楼层 |阅读模式
12864液晶ds1302时间和ds18b20温度程序仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:
  1. #include <reg51.h>
  2. #include <ds18b20.h>
  3. #include <word.h>
  4. #include <12864display.h>
  5. #include <ds1302.h>

  6. //声明外部温度读数数组
  7. extern unsigned char data temperature[2];
  8. //声明外部高低温报警
  9. extern char Alarm_Temp_HL[2];

  10. //存放分解的7个ASCII码温度数据  
  11. unsigned char temp[7];

  12. bit HI_Alarm = 0,LO_Alarm = 0;         //高温低温报警标志位
  13. sbit HI_LED = P1^4;                                    //高温报警灯
  14. sbit LO_LED = P1^5;                                    //低温报警灯
  15. sbit BUZZER = P2^6;                                    //喇叭
  16. sbit button = P1^0;                                    //按钮切换显示

  17. sbit button_shi=P1^1;                         //调节时
  18. sbit button_fen=P1^2;                         //分
  19. sbit button_miao=P1^3;                         //秒
  20. sbit button_year=P1^6;                         //年
  21. sbit button_month=P1^7;                         //月
  22. sbit button_day=P3^0;                         //日
  23. sbit button_week=P3^7;                         //星期
  24. //按钮的7个变量
  25. unsigned char count1,count2,count3,count4,count5,count6,count7;

  26. //根据输入的tem在12864的第1行的pos位置显示相应的0~9
  27. void trans(unsigned char hang,unsigned char tem,unsigned int pos)
  28. {
  29.         switch(tem)
  30.         {
  31.                 case '0':vShowOneChar(hang,pos,uca_0);break;
  32.                 case '1':vShowOneChar(hang,pos,uca_1);break;
  33.                 case '2':vShowOneChar(hang,pos,uca_2);break;
  34.                 case '3':vShowOneChar(hang,pos,uca_3);break;
  35.                 case '4':vShowOneChar(hang,pos,uca_4);break;
  36.                 case '5':vShowOneChar(hang,pos,uca_5);break;
  37.                 case '6':vShowOneChar(hang,pos,uca_6);break;
  38.                 case '7':vShowOneChar(hang,pos,uca_7);break;
  39.                 case '8':vShowOneChar(hang,pos,uca_8);break;
  40.                 case '9':vShowOneChar(hang,pos,uca_9);break;
  41.                 default:break;
  42.         }
  43. }

  44. //l2864显示
  45. void display()          
  46. {
  47.          unsigned char temp_data,temp_data2;
  48.          unsigned int TempDec;        //用来存放4位小数
  49.          temp_data = temperature[1]&0xf8;//取高5位
  50.                 
  51.          if (temp_data==0xf8)        //负温度读数
  52.          {       
  53.                 temperature[0]=~temperature[0]+1;
  54.                 temperature[1]=~temperature[1];
  55.                 if (temperature[0]==0x00)
  56.                         temperature[1]++;
  57.                 temp_data = (temperature[1]&0x07)<<4;                //取高字节低3位(温度读数高3位)       
  58.             temp_data2 = (temperature[0]&0xf0)>>4;        //取低字节高4位(温度读数低4位)
  59.             temp_data= temp_data|temp_data2;        //组合成完整数据                       
  60.                 if(temp_data>=Alarm_Temp_HL[1])
  61.                 {
  62.                         TF0=1;
  63.                         LO_Alarm=1;
  64.                         HI_Alarm=0;
  65.                 }
  66.                 else
  67.                 {
  68.                         TF0=1;
  69.                         LO_Alarm=0;
  70.                         HI_Alarm=0;
  71.                 }
  72.                 vShowOneChar(0,40,uca_fu);
  73.         }
  74.          else
  75.          {
  76.                 temp_data = (temperature[1]&0x07)<<4;                //取高字节低3位(温度读数高3位)       
  77.             temp_data2 = (temperature[0]&0xf0)>>4;        //取低字节高4位(温度读数低4位)
  78.             temp_data= temp_data|temp_data2;        //组合成完整数据
  79.                 if(temp_data>=Alarm_Temp_HL[0])
  80.                 {
  81.                     TF0=1;
  82.                         HI_Alarm=1;
  83.                         LO_Alarm=0;
  84.                 }
  85.                 else
  86.                 {
  87.                         TF0=1;
  88.                         HI_Alarm=0;
  89.                         LO_Alarm=0;
  90.                 }
  91.                  vShowOneChar(0,40,uca_zheng);
  92.          }

  93.         temp[0] = temp_data/100+0x30;                 //取百位转换为ASCII码
  94.         temp[1] = (temp_data%100)/10+0x30;         //取十位转换为ASCII码
  95.         temp[2] = (temp_data%100)%10+0x30;         //取个位转换为ASCII码

  96.         temperature[0]&=0x0f;                                 //取小数位转换为ASCII码
  97.         TempDec = (temperature[0]*0.0625)*10000;//小数部分,扩大1万倍,1/16,最低分辨率 取四位小数

  98.         temp[3]        = TempDec/1000+0x30;                 //取小数个位转换为ASCII码
  99.         temp[4]        = (TempDec%1000)/100+0x30;         //取小数十位转换为ASCII码
  100.         temp[5]        = ((TempDec%1000)%100)/10+0x30;//取小数百位转换为ASCII码
  101.         temp[6] = ((TempDec%1000)%100)%10+0x30;//取小数千位转换为ASCII码

  102.         trans(0,temp[0],48);
  103.         trans(0,temp[1],56);
  104.         trans(0,temp[2],64);
  105.         vShowOneChar(0,72,uca_dian); //小数点
  106.         trans(0,temp[3],80);
  107.         trans(0,temp[4],88);
  108.         trans(0,temp[5],96);
  109.         trans(0,temp[6],104);
  110. }

  111. //中断,温度过高过低对应的灯亮
  112. void T0_INT() interrupt 1
  113. {
  114.         TF0=0;
  115.         if(HI_Alarm)
  116.         {
  117.                 HI_LED=0;
  118.                 BUZZER=1;
  119.         }
  120.         else
  121.         {
  122.                 HI_LED=1;
  123.         }
  124.         if(LO_Alarm)
  125.         {
  126.                 LO_LED=0;
  127.                 BUZZER=1;
  128.         }
  129.         else
  130.         {
  131.                 LO_LED=1;
  132.         }
  133. }

  134. void show_time(unsigned char time,unsigned char hang,unsigned char pos1,unsigned char pos2)
  135. {
  136.         unsigned char i,j;
  137.         i=time/10+0x30;
  138.         j=time%10+0x30;
  139.         trans(hang,i,pos1);
  140.         trans(hang,j,pos2);
  141. }

  142. //主函数
  143. void main()
  144. {
  145.         unsigned char shi,fen,miao,year,month,day,week;
  146.         DS1820_Reset();//DS1820初始化
  147.         Set_Alarm_Temp_Value();
  148.         IE=0x82;TMOD=0x02;        //开中断
  149.         vLCDInitialize();       
  150.         delay100us();
  151.         while(button==1)
  152.         {
  153.                  vShowOneChin(6,16,uca_kb);
  154.                 vShowOneChin(6,32,uca_kb);
  155.                 vShowOneChin(6,80,uca_kb);
  156.                 vShowOneChin(6,96,uca_kb);

  157.                 vShowOneChin(4,32,uca_kb);
  158.                 vShowOneChin(4,48,uca_kb);
  159.                 vShowOneChin(4,64,uca_kb);
  160.                 vShowOneChin(4,80,uca_kb);
  161.                 vShowOneChin(4,16,uca_kb);
  162.                 vShowOneChin(4,96,uca_kb);

  163.                 vShowOneChin(2,32,uca_kb);
  164.                 vShowOneChin(2,48,uca_kb);
  165.                 vShowOneChin(2,64,uca_kb);
  166.                 vShowOneChin(2,80,uca_kb);
  167.                
  168.                 vShowOneChin(0,0,uca_wen);
  169.                 vShowOneChin(0,16,uca_du);
  170.                 vShowOneChar(0,32,uca_mh);
  171.                 vShowOneChar(0,112,uca_o);
  172.                 vShowOneChar(0,120,uca_C);
  173.                 read_temp(); //读取温度值
  174.                 delay100us();               
  175.                 display();         //显示温度值
  176.                 delay100us();
  177.                 BUZZER=0;
  178.         }
  179.        
  180.         while(button==0)
  181.         {
  182.         //判断按键
  183.                  if(button_shi==0)
  184.                  {
  185.                           while(button_shi==0);
  186.                          count1++;
  187.                  }
  188.                  if(button_fen==0)
  189.                  {
  190.                           while(button_fen==0);
  191.                          count2++;
  192.                  }
  193.                  if(button_miao==0)
  194.                  {
  195.                           while(button_miao==0);
  196.                          count3++;
  197.                  }
  198.                  if(button_year==0)
  199.                  {
  200.                           while(button_year==0);
  201.                          count4++;
  202.                  }
  203.                  if(button_month==0)
  204.                  {
  205.                           while(button_month==0);
  206.                          count5++;
  207.                  }
  208.                  if(button_day==0)
  209.                  {
  210.                           while(button_day==0);
  211.                          count6++;
  212.                  }
  213.                  if(button_week==0)
  214.                  {
  215.                           while(button_week==0);
  216.                          count7++;
  217.                  }

  218.                  shi=ReadSet1302(0x85);
  219.                  shi=((shi&0x70)>>4)*10+(shi&0x0f)+count1;           //高三个字节是十位,低4个字节为个位
  220.                  if(shi>=24)
  221.                          shi=shi-24;

  222.                  fen=ReadSet1302(0x83);
  223.                  fen=((fen&0x70)>>4)*10+(fen&0x0f)+count2;
  224.                  if(fen>=60)
  225.                          fen=fen-60;

  226.                  miao=ReadSet1302(0x81);
  227.                  miao=((miao&0x70)>>4)*10+(miao&0x0f)+count3;
  228.                  if(miao>=60)
  229.                          miao=miao-60;

  230.                  year=ReadSet1302(0x8d);
  231.                  year=((year&0x70)>>4)*10+(year&0x0f)+count4;

  232.                  month=ReadSet1302(0x89);
  233.                  month=((month&0x70)>>4)*10+(month&0x0f)+count5;
  234.                  if(month>=13)
  235.                          month=month-12;

  236.                  day=ReadSet1302(0x87);
  237.                  day=((day&0x70)>>4)*10+(day&0x0f)+count6;
  238.                  if(day>=32)
  239.                          day=day-31;

  240.                  week=ReadSet1302(0x8b);
  241.                  week=((week&0x70)>>4)*10+(week&0x0f)+0x30+count7;
  242.                  if(week>=0x38)
  243.                  {
  244.                          week=week-0x07;
  245.                          count7=0;
  246.                  }
  247.                  if(week==0x31)
  248.                  week=week+6;
  249. ……………………

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

所有资料51hei提供下载:
12864ds1302时间和ds18b20温度程序和仿真图.zip (235.82 KB, 下载次数: 198)
回复

使用道具 举报

ID:638447 发表于 2019-11-26 15:48 | 显示全部楼层
12864不显示啊
回复

使用道具 举报

ID:262059 发表于 2019-11-26 18:41 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

ID:585983 发表于 2021-3-17 17:38 | 显示全部楼层
有bug啊,23.59.59之后就是23.60.00了
回复

使用道具 举报

ID:402026 发表于 2021-3-27 14:53 | 显示全部楼层
做的非常棒!非常不错!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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