找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机主控,ds1302、dht11模块,按键控制调制时间,实时显示时间的温度 Proteus仿真

[复制链接]
跳转到指定楼层
楼主
51单片机主控,ds1302、dht11模块,按键控制调制时间,实时显示时间的温度
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <REG52.H>
  2. #include "lcd1602.h"
  3. #include <string.h>
  4. #include <intrins.h>
  5. #include "KEY.H"
  6. #include <ds18b20.h>
  7. #include "1302.h"

  8. #include "config.h"
  9. /*********定义变量*********/

  10. uchar buff[16];
  11. uint Y=0,M=0,D=0,H=0,F=0,S=0,W=0;
  12. uchar T18B20=0;

  13. uchar ADDR=0;
  14. bit SetState=0;
  15. sbit led = P2^7;

  16. /*=====1602显示======*/
  17. void LCD_DISPLAY()
  18. {
  19.         T18B20=(retemp());       //18B20温度采集数值
  20.        
  21.         Y = (TIME[6]/16*10)+(TIME[6]&0X0F);
  22.         M = (TIME[4]/16*10)+(TIME[4]&0X0F);
  23.         D = (TIME[3]/16*10)+(TIME[3]&0X0F);
  24.        
  25.         W = ((TIME[5]/16*10)+(TIME[5]&0X0F)%7);
  26.        
  27.         H = (TIME[2]/16*10)+(TIME[2]&0X0F);
  28.         F = (TIME[1]/16*10)+(TIME[1]&0X0F);
  29.         S = (TIME[0]/16*10)+(TIME[0]&0X0F);
  30.        
  31.        
  32.         sprintf(buff,"20%02d-%02d-%02d",(int)Y,(int)M,(int)D);
  33.         print(1,1,buff);
  34.        
  35.         sprintf(buff,"%02d:%02d:%02d",(int)H,(int)F,(int)S);
  36.         print(2,1,buff);
  37.        
  38.         sprintf(buff,"T:%02dC",(int)T18B20);
  39.         print(2,12,buff);
  40.        
  41.         switch(W)
  42.         {
  43.                 case 0:print(1,12,"SUM");break;
  44.                 case 1:print(1,12,"MON");break;
  45.                 case 2:print(1,12,"TUE");break;
  46.                 case 3:print(1,12,"WED");break;
  47.                 case 4:print(1,12,"THU");break;
  48.                 case 5:print(1,12,"RFI");break;
  49.                 case 6:print(1,12,"STA");break;
  50.                
  51.                 default :break;
  52.         }
  53.        
  54. }


  55. void Int0Configuration()
  56. {
  57.         //设置INT0
  58.         IT0=1;//跳变沿出发方式(下降沿)
  59.         EX0=1;//打开INT0的中断允许。
  60. }
  61. /*******************************************************************************
  62. * 函数名         : Int0()
  63. * 函数功能                   : 外部中断0 中断函数
  64. * 输入           : 无
  65. * 输出                  : 无
  66. *******************************************************************************/

  67. void Int0() interrupt 0                 
  68. {
  69.         if(K6_F==1)
  70.         {
  71.                 K6_F=0;
  72.                 SetState=~SetState;
  73.                 Ds1302Init();       
  74.         }
  75. }


  76. /*========时间更改==========*/
  77. void TIMER_CHANGE()
  78. {
  79.        
  80.          if(K4_F==1)                //检测按键K4是否按下
  81.                 {       
  82.                         K4_F = 0;
  83.                         ADDR++;
  84.                         if(ADDR>=7)
  85.                         ADDR=0;                                       
  86.                 }
  87.                 else if(K3_F==1)                //检测按键K3是否按下
  88.                 {       
  89.                         K3_F = 0;
  90.                         ADDR--;
  91.                         if(ADDR<0)
  92.                         ADDR=7;                                       
  93.                 }
  94.                
  95.                 if((K2_F==1)||(K1_F==1))                //检测按键K2或者k1是否按下
  96.                 {
  97.                         if(K2_F==1)
  98.                         {
  99.                                 K2_F=0;
  100.                                 TIME[ADDR]++;
  101.                                 if((TIME[ADDR]&0X0F)>9)
  102.                                 {
  103.                                         TIME[ADDR] = TIME[ADDR]+6;
  104.                                 }
  105.                         }
  106.                         else if(K1_F==1)
  107.                         {
  108.                                 K1_F=0;
  109.                                 TIME[ADDR]--;
  110.                                 if((TIME[ADDR]&0X0F)>9)
  111.                                 {
  112.                                         TIME[ADDR] = TIME[ADDR]-6;
  113.                                 }
  114.                                
  115.                         }
  116.                 }
  117.                
  118.                 if((ADDR<2)&&(TIME[ADDR]>=0x60))  //分不能超60
  119.                 {
  120.                         TIME[ADDR] = 0;
  121.                 }
  122.                 else if(ADDR==2&&TIME[ADDR]>=0x24)   //小时不能超24
  123.                 {
  124.                         TIME[ADDR] = 0;
  125.                 }
  126.                 else if(ADDR==3&&TIME[ADDR]>=0x32)   //day不能超31
  127.                 {
  128.                         TIME[ADDR] = 1;
  129.                 }
  130.                 else if(ADDR==4&&TIME[ADDR]>=0x13)   //月分<=12
  131.                 {
  132.                         TIME[ADDR] = 1;
  133.                 }
  134.                 else if(ADDR==0&&TIME[ADDR]>=0x07)   //星期<=7
  135.                 {
  136.                         TIME[ADDR] = 1;
  137.                 }
  138.                        
  139.                 Ds1302Write(ADDR,TIME[ADDR]);       
  140.                
  141.                
  142.                 switch(ADDR)
  143.                 {
  144.                         case 0:print(2,10,"S ");break;   //second
  145.                         case 1:print(2,10,"F ");break;   //Minute
  146.                         case 2:print(2,10,"H ");break;   //Hour
  147.                         case 3:print(2,10,"D ");break;   //DAY
  148.                         case 4:print(2,10,"M ");break;   //MONTH
  149.                         case 5:print(2,10,"W ");break;   //WEEK
  150.                         case 6:print(2,10,"Y ");break;   //YEAR
  151.                         default :break;
  152.                 }       
  153. }



  154. /*******主函数*******/
  155. void main() //int a   
  156. {
  157.         uchar kkk = 55;
  158.         Int0Configuration();
  159.         lcd_init();
  160.         lcd_clear();
  161.         EA=1;   //总中断
  162.        
  163.         while(1)
  164.         {
  165.                
  166.                 KEY_SCAN();
  167.                
  168.                 if(SetState==0)
  169.                 {
  170.                         Ds1302ReadTime();
  171.                         print(2,10," ");
  172.                 }
  173.                 else
  174.                 {
  175.      TIMER_CHANGE();       
  176.                 }
  177.     LCD_DISPLAY();
  178.                
  179.                 if(K5_F==1)
  180.                 {
  181.                         K5_F=0;
  182.                         led = ~led;
  183.                        
  184.                 }
  185.         }
  186.        
  187. }
复制代码

Keil代码与Proteus仿真下载(注意要双击单片机芯片,重新选择hex文件的路径才行):
万年历好使.zip (153.66 KB, 下载次数: 44)


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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