找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机lcd12864大数字+ds1302+时间可调+闹钟 Proteus仿真程序

  [复制链接]
跳转到指定楼层
楼主
单片机大数字时钟仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg51.h>
  2. #include "DS18B20.h"
  3. #include "DS1302.h"
  4. #include "LCD12864.h"

  5. char a;
  6. sbit KEY6=P3^4;
  7. sbit KEY2=P3^5;
  8. sbit KEY3=P3^6;
  9. sbit KEY4=P3^7;
  10. sbit KEY5=P3^3;

  11. bit  flag=1; //进入/退出设置标志
  12. uchar  choose=0x01; //切换标志
  13. void delay10(void) //延时10ms
  14. {
  15.         unsigned char i,j;
  16.         for(i=0;i<255;i++)
  17.         for(j=0;j<200;j++);
  18. }
  19. void delay5ms(void)   //误差 0us
  20. {
  21.     unsigned char a,b;
  22.     for(b=19;b>0;b--)
  23.         for(a=130;a>0;a--);
  24. }

  25. //设置时ds1302寄存器值循环 如秒寄存器59时加一变为00
  26. unsigned char conver(unsigned char a,unsigned char b,unsigned char c)
  27. {        

  28.         if((a&0x0f)==0x0a) a=a+6;
  29.           if(a==b)  a=c;
  30.         return a;  
  31. }

  32. void digplay() {

  33.         //时间
  34.                 ShowNumber16_32(2,0,TIME[2]>>4&0x03); //时 十位
  35.                 ShowNumber16_32(2,16, TIME[2]&0x0f);//时  个位
  36.         ShowChina(2,33,18);
  37.                  ShowNumber16_32(2,48,TIME[1]>>4&0x07);//分  十位
  38.                 ShowNumber16_32(2,64, TIME[1]&0x0f);//分  个位
  39.         ShowChina(2,81,18);
  40.                 ShowNumber16_32(2,96,TIME[0]>>4&0x07);//秒 十位  0000 0111
  41.                 ShowNumber16_32(2,112, TIME[0]&0x0f);//秒  个位
  42.                
  43.                
  44.                 //日期
  45.                 ShowNumber(0,0,2);
  46.                 ShowNumber(0,8,0);
  47.     ShowNumber(0,16,TIME[6]>>4&0x0f);
  48.           ShowNumber(0,24, TIME[6]&0x0f);//年
  49.         ShowNumber(0,32,11);
  50.                
  51.           ShowNumber(0,40,TIME[4]>>4&0x01);
  52.           ShowNumber(0,48, TIME[4]&0x0f);//月
  53.         ShowNumber(0,56,11);               
  54.                 ShowNumber(0,64,TIME[3]>>4&0x03);
  55.                 ShowNumber(0,72, TIME[3]&0x0f);//日

  56.           ShowChina(0,112,(TIME[5]&0x07)-1);//周
  57. }
  58. void wendu() {
  59.                 //温度
  60.                 a=Read_Temperature();          //读取DS18B20的温度
  61.                 if(a<0)                                          //处理温度正负
  62.                 {        
  63.                                 a = (-1)*a;         // 取补
  64.                                 ShowNumber(6,88,11);          //温度计图标—
  65.                  }
  66.                  else
  67.                 {
  68.                                          ShowNumber(6,88,12);//温度计图标+
  69.                  }
  70.                 ShowNumber(6,96,a/10%10);  //显示温度中位
  71.            
  72.                 ShowNumber(6,104,a%10);           //显示温度低位
  73.                
  74.                 ShowChina(6,112,8);//显示 .C
  75. }

  76. void digplaystart() {//开机显示
  77.         uchar i=0;
  78.                 ShowChina(2,64-16*1.5,19);
  79.                 ShowChina(2,64-16*0.5,20);
  80.                 ShowChina(2,64+16*0.5,21);
  81.                 ShowChina(2,64+16*1.5,22);
  82.         for (i=0;i<10;i++) {
  83.         ShowNumber(4,32+8*i,16);           
  84.                 delay5ms();
  85.                 delay5ms();
  86.         }
  87.         ClearScreen(0);//清屏
  88. }
  89. void InitTimer0(void) //1ms
  90. {
  91.     TMOD = 0x01;
  92.     TH0 = 0x0FC;
  93.     TL0 = 0x18;
  94.     EA = 1;
  95.     ET0 = 1;
  96.     TR0 = 0;
  97. }
  98. unsigned int count =0;
  99. void main(void)
  100. {        char  swh = 0;
  101.         char  year= 20;
  102.         char  week= 0x04;
  103.         char  month= 0x20;
  104.         char  day= 0x04;        
  105.         char  hour= 0x20;
  106.         char  div= 0x04;        
  107.         char  second= 0x20;        
  108.         char n_hour = 1;
  109.         char n_div = 30;
  110.         char n_falg=0;
  111.         unsigned char month_x=  0,day_x=0,hour_x = 0 ,div_x = 0,year_x = 0;
  112.         char djs_flag = 0;
  113.         char djs_stop_flag=1;
  114.         char djs = 60;
  115.         int time=0;
  116.           InitLCD();          //初始化LCD12864
  117.         //Ds1302Init();//Ds1302初始化,并且附上设定的默认时间
  118.                 Ds1302ReadTime();
  119.           Ds1302WriteTime();
  120.         //set_DS1302_time(0x20,0x04,0x20, 0x04,0x20,0x04,0x20);
  121.         //InitTimer0();
  122.         
  123.         while(1)
  124.         {
  125.    //ShowNumber(6,32,9);
  126.                 // wendu();
  127.                 //Ds1302ReadTime();
  128.                 //digplay();
  129.                 if ( KEY2 == 0 )
  130.                 {
  131.                         swh ++;
  132.                         while(!KEY2);
  133.                 }
  134.                 if(swh >8 ) swh = 0;
  135.                
  136.                 if( swh == 0 )
  137.                 {   
  138.                                 ShowNumber(6,20,15);
  139.                           ShowNumber(6,32,11); ShowNumber(6,40,11);
  140.                                 Ds1302ReadTime();
  141.                     digplay();
  142. //========判断 闹钟
  143.                         if((TIME[2]>>4&0x03) == (n_hour/10) &&  (TIME[2]&0x0f)  == n_hour%10 && (TIME[1]>>4&0x07) == n_div/10 &&  (TIME[1]&0x0f) == n_div%10)
  144.                         {
  145.                                 {
  146.                                   n_falg ++;
  147.                                                 if(n_falg%2==0 )
  148.                                                 {
  149.                                                         ShowNumber(6,75,n_hour/10); //时 十位
  150.                                                         ShowNumber(6,83,n_hour%10);//时  个位
  151.                                                         ShowNumber(6,91,10);
  152.                                                         ShowNumber(6,99,n_div/10);//分  十位
  153.                                                         ShowNumber(6,107,n_div%10);//分  个
  154.                                                 }
  155.                                         if(n_falg%2==1 )
  156.                                                 {
  157.                                                         ShowNumber(6,73,n_hour/10); //时 十位
  158.                                                         ShowNumber(6,81,n_hour%10);//时  个位
  159.                                                         ShowNumber(6,89,10);
  160.                                                         ShowNumber(6,97,n_div/10);//分  十位
  161.                                                         ShowNumber(6,105,n_div%10);//分  个
  162.                                                 }                                                
  163.                                 }
  164.                         }
  165.                 }
  166.                         
  167.                         
  168.                 if(swh == 1 )//设置年
  169.                 {
  170.                         ShowChina(6,32,9);
  171.                         if(KEY3 == 0)
  172.                         {
  173.                                 year ++;
  174.                                 while(!KEY3);
  175.                         }
  176.                         if(KEY4 == 0)
  177.                         {
  178.                                 year --;
  179.                                 while(!KEY4);
  180.                         }
  181.                         year = year >80?80:year;
  182.                         year = year <1?1:year;
  183.                         year_x =((year/10)<<4)|(year%10)        ;
  184.                         //        set_DS1302_time(year_x,week,month_x, day_x,hour_x,div_x,0x00);
  185.                                 digplay();
  186.                  }
  187.                
  188.                                 if(swh == 2 )//设置星期
  189.                         {
  190.                         ShowChina(6,32,10);
  191.                         if(KEY3 == 0)
  192.                         {
  193.                                 week ++;
  194.                                 while(!KEY3);
  195.                         }
  196.                         if(KEY4 == 0)
  197.                         {
  198.                                 week --;
  199.                                 while(!KEY4);
  200.                         }
  201.                         week= week > 7 ?7:week;
  202.                         week= week < 1 ?1:week;
  203.                 //        set_DS1302_time(year_x,week,month_x, day_x,hour_x,div_x,0x00);
  204.                                 digplay();
  205.                         }
  206.                         
  207.                         if(swh == 3 )//设置月
  208.                         {
  209.                         ShowChina(6,32,11);
  210.                         if(KEY3 == 0)
  211.                         {
  212.                                 month ++;
  213.                                 while(!KEY3);
  214.                         }
  215.                         if(KEY4 == 0)
  216.                         {
  217.                                 month --;
  218.                                 while(!KEY4);
  219.                         }
  220.                         month = month >12?12:month;
  221.                         month = month <1?1:month;
  222.                         month_x=((month/10)<<4)|(month%10)        ;
  223.                 //        set_DS1302_time(year_x,week,month_x, day_x,hour_x,div_x,0x00);
  224.                                 digplay();
  225.                         }
  226.                         if(swh == 4 )//设置日
  227.                 {
  228.                         ShowChina(6,32,12);
  229.                         if(KEY3 == 0)
  230.                         {
  231.                                 day ++;
  232.                                 while(!KEY3);
  233.                         }
  234.                         if(KEY4 == 0)
  235.                         {
  236.                                 day --;
  237.                                 while(!KEY4);
  238.                         }
  239.                         day = day >31?31:day;
  240.                         day = day <1?1:day;
  241.                         day_x=((day/10)<<4)|(day%10)        ;
  242.                         //        set_DS1302_time(year_x,week,month_x, day_x,hour_x,div_x,0x00);
  243.                                 digplay();
  244.                  }
  245.                         if(swh == 5 )//设置小时
  246.                 {
  247.                         ShowChina(6,32,13);
  248.                         if(KEY3 == 0)
  249.                         {
  250.                                 hour ++;
  251.                                 while(!KEY3);
  252.                         }
  253.                         if(KEY4 == 0)
  254.                         {
  255.                                 hour --;
  256.                                 while(!KEY4);
  257.                         }
  258.                         hour = hour >24?24:hour;
  259.                         hour = hour <1?1:hour;
  260.                         hour_x=((hour/10)<<4)|(hour%10)        ;
  261.                 //        set_DS1302_time(year_x,week,month_x, day_x,hour_x,div_x,0x00);
  262.                                 digplay();
  263.                  }
  264.                 if(swh == 6 )//设置分
  265.                 {
  266.                         ShowChina(6,32,14);
  267.                         if(KEY3 == 0)
  268.                         {
  269.                                 div ++ ;
  270.                                 while(!KEY3);
  271.                         }
  272.                         if(KEY4 == 0)
  273.                         {
  274.                                 div --;
  275.                                 while(!KEY4);
  276.                         }
  277.                         div = div >60?60:div;
  278.                         div = div <1?1:div;
  279.                         div_x=((div/10)<<4)|(div%10)        ;
  280.                 //        set_DS1302_time(year_x,week,month_x, day_x,hour_x,div_x,0x00);
  281.                                 digplay();
  282.                  }
  283.                 if(swh == 7 )         //设置 闹钟   时
  284.                 {
  285.                                 ShowChina(6,32,13); ShowNumber(6,20,11);
  286.                                                 if(KEY3 == 0)
  287.                         {
  288.                                 n_hour ++;
  289.                                 while(!KEY3);
  290.                         }
  291.                         if(KEY4 == 0)
  292.                         {
  293.                                 n_hour --;
  294.                                 while(!KEY4);
  295.                         }
  296.                         n_hour = n_hour >24?24:n_hour;
  297.                         n_hour = n_hour <1?1:n_hour;
  298.                 ShowNumber(6,75,n_hour/10); //时 十位
  299.                 ShowNumber(6,83,n_hour%10);//时  个位
  300.           ShowNumber(6,91,10);
  301.                  ShowNumber(6,99,n_div/10);//分  十位
  302.                 ShowNumber(6,107,n_div%10);//分  个
  303.                 }
  304.           if(swh == 8 )   //设置  闹钟  分
  305.                 {
  306.                          ShowChina(6,32,14);  ShowNumber(6,20,11);
  307.                                                 if(KEY3 == 0)
  308.                         {
  309.                                 n_div ++;
  310.                                 while(!KEY3);
  311.                         }
  312.                         if(KEY4 == 0)
  313.                         {
  314.                                 n_div --;
  315.                                 while(!KEY4);
  316.                         }
  317.                         n_div = n_div >60?60:n_div;
  318.                         n_div = n_div <1?1:n_div;
  319.                 ShowNumber(6,75,n_hour/10); //时 十位
  320.                 ShowNumber(6,83,n_hour%10);//时  个位
  321.           ShowNumber(6,91,10);
  322.                  ShowNumber(6,99,n_div/10);//分  十位
  323.                 ShowNumber(6,107,n_div%10);//分  个
  324.                 }
  325.                 if(KEY6 == 0 )
  326.                 {
  327.                         set_DS1302_time(year_x,week,month_x, day_x,hour_x,div_x,0x00);
  328.                         while(!KEY6);
  329.                 }                        
  330.                  
  331.                  
  332.                  
  333.                  
  334.                  
  335.                  
  336.                  
  337.                  
  338.                  
  339.                  
  340.                  
  341.                  /*
  342.                         if( swh == 7 )//秒表设置时间
  343.                         {               
  344.                                 if(djs_flag == 0)
  345.                                 {
  346.                                         TR0 = 0;
  347.                                         if(KEY3 == 0)
  348.                                         {
  349.                                                 djs ++ ;
  350.                                                 while(!KEY3);
  351.                                         }
  352.                                         if(KEY4 == 0)
  353.                                         {
  354.                                                 djs -- ;
  355.                                                 while(!KEY4);
  356.                                         }
  357.                                         djs = djs >100?100:djs;
  358.                                         djs = djs <1?1:djs;        
  359.                                         count = 0;
  360.                                         ShowNumber(6,32,djs/10);  ShowNumber(6,40,djs %10);
  361.                                 }
  362.                                 if ( djs_flag == 1 ) //djs
  363.                           {
  364.                                   TR0 = 1;
  365.                                    time = djs - count/1000;
  366.   
  367.                                   ShowNumber(6,32,time/10);  ShowNumber(6,40,time %10);                        
  368.                           } */
  369.                 /*                if (djs_stop_flag  == 1 )
  370.                                 {
  371.                                         TR0 = 1;
  372.                                 }
  373.                                 if (djs_stop_flag  == 1 )
  374.                                 {
  375.                                         TR0 = 0;
  376.                                 }*/
  377. /*                        }

  378.                         if( swh == 7 && KEY5 == 0 )
  379.                         {
  380.                                 djs_flag ++ ;
  381.                                 if( djs_flag >1 )djs_flag =0;
  382.                                 while(!KEY5);
  383.                         }*/
  384.         /*                if( swh == 7 && KEY6 == 0 )
  385.                         {
  386.                                 djs_stop_flag ++ ;
  387.                                 if( djs_stop_flag >1 )djs_stop_flag =0;                                
  388.                                 while(!KEY6);
  389.                         }                */        

  390.         }
  391.         
  392. }
  393. void Timer0Interrupt(void) interrupt 1
  394. {
  395.     TH0 = 0x0FC;
  396.     TL0 = 0x18;
  397.     //add your code here!
  398.           count ++ ;
  399. }        
  400.         
  401. //        digplaystart();
  402. //        delay5ms();
  403. //        Ds1302Init();//Ds1302初始化,并且附上设定的默认时间
  404. //        a=Read_Temperature();          //读取DS18B20的温度
  405. //                ShowNumber(0,32,11);//-
  406. //                ShowNumber(0,56,11);//-
  407. //                ShowChina(0,96,7);//汉字周
  408. //          ShowNumber16_32(2,32,10);//:
  409. //                ShowNumber16_32(2,80,10);//:
  410. //                ShowChina(6,112,8);//℃
  411.         
  412.         
  413.         
  414. /*        while(1)
  415.         {
  416.                 wendu();//温度显示
  417.                 if(flag==1)
  418.                                 Ds1302ReadTime();               
  419.                                         //读取DS1302的时间
  420.                 else  
  421.                 Ds1302WriteTime();

  422. if(KEY1==0)                                  //按键1--处理设定时间和返回
  423.                 {
  424.                         delay10();
  425.                         if(KEY1==1)
  426.                         {
  427.                                 delay10();
  428.                                 flag=~flag;        
  429.                                 
  430.                                 if(flag==0) {
  431.                                 ShowChina(6,48,9);
  432.                                 ShowChina(6,0,16);
  433.                                 ShowChina(6,16,17);
  434.                                 ShowNumber(6,32,10);
  435. ……………………

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

所有资料51hei提供下载:
lcd12864-时钟-秒表.zip (139.14 KB, 下载次数: 325)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:328014 发表于 2020-7-6 00:50 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:863891 发表于 2021-4-9 19:45 | 只看该作者
有没有电路图
回复

使用道具 举报

地板
ID:126866 发表于 2022-5-17 11:16 | 只看该作者
goodgoodgoodgoodgoodgood
回复

使用道具 举报

5#
ID:387687 发表于 2022-9-7 20:01 | 只看该作者

好资料,51黑有你更精彩!!!
回复

使用道具 举报

6#
ID:1075678 发表于 2023-12-12 21:30 | 只看该作者
是用什么版本的keil和Proteus呢?
回复

使用道具 举报

7#
ID:975773 发表于 2024-4-15 20:39 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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