找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3172|回复: 0
收起左侧

单片机ds1302+lcd1602校园作息时间系统Proteus仿真程序

[复制链接]
ID:262059 发表于 2020-3-1 16:57 | 显示全部楼层 |阅读模式
根据作息时间控制教师、宿舍、路灯、打铃
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
JPDU{M9(]VA5745UE0NTV8C.png IMG_5278(20200301-054027).PNG

单片机源程序如下:
  1. #include<reg52.h>
  2. #include <stdio.h>
  3. #include "ds1302.h"
  4. #include "delay.h"
  5. #include "1602.h"

  6. uchar ReadTimeFlag;
  7. bit   pace;
  8. uchar flag;

  9. sbit key1=P3^4;
  10. sbit key2=P3^5;
  11. sbit key3=P3^6;
  12. sbit key4=P3^7;

  13. sbit led1=P2^5;
  14. sbit led2=P2^6;
  15. sbit led3=P2^7;
  16. sbit bell=P2^4;  //0为响
  17. uchar  code time[]=
  18. {
  19. 6,30,
  20. 6,40,
  21. 7,10,
  22. 8,10,
  23. 9, 0,
  24. 9,10,
  25. 10,0,
  26. 10,15,
  27. 11,5,
  28. 11,10,
  29. 12,0,
  30. 14,40,
  31. 15,10,
  32. 15,40,
  33. 16,30,
  34. 19,0,
  35. 21,0,
  36. 23,0,
  37. };
  38. void Init_Timer0(void)
  39. {
  40.          TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
  41.          EA=1;            //总中断打开
  42.          ET0=1;           //定时器中断打开
  43.          TR0=1;           //定时器开关打开
  44. }
  45. void led()
  46. {        uchar i;
  47.   for(i=0;i<18;i++)
  48.    {
  49.           if(time_data[4]==time[2*i]&&time_data[5]==time[1+(2*i)]&&time_data[6]<=10)
  50.                 {
  51.                   bell=0;break;
  52.                         
  53.                 }
  54.                 else
  55.                 {
  56.                          bell=1;
  57.                 }
  58.          }        
  59. if(time_data[4]>=19&&time_data[4]<21&&time_data[5])
  60. {led1=0;led2=1;led3=0;return;}
  61. if(time_data[4]>=21&&time_data[4]<23)
  62. {led1=1;led2=0;led3=0;return;}
  63. if(time_data[4]>=23&&time_data[4]<24)
  64. {led1=1;led2=1;led3=1;return;}
  65. if(time_data[4]==6&&time_data[5]>=30&&time_data[5]<40)
  66. {led1=0;led2=0;led3=0;return;}
  67. if(time_data[4]==6&&time_data[5]>=40)
  68. {led1=0;led2=1;led3=0;return;}
  69. if(time_data[4]>=7&&time_data[5]>=10&&time_data[4]<19)
  70. {led1=1;led2=1;led3=1;return;}


  71. }
  72. void main (void)
  73. {        
  74.         LCD_Init();
  75. //        set_rtc();
  76.         Init_Timer0();

  77.         while (1)         //主循环
  78.         {
  79.           if(ReadTimeFlag)
  80.           {
  81.                 ReadTimeFlag=0;
  82.                 if(flag==0)
  83.                 {
  84.                   read_rtc();
  85.                   pace=0;
  86.                 }
  87. led();
  88.                 LCD_Write_String(0,0,"DATA:");
  89.                 LCD_Write_String(0,1,"TIME:");

  90.                 LCD_Write_String(5,0,"20");
  91.                 LCD_Write_String(9,0,"-");
  92.                 LCD_Write_String(12,0,"-");
  93.                 LCD_Write_String(8,1,"-");
  94.                 LCD_Write_String(11,1,"-");

  95.                 LCD_Write_Time(7,0,time_data[0]);        //年
  96.                 LCD_Write_Time(10,0,time_data[2]);        //月
  97.                 LCD_Write_Time(13,0,time_data[3]);        //日

  98.                 LCD_Write_Time(6,1,time_data[4]);        //时
  99.                 LCD_Write_Time(9,1,time_data[5]);        //分
  100.                 LCD_Write_Time(12,1,time_data[6]);        //秒
  101.                 if(pace)
  102.                 {
  103.                         switch(flag)
  104.                         {
  105.                                 case 1:LCD_Write_String(7,0,"  ");break;
  106.                                 case 2:LCD_Write_String(10,0,"  ");break;
  107.                                 case 3:LCD_Write_String(13,0,"  ");break;
  108.                                 case 4:LCD_Write_String(6,1,"  ");break;
  109.                                 case 5:LCD_Write_String(9,1,"  ");break;
  110.                                 case 6:LCD_Write_String(12,1,"  ");break;
  111.                                 case 7:set_rtc();flag=0;break;//模式7的时候为保存模式,将设置的时钟数据保存后直接退出设置模式
  112.                                 default:break;
  113.                         }
  114.                 }
  115.           }
  116.         }
  117. }



  118. void Timer0_isr(void) interrupt 1
  119. {
  120.         static unsigned int num;

  121.         static unsigned char key1num;//按键一按下标志
  122.         static unsigned char key2num;//按键二按下标志
  123.         static unsigned char key3num;//按键三按下标志
  124.         static unsigned char key4num;//按键三按下标志

  125.         TH0=(65536-2000)/256;                  //重新赋值 2ms
  126.         TL0=(65536-2000)%256;
  127.         
  128.         num++;
  129.         if(num==250)        //大致100ms
  130.         {
  131.                 num=0;
  132.                 if(flag)pace=!pace;
  133.                 ReadTimeFlag=1; //读标志位置1
  134.         }

  135.         
  136.         
  137.         if(key1==0)key1num=1;
  138.         else if(key1num==1)
  139.         {
  140.           key1num=0;
  141.           flag++;
  142.         }

  143.         if(key2==0)key2num=1;
  144.         else if(key2num==1)
  145.         {
  146.           key2num=0;
  147.           switch(flag)
  148.           {
  149.                   case 1:if(time_data[0]<99)time_data[0]++;break;
  150.                 case 2:if(time_data[2]<11)time_data[2]++;break;
  151.                 case 3:if(time_data[3]<31)time_data[3]++;break;
  152.                 case 4:if(time_data[4]<23)time_data[4]++;break;
  153.                 case 5:if(time_data[5]<59)time_data[5]++;break;
  154.                 case 6:if(time_data[6]<59)time_data[6]++;break;
  155.                 default:break;
  156.           }
  157.         }

  158. ……………………

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

所有资料51hei提供下载:
校园作息时间.zip (92.99 KB, 下载次数: 125)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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