• ;20次中断,每次50ms。每次判断num(21自减)是否为0.直至为0,R5加1
  • 为汇编语言的时分秒程序,分钟可调,便于操作
  • 使用软件Proteus和Keil uVision4 代码如下: #include<reg51.h> sbit con1=P3^0; sbit con2=P3^1; sbit con3=P3^2;...sbit con6=P3^5; int sec=40,min=59,hour=23;//全局变量 char code table...

    使用软件Proteus和Keil uVision4
    代码如下:

    #include<reg51.h>
    sbit con1=P3^0;
    sbit con2=P3^1;
    sbit con3=P3^2;
    sbit con4=P3^3;
    sbit con5=P3^4;
    sbit con6=P3^5;
    int sec=40,min=59,hour=23;//全局变量
    char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80
    ,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//把数组放入ROM中
    void delay(char ms)//延时的时间是由ms变量来控制
    {
    char x,y;//8位-128-127
    for(x=ms;x>0;x--)//每执行一次x,就执行110次y
    for(y=110;y>0;y--);//此时y变量是110,大概循环110次的y之后,时间是1ms
    }
    
    main()
    {
    P3=0x00;//首先关闭P3口,让所有的小端口都不能控制
    while(1)
    {
    sec++;
    if(sec==60)//注意双等号
    {
    sec=0;
    min++;
    if(min==60)
    {
    min=0;
    hour++;
    if(hour==24)
    {
    hour=0;
    }
    }
    }
    delay(20);
    
    P2=table[hour/10];
    con1=1;//先打开控制1的三极管
    delay(20);//延时一段时间,让1号数码管显示时间为20ms
    con1=0;//关闭1号数码管,因为下一个要控制2号数码管
    
    P2=table[hour%10];
    con2=1;
    delay(20);
    con2=0;
    
    P2=table[min/10];
    con3=1;
    delay(20);
    con3=0;
    
    P2=table[min%10];
    con4=1;
    delay(20);
    con4=0;
    
    P2=table[sec/10];
    con5=1;
    delay(20);
    con5=0;
    
    P2=table[sec%10];
    con6=1;
    delay(20);
    con6=0;
    }
    }
    

    电路仿真效果
    在这里插入图片描述6为数码管7SEG-MPX6-CA

    展开全文
  • at89s52+六位数码管显示时分秒的可调时钟 有源代码和Proteus仿真 已经通过
  • 本人是一名在校大三学生,这个单片机课程设计师在上单片机课程的时候的课程设计作业,主要是设计一个时间控制器,完成年月日、时分秒显示,以及按键调整、闹钟等功能的实现。在文章末尾我会给出代码及电路图,采用...

    **

    基于89C51单片机的年月日、时分秒的时间控制器(带按键调节、闹钟等功能,包括汇编语言程序和电路图)**

    1. 概述
    本人是一名在校大三学生,这个单片机课程设计师在上单片机课程的时候的课程设计作业,主要是设计一个时间控制器,完成年月日、时分秒的显示,以及按键调整、闹钟等功能的实现。在文章末尾我会给出代码及电路图,采用的是51单片机的汇编语言来编写的(因为这是老师要求的),程序的功能还是比较全面的,大家也可以对其功能进行增添。这是我第一次写博客,有错误的地方在所难免,希望大家发现错误可以评论,本人一定虚心接受。希望这篇博客对大家有所帮助。

    **备注:**程序里边有一个小BUG,大家到时候调试的时候就知道了,由于当时只是验收就好了,我就没有管。

    2.程序及电路图
    在这里就只放截图了,到时候大家去百度网盘下载。

    百度网盘地址:https://pan.baidu.com/s/1NPQEnXsGbp75gW3X78yW2Q 密码:oqv5

    编程序我用的是keil,电路图仿真软件我用的是proteus。

    51汇编程序如下:在这里插入图片描述

    电路图如下:
    在这里插入图片描述

    最后,希望自己的这篇博客对大家有所帮助,祝大家学业进步,工作顺利。

    展开全文
  • 四个功能键,分别是对时,分,的设置,还有一个是暂停/开始。可以扩展。能够基本实现电子表的功能及需求,有整点蜂鸣
  • 51单片机电子钟,采用数码管显示。该设计方法为中断法,时间较精确,可以显示时分秒
  • Here ar a part of the code for reference: 1 if(LocalTimes.Bit.second++>=59) 2 { 3 LocalTimes.Bit.second=0; 4 if(LocalTimes.Bit.minute++>=59) 5 ...

    Here ar a part of the code for reference:

     1 if(LocalTimes.Bit.second++>=59)
     2           {
     3             LocalTimes.Bit.second=0;
     4             if(LocalTimes.Bit.minute++>=59)
     5             {
     6               LocalTimes.Bit.minute=0;
     7               if(LocalTimes.Bit.hour++>=23)
     8               {
     9                 LocalTimes.Bit.hour=0;
    10                 LocalTimes.Bit.day++;
    11                 if(LocalTimes.Bit.month==2)
    12                 {
    13                   year=LocalTimes.Bit.year+1990;
    14                   if((year%4==0&&year%100!=0)||(year%400==0))
    15                   {
    16                     if(LocalTimes.Bit.day>29)
    17                     {
    18                       LocalTimes.Bit.day=1;
    19                       LocalTimes.Bit.month++;
    20                     }
    21                   }
    22                   else
    23                   {
    24                     if(LocalTimes.Bit.day>28)
    25                     {
    26                       LocalTimes.Bit.day=1;
    27                       LocalTimes.Bit.month++;
    28                     }
    29                   }
    30                 }
    31                 else if(LocalTimes.Bit.month%2) 
    32                 {
    33                   if(LocalTimes.Bit.month==9||LocalTimes.Bit.month==11)
    34                   {
    35                     if(LocalTimes.Bit.day>30)
    36                     {
    37                       LocalTimes.Bit.day=1;
    38                       LocalTimes.Bit.month++;
    39                     }
    40                   }
    41                   else
    42                   {
    43                     if(LocalTimes.Bit.day>31)
    44                     {
    45                       LocalTimes.Bit.day=1;
    46                       LocalTimes.Bit.month++;
    47                     }
    48                   }
    49                 }
    50                 else 
    51                 {
    52                   if(LocalTimes.Bit.month==4||LocalTimes.Bit.month==6)
    53                   {
    54                     if(LocalTimes.Bit.day>30)
    55                     {
    56                       LocalTimes.Bit.day=1;
    57                       LocalTimes.Bit.month++;
    58                     }
    59                   }
    60                   else
    61                   {
    62                     if(LocalTimes.Bit.day>31)
    63                     {
    64                       LocalTimes.Bit.day=1;
    65                       LocalTimes.Bit.month++;
    66                       if(LocalTimes.Bit.month>12)
    67                       {
    68                         LocalTimes.Bit.month=1;
    69                         if(LocalTimes.Bit.year++>62)
    70                         {
    71                           LocalTimes.Bit.year=9;
    72                         }
    73                       }
    74                     }
    75                   }
    76                 }
    77               }
    78             }
    79           }

    Please note that the codes should be executed in the timer interrupt routine.
    changed into seconds by using the RTC value:

     1 static posix_time_t update_sntp_from_localtimer(void)
     2 {
     3   struct tm timestamp;
     4   time_t t2 = 0;
     5   //0 is the first month, 1 is the second month,so on...
     6   timestamp.tm_mon = LocalTimestamp.BXI_Timestamp.Bit.month - 1;
     7   timestamp.tm_mday = LocalTimestamp.BXI_Timestamp.Bit.day;     //day of month
     8   timestamp.tm_year = LocalTimestamp.year - 1900; //start from 1900, \
     9                                                   e.g. 1900-1970 = 2208988800 seconds
    10   timestamp.tm_hour = LocalTimestamp.BXI_Timestamp.Bit.hour;
    11   timestamp.tm_min = LocalTimestamp.BXI_Timestamp.Bit.minute;
    12   timestamp.tm_sec = LocalTimestamp.BXI_Timestamp.Bit.second;
    13   timestamp.tm_yday = 0;        //day of year
    14   timestamp.tm_isdst = 0;
    15   t2 = mktime(&timestamp);
    16   return t2;
    17 }

     

    Thank you!

     

    转载于:https://www.cnblogs.com/lumao1122-Milolu/p/7648070.html

    展开全文
  • 数字时钟,c源程序代码,可实现年月日时分秒
  • 此程序的功能是使用51单片机的定时器定时显示时,分,,并通过PROTEUS软件仿真通过。
  • 动态显示时分秒

    2017-02-13 14:27:52
    前端  var allTime = Math.round(data.RemainTime) var Hours = Math.floor(allTime / (60 * 60)); var allMunite = Math.floor(allTime % (60 * 60)); var munite = Math.floor(allMunite / 60);...

    前端 

    var allTime = Math.round(data.RemainTime)

    var Hours = Math.floor(allTime / (60 * 60));
    var allMunite = Math.floor(allTime % (60 * 60));
    var munite = Math.floor(allMunite / 60);
    var second = Math.floor((allMunite % 60));
    var currentTime = (Hours < 10 ? '0' + Hours : Hours) + ':' + (munite < 10 ? '0' + munite : munite) + ':' + (second < 10 ? '0' + second : second);
    $('.spanTimeshow').html(currentTime)

    refreshtime($('.spanTimeshow'), data.RemainTime)

        function refreshtime(obj, spantime) {
                //clearInterval(setInt);
          var setInt=setInterval(function () {
                    //播放时间、总时间
                    var allTime1 = Math.round(spantime)
                    var Hours1 = Math.floor(allTime1 / (60 * 60));
                    var allMunite1 = Math.floor(allTime1 % (60 * 60));
                    var munite1 = Math.floor(allMunite1 / 60);
                    var second1 = Math.floor((allMunite1 % 60));
                    var currentTime1 = (Hours1 < 10 ? '0' + Hours1 : Hours1) + ':' + (munite1 < 10 ? '0' + munite1 : munite1) + ':' + (second1 < 10 ? '0' + second1 : second1);
                    $(obj).html(currentTime1)
                    if (spantime<=0)
                    {
                        $('.groupsh').addClass('hide');
                        clearInterval(setInt);
                    }
                    spantime--;
                }, 1000)


        }



        后端

            public void GetRroupList(HttpContext context)
            {
                string json="";
                int productId = Globals.RequestFormNum("productId");
                DataTable dt=OrderHelper.GetGroupList(productId);
                for (int i = 0; i < dt.Rows.Count;i++ )
                {
                    DateTime dtnow = Convert.ToDateTime(DateTime.Now.ToLocalTime());
                    DateTime dtend = Convert.ToDateTime(dt.Rows[i]["GroupEDate"]);
                    TimeSpan ts = dtend.Subtract(dtnow);    //时间差
                    json += "{\"CategoryId\":\"" + dt.Rows[i]["CategoryId"] + "\",\"GroupUser\":\"" + dt.Rows[i]["GroupUser"] + "\",\"RemainTime\":\"" + ts.TotalSeconds + "\",\"sy\":\"" + dt.Rows[i]["sy"] + "\"},";
                }
                if (!string.IsNullOrEmpty(json))
                {
                    json = json.Substring(0, json.Length - 1);                
                }
                json = "[" + json + "]";
                context.Response.Write(json);
            }



    展开全文
  • 资源包含代码和PCB原理图。时钟芯片计时。四共阴数码管显示时分秒时间,扩展的话也可以显示日月周年,数码管采用74HC138控制选,74HC573控制段选。独立按键修改时间,LED状态指示灯。
  • 基于51单片机的 数码管时钟,硬件和模拟都实现了。可设置时间和闹钟,可一键查看闹钟。闹钟时间到蜂鸣器响数码管闪。有问题和帮助就加我,先看备注
  • 通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒数值的计时项目一、前言1、通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒数值的计时项目包括用Keil软件编写单片机C语言...

    通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目

    一、前言

    1、通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目包括用Keil软件编写单片机C语言程序和用Proteus软件仿真单片机外围电路

    2、通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目构思

    (1)、实现什么功能:LCD1602字符型液晶显示器先显示时分秒,在点击移位按键后,停止计时,LCD1602字符型液晶显示器光标闪烁,每次按下移位键,LCD1602字符型液晶显示器光标随每次按下移位键移位到时分秒个位十位处闪烁,当LCD1602字符型液晶显示器的时分秒个位十位有闪烁后,可修改LCD1602字符型液晶显示器的时分秒个位十位闪烁位上的数值,再通过移位按键或启停按键启动或停止计时。

    (2)、如何实现功能:如何让LCD1602字符型液晶显示器先显示时分秒:采用定时器0工作方式1计时,计时得到的数值赋给LCD1602字符型液晶显示器显示时间两位数分解函数进行分解,分解得到的个位数值与十位数值用变量代替分别由LCD1602字符型液晶显示器写指令函数和LCD1602字符型液晶显示器写数据函数写入LCD1602字符型液晶显示器,通过LCD1602字符型液晶显示器显示出来。如何让LCD1602字符型液晶显示器的时分秒个位十位闪烁:采用按键扫描函数扫描,每次按下移位键(此时定时器0停止计时),执行LCD1602字符型液晶显示器光标闪烁指令和LCD1602字符型液晶显示器光标随每次按下移位键移位到时分秒个位十位处闪烁的位置指令。如何修改LCD1602字符型液晶显示器的时分秒个位十位闪烁位数值并在原计时基础上实现计时:当移位键按下后,定时器0停止计时,计时得到的数值采用两位数分解公式(如:shi=num/10,ge=num%10。)进行分解,分解得到的个位数值与十位数值用变量代替写入按键扫描函数,此时也要采用两位数合成公式(如:miao=shi+ge=(num/10)*10+num%10)求出原先的计时数值,用变量代替原先的计时数值写入按键扫描函数(原因:时分秒的个位或十位显示位的数值是在原计时数值上分解得来,当时分秒的个位或十位显示位的数值发生变化后,原计时数值也要变化,否则启动定时器0计时后,LCD1602字符型液晶显示器显示的是原计时时间,而不是修改时分秒的个位或十位显示位的数值后的计时,因此要采用两位数合成公式(miao=shi+ge=(num/10)*10+num%10)求出原先的计时数值,用变量代替原先的计时数值写入按键扫描函数。)。

    二、通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目的Keil软件编写的单片机C语言程序

    #include<reg52.h>//单片机头文件
    #define uchar unsigned char//宏定义,用uchar表示unsigned char,叫无符号字符型数据类型,取值范围为:0到255。
    #define uint unsigned int//宏定义,用uint表示unsigned int,叫无符号整数型数据类型,取值范围为:0到65535。
    sbit RS=P0^7;//位定义LCD1602字符型液晶显示器的数据/命令选择引脚                 
    sbit RW=P0^6;//位定义LCD1602字符型液晶显示器的读写引脚                        
    sbit EN=P0^5; //位定义LCD1602字符型液晶显示器的使能引脚
    sbit S1=P3^5;//移位按键S1 
    sbit S2=P3^4;//增加按键S2 
    sbit S3=P3^3;//减少按键S3 
    sbit S4=P3^2;//启停按键S4
    uchar count,S1num,S4num;//count为定时器0中断次数变量,S1num为移位按键S1按键按下次数变量,S4num为启停按键S4按下次数变量。
    uchar shi,fen,miao;//未做时间修改的计时时钟、分钟、秒钟变量
    uchar secondge,secondshi; //秒钟个位、十位的变量
    uchar minutange,minutanshi;//分钟个位、十位的变量
    uchar hourge,hourshi;//时钟个位、十位的变量
    uchar table0[]="2019-11-11";//LCD1602字符型液晶显示器第一行初始显示
    uchar table1[]="00:00:00";//LCD1602字符型液晶显示器第二行初始显示
      void Delay(uint z)//延时程序
    {
       uint x,y;
       for(x=z;x>0;x--)
    	for(y=110;y>0;y--);
     }
      void WriteCommand(uchar command)//LCD1602字符型液晶显示器写指令函数
    {
       RS=0;//LCD1602字符型液晶显示器指令寄存器低电平
       RW=0;//LCD1602字符型液晶显示器写指令操作低电平
       P2=command;//LCD1602字符型液晶显示器写指令函数写指令到单片机P2组端口,再输送到LCD1602字符型液晶显示器指令寄存器中执行。
       Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
       EN=1;//LCD1602字符型液晶显示器使能端高电平  
       Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
       EN=0;//LCD1602字符型液晶显示器使能端低电平
     }
      void WriteData(uchar information)//LCD1602字符型液晶显示器写数据函数
    {  
       RS=1;//LCD1602字符型液晶显示器数据寄存器高电平
       RW=0;//LCD1602字符型液晶显示器写数据操作低电平
       P2=information;//LCD1602字符型液晶显示器写数据函数写数据到单片机P2组端口,再输送到LCD1602字符型液晶显示器上显示。
       Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
       EN=1;//LCD1602字符型液晶显示器使能端高电平 
       Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
       EN=0;//LCD1602字符型液晶显示器使能端低电平
     }
      void LCD1602Init()//LCD1602初始化函数
    {
       WriteCommand(0x38);//设置LCD1602字符型液晶显示器16x2显示,5*7或5*8点阵,8位数据并口,简称显模。
       WriteCommand(0x08);//设置LCD1602字符型液晶显示器显示开,简称亮屏。
       WriteCommand(0x01);//设置清除LCD1602字符型液晶显示器屏上所有内容,并让光标复位到LCD1602字符型液晶显示器屏左上角,简称清屏。
       WriteCommand(0x06);//设置开光标(或字符)地址指针自增1,光标右移动一个字符位,整屏显示不移动。
       WriteCommand(0x0c);//设置开LCD1602字符型液晶显示器显示,关光标,关光标(字符)闪烁。
     }
      void Timer0Init()//定时器0初始化函数
    {
       TMOD=0x01;//设定定时器0工作模式为模式1
       TH0=(65536-50000)/256;//TH0装初值
       TL0=(65536-50000)%256;//TL0装初值
       EA=1;//开启定时器总中断
       ET0=1;//开启定时器0中断开关
       TR0=1;//启动定时器0
     }
      void LCD1602InitDisplay()//LCD1602字符型液晶显示器初始化显示函数
    {
       uchar j;//j表示数组元素个数变量
       WriteCommand(0x80+0x00);//LCD1602字符型液晶显示器第一行第一个位置显示
       for(j=0;j<10;j++)//有10个字符,要循环10次。
      {
        WriteData(table0[j]);//显示字符串
        Delay(5);
       }
       WriteCommand(0x80+0x40);//LCD1602字符型液晶显示器第二行第一个位置显示
       for(j=0;j<8;j++)//有8个字符,要循环8次。
      { 
        WriteData(table1[j]);//显示字符串
        Delay(5);
       }
     }
      void LCD1602DisplayTime(uchar address,uchar num)//LCD1602字符型液晶显示器显示时间两位数分解函数
    {
       uchar shi,ge;//十位、个位的变量
       shi=num/10;//十位数
       ge=num%10;//个位数
       WriteCommand(0x80+0x40+address);//LCD1602字符型液晶显示器第二行某个显示位
       WriteData(0x30+shi);//0x30表示字符库的数字0,整个代码表示十位可显示0到9的数字。
       WriteData(0x30+ge);//0x30表示字符库的数字0,整个代码表示个位可显示0到9的数字。
     }
      void LCD1602DisplayGeDigitResolve(uchar address,uchar num)//LCD1602字符型液晶显示器显示修改时间个位数分解函数
    {
       uchar ge;//个位的变量
       ge=num%10;//个位数
       WriteCommand(0x80+0x40+address);//LCD1602字符型液晶显示器第二行某个显示位
       WriteData(0x30+ge);//0x30表示字符库的数字0,整个代码表示个位可显示0到9的数字。
     }
      void LCD1602DisplayShiDigitResolve(uchar address,uchar num)//LCD1602字符型液晶显示器修改时间十位数分解函数
    {
       uchar shi;//十位变量
       shi=num%10;//十位数
       WriteCommand(0x80+0x40+address);//LCD1602字符型液晶显示器第二行某个显示位
       WriteData(0x30+shi);//0x30表示字符库的数字0,整个代码表示十位可显示0到9的数字。
     }
      void KeyScan()//按键扫描函数
    {
       if(S1==0)//判断移位按键S1是否按下					   
      {
    	Delay(5);
    	if(S1==0)//再次判断移位按键S1是否按下
       {	
         S1num++;//移位按键S1按键次数变量先赋值再自加
    	 while(!S1);//等待移位按键S1弹起
    	 switch(S1num)
    	{
    	  case 1:
    	         TR0=0;//关定时器0
    			 S4num=0;//启停按键S4按下次数清零
    			 secondge=miao%10;//关掉定时器0定时后,把秒钟计时时间数值取余赋给秒钟个位显示位。 
    	         secondshi=miao/10;//关掉定时器0定时后,把秒钟计时时间数值取除赋给秒钟十位显示位。
    			 WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶显示器第二行第8个位置的显示位
    	         WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
    			 break;
    	  case 2:
    	         secondshi=secondshi;//关掉定时器0定时后,把秒钟计时时间数值取除后得到的值再赋给秒钟十位显示位。
    	         WriteCommand(0x80+0x40+0x06);//LCD1602字符型液晶显示器第二行第7个位置的显示位
    	         WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
    			 break;
    	  case 3:
    	         minutange=fen%10;//关掉定时器0定时后,把分钟计时时间数值取余赋给分钟个位显示位。
    			 minutanshi=fen/10;//关掉定时器0定时后,把分钟计时时间数值取除赋给分钟十位显示位。
    	         WriteCommand(0x80+0x40+0x04);//LCD1602字符型液晶显示器第二行第5个位置的显示位
    	         WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
    			 break;
    	  case 4:
    	         minutanshi=minutanshi;//关掉定时器0定时后,把分钟计时时间数值取除后得到的值再赋给分钟十位显示位。
    	         WriteCommand(0x80+0x40+0x03);//LCD1602字符型液晶显示器第二行第4个位置的显示位
    	         WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
    			 break;
    	  case 5:
    	         hourge=shi%10;//关掉定时器0定时后,把时钟计时时间数值取余赋给时钟个位显示位。
    			 hourshi=shi/10;//关掉定时器0定时后,把时钟计时时间数值取除赋给时钟十位显示位。
    	         WriteCommand(0x80+0x40+0x01);//LCD1602字符型液晶显示器第二行第2个位置的显示位
    	         WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
    			 break;
    	  case 6:
    	         hourshi=hourshi;//关掉定时器0定时后,把时钟计时时间数值取除后得到的值再赋给时钟十位显示位。
    	         WriteCommand(0x80+0x40+0x00);//LCD1602字符型液晶显示器第二行第1个位置的显示位
    	         WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
    			 break;
    	  case 7:
    	         WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶显示器第二行第8个位置的显示位
    	         WriteCommand(0x0c);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
    			 TR0=1;//打开定时器0
    			 S1num=0;//移位按键S1按键按下次数清零
    			 break;
    	  default:
    	          S1num=0;//移位按键S1按键按下次数清零
    			  break;
    	 }
    	}
       }
        if(S1num!=0)//判断移位按键S1按键按下次数变量是否为0
       {
         if(S2==0)//判断增加按键S2是否按下
    	{
    	  Delay(5);
    	  if(S2==0)//再次判断增加按键S2是否按下
    	 {
    	   while(!S2);//等待增加按键S2弹起
           switch(S1num)//移位按键S1按键按下次数变量选择位
    	  {
    	    case 1://移位按键S1按键第一次按下
    			   secondge++;//秒钟个位数先赋值再加加
    		       if(secondge==10)//判断秒钟个位数设定值是否达到10
    		       secondge=0;//秒钟个位数归零
    		       LCD1602DisplayGeDigitResolve(0x07,secondge);//LCD1602字符型液晶显示器第二行第8个位置的秒钟个位显示位的显示数
    		       WriteCommand(0x80+0x40+0x07);//写入LCD1602字符型液晶显示器第二行第8个位置的秒钟个位显示位
    			   miao=secondshi*10+secondge;//移位修改秒钟个位显示位的数值后,需要通过秒钟十位显示位的数值加上秒钟个位显示位的数值之和赋给秒钟变量,才能在修改秒钟个位或十位显示位的数值后重新计时。(原因:秒钟个位或十位显示位的数值是在秒钟的数值上分解得来,当秒钟个位或十位显示位的数值发生变化后,秒钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		case 2://移位按键S1按键第二次按下
    			   secondshi++;//秒钟十位数先赋值再加加
    		       if(secondshi==6)//判断秒钟十位数设定值是否达到6
    		       secondshi=0;//秒钟十位数归零
    		       LCD1602DisplayShiDigitResolve(0x06,secondshi);//LCD1602字符型液晶显示器第二行第7个位置的秒钟十位显示位的显示数
    		       WriteCommand(0x80+0x40+0x06);//写入LCD1602字符型液晶显示器第二行第7个位置的秒钟十位显示位
    			   miao=secondshi*10+secondge;//移位修改秒钟十位显示位的数值后,需要通过秒钟十位显示位的数值加上秒钟个位显示位的数值之和赋给秒钟变量,才能在修改秒钟个位或十位显示位的数值后重新计时。(原因:秒钟个位或十位显示位的数值是在秒钟的数值上分解得来,当秒钟个位或十位显示位的数值发生变化后,秒钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
            case 3://移位按键S1按键第三次按下
    			   minutange++;//分钟个位数先赋值再加加
    		       if(minutange==10)//判断分钟个位数设定值是否达到10
    		       minutange=0;//分钟个位数归零
    		       LCD1602DisplayGeDigitResolve(0x04,minutange);//LCD1602字符型液晶显示器第二行第5个位置的分钟个位显示位的显示数
    		       WriteCommand(0x80+0x40+0x04);//写入LCD1602字符型液晶显示器第二行第5个位置的分钟个位显示位
    			   fen=minutanshi*10+minutange;//移位修改分钟个位显示位的数值后,需要通过分钟十位显示位的数值加上分钟个位显示位的数值之和赋给分钟变量,才能在修改分钟个位或十位显示位的数值后重新计时。(原因:分钟个位或十位显示位的数值是在分钟的数值上分解得来,当分钟个位或十位显示位的数值发生变化后,分钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		case 4://移位按键S1按键第四次按下
    			   minutanshi++;//分钟十位数先赋值再加加
    		       if(minutanshi==6)//判断分钟十位数设定值是否达到6
    		       minutanshi=0;//分钟十位数归零
    		       LCD1602DisplayShiDigitResolve(0x03,minutanshi);//LCD1602字符型液晶显示器第二行第4个位置的分钟十位显示位的显示数
    		       WriteCommand(0x80+0x40+0x03);//写入LCD1602字符型液晶显示器第二行第7个位置的分钟十位显示位
    			   fen=minutanshi*10+minutange;//移位修改分钟十位显示位的数值后,需要通过分钟十位显示位的数值加上分钟个位显示位的数值之和赋给分钟变量,才能在修改分钟个位或十位显示位的数值后重新计时。(原因:分钟个位或十位显示位的数值是在分钟的数值上分解得来,当分钟个位或十位显示位的数值发生变化后,分钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		case 5://移位按键S1按键第五次按下
    			   hourge++;//时钟个位数先赋值再加加
    		       if(hourge==4)//判断时钟个位数设定值是否达到4
    		       hourge=0;//时钟个位数归零
    		       LCD1602DisplayGeDigitResolve(0x01,hourge);//LCD1602字符型液晶显示器第二行第2个位置的时钟个位显示位的显示数
    		       WriteCommand(0x80+0x40+0x01);//写入LCD1602字符型液晶显示器第二行第2个位置的时钟个位显示位
    			   shi=hourshi*10+hourge;//移位修改时钟个位显示位的数值后,需要通过时钟十位显示位的数值加上时钟个位显示位的数值之和赋给时钟变量,才能在修改时钟个位或十位显示位的数值后重新计时。(原因:时钟个位或十位显示位的数值是在时钟的数值上分解得来,当时钟个位或十位显示位的数值发生变化后,时钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		case 6://移位按键S1按键第六次按下
    			   hourshi++;//时钟十位数先赋值再加加
    		       if(hourshi==3)//判断时钟十位数设定值是否达到3
    		       hourshi=0;//时钟十位数归零
    		       LCD1602DisplayShiDigitResolve(0x00,hourshi);//LCD1602字符型液晶显示器第二行第1个位置的时钟十位显示位的显示数
    		       WriteCommand(0x80+0x40+0x00);//写入LCD1602第二行第1个位置的时钟十位显示位
    			   shi=hourshi*10+hourge;//移位修改时钟十位显示位的数值后,需要通过时钟十位显示位的数值加上时钟个位显示位的数值之和赋给时钟变量,才能在修改时钟个位或十位显示位的数值后重新计时。(原因:时钟个位或十位显示位的数值是在时钟的数值上分解得来,当时钟个位或十位显示位的数值发生变化后,时钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		default:
    		        S1num=0;//移位按键S1按键按下次数清零
    				break; 
    	   }
    	  }
    	 }
        if(S3==0)//判断减少按键S3是否按下
    	{
    	  Delay(5);
    	  if(S3==0)//再次判断减少按键S3是否按下
    	 {
    	   while(!S3);//等待减少按键S3弹起
    	   switch(S1num)//移位按键S1按键按下次数变量选择位
    	  {
    	    case 1://移位按键S1按键第一次按下
    			   secondge--;//秒钟个位数先赋值再减减
    		       if(secondge==-1)//判断秒钟个位数设定值是否达到-1
    		       secondge=9;//秒钟个位数归9
    		       LCD1602DisplayGeDigitResolve(0x07,secondge);//LCD1602字符型液晶显示器第二行第8个位置的秒钟个位显示位的显示数
    		       WriteCommand(0x80+0x40+0x07);//写入LCD1602字符型液晶显示器第二行第8个位置的秒钟个位显示位
    			   miao=secondshi*10+secondge;//移位修改秒钟个位显示位的数值后,需要通过秒钟十位显示位的数值加上秒钟个位显示位的数值之和赋给秒钟变量,才能在修改秒钟个位或十位显示位的数值后重新计时。(原因:秒钟个位或十位显示位的数值是在秒钟的数值上分解得来,当秒钟个位或十位显示位的数值发生变化后,秒钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		case 2://移位按键S1按键第二次按下
    			   secondshi--;//秒钟十位数先赋值再减减
    		       if(secondshi==-1)//判断秒钟十位数设定值是否达到-1
    		       secondshi=5;//秒钟十位数归5
    		       LCD1602DisplayShiDigitResolve(0x06,secondshi);//LCD1602字符型液晶显示器第二行第7个位置的秒钟十位显示位的显示数
    		       WriteCommand(0x80+0x40+0x06);//写入LCD1602字符型液晶显示器第二行第7个位置的秒钟十位显示位
    			   miao=secondshi*10+secondge;//移位修改秒钟十位显示位的数值后,需要通过秒钟十位显示位的数值加上秒钟个位显示位的数值之和赋给秒钟变量,才能在修改秒钟个位或十位显示位的数值后重新计时。(原因:秒钟个位或十位显示位的数值是在秒钟的数值上分解得来,当秒钟个位或十位显示位的数值发生变化后,秒钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
            case 3://移位按键S1按键第三次按下
    			   minutange--;//分钟个位数先赋值再减减
    		       if(minutange==-1)//判断分钟个位数设定值是否达到-1
    		       minutange=9;//分钟个位数归9
    		       LCD1602DisplayGeDigitResolve(0x04,minutange);//LCD1602字符型液晶显示器第二行第5个位置的分钟个位显示位的显示数
    		       WriteCommand(0x80+0x40+0x04);//写入LCD1602字符型液晶显示器第二行第5个位置的分钟个位显示位
    			   fen=minutanshi*10+minutange;//移位修改分钟个位显示位的数值后,需要通过分钟十位显示位的数值加上分钟个位显示位的数值之和赋给分钟变量,才能在修改分钟个位或十位显示位的数值后重新计时。(原因:分钟个位或十位显示位的数值是在分钟的数值上分解得来,当分钟个位或十位显示位的数值发生变化后,分钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		case 4://移位按键S1按键第四次按下
    			   minutanshi--;//分钟十位数先赋值再减减
    		       if(minutanshi==-1)//判断分钟十位数设定值是否达到6
    		       minutanshi=5;//分钟十位数归5
    		       LCD1602DisplayShiDigitResolve(0x03,minutanshi);//LCD1602字符型液晶显示器第二行第4个位置的分钟十位显示位的显示数
    		       WriteCommand(0x80+0x40+0x03);//写入LCD1602字符型液晶显示器第二行第7个位置的分钟十位显示位
    			   fen=minutanshi*10+minutange;//移位修改分钟十位显示位的数值后,需要通过分钟十位显示位的数值加上分钟个位显示位的数值之和赋给分钟变量,才能在修改分钟个位或十位显示位的数值后重新计时。(原因:分钟个位或十位显示位的数值是在分钟的数值上分解得来,当分钟个位或十位显示位的数值发生变化后,分钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		case 5://移位按键S1按键第五次按下
    			   hourge--;//时钟个位数先赋值再减减
    		       if(hourge==-1)//判断时钟个位数设定值是否达到-1
    		       hourge=3;//时钟个位数归3
    		       LCD1602DisplayGeDigitResolve(0x01,hourge);//LCD1602字符型液晶显示器第二行第2个位置的时钟个位显示位的显示数
    		       WriteCommand(0x80+0x40+0x01);//写入LCD1602字符型液晶显示器第二行第2个位置的时钟个位显示位
    			   shi=hourshi*10+hourge;//移位修改时钟个位显示位的数值后,需要通过时钟十位显示位的数值加上时钟个位显示位的数值之和赋给时钟变量,才能在修改时钟个位或十位显示位的数值后重新计时。(原因:时钟个位或十位显示位的数值是在时钟的数值上分解得来,当时钟个位或十位显示位的数值发生变化后,时钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		case 6://移位按键S1按键第六次按下
    			   hourshi--;//时钟十位数先赋值再减减
    		       if(hourshi==-1)//判断时钟十位数设定值是否达到-1
    		       hourshi=2;//时钟十位数归2
    		       LCD1602DisplayShiDigitResolve(0x00,hourshi);//LCD1602字符型液晶显示器第二行第1个位置的时钟十位显示位的显示数
    		       WriteCommand(0x80+0x40+0x00);//写入LCD1602字符型液晶显示器第二行第1个位置的时钟十位显示位
    			   shi=hourshi*10+hourge;//移位修改时钟十位显示位的数值后,需要通过时钟十位显示位的数值加上时钟个位显示位的数值之和赋给时钟变量,才能在修改时钟个位或十位显示位的数值后重新计时。(原因:时钟个位或十位显示位的数值是在时钟的数值上分解得来,当时钟个位或十位显示位的数值发生变化后,时钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		default:
    		        S1num=0;//移位按键S1按键按下次数清零
    				break; 
    	   }
    	  }
    	 }
    	}
        if(S4==0)//判断启停按键S4是否按下
       {
    	 Delay(5);
    	 if(S4==0)//再次判断启停按键S4是否按下
    	{
    	  S4num++;//启停按键S4按下次数先赋值再加加
    	  while(!S4);//等待启停按键S4弹起
    	  if(S4num==1)//判断启停按键S4是否第一次按下过。实现直接停止。
    	 {
    	   TR0=0;//关定时器0
    	  }
    	  if(S1num>=1&&S4num==1)//判断移位按键S1按键和启停按键S4是否按下过。实现移位停止后,可移位修改时间数值或不修改时间数值,然后再启动。
    	 {
    	   TR0=1;//开定时器0
    	   WriteCommand(0x0c);//开LCD1602显示,关光标,关光标(或字符)闪烁。
    	   S4num=0;//启停按键S4按下次数变量清零
    	   S1num=0;//移位按键S1按键按下次数变量清零
    	  }
    	  if(S4num==2)//判断移位按键S1按键是否第二次按下过 
    	 {
    	   TR0=1;//开定时器0
    	   S4num=0;//启停按键S4按下次数变量清零
    	  }
    	 }
    	}
       }
      void Timer0() interrupt 1//定时器0中断函数
    {
       TH0=(65536-50000)/256;//TH0重新装值
       TL0=(65536-50000)%256;//TL0重新装值
       count++;//定时器0中断次数先赋值再加
       if(count==18)//判断定时器0中断次数是否为18次
      {
    	count=0;//定时器0中断次数归零
    	miao++;//秒钟先赋值再加
    	if(miao==60)//判断秒钟是否达到60秒
       {
    	 miao=0;//秒钟归零
    	 fen++;//分钟先赋值再加
    	 if(fen==60)//判断分钟是否达到60分
    	{
    	  fen=0;//分钟归零
    	  shi++;//时钟先赋值再加
    	  if(shi==24)//判断时钟是否达到24时
    	 {
    	   shi=0;//时钟归零
    	  }
    	  LCD1602DisplayTime(0x00,shi);//时钟显示两位数分解函数
    	 }
    	  LCD1602DisplayTime(0x03,fen);//分钟显示两位数分解函数
    	 }
    	 LCD1602DisplayTime(0x06,miao);//秒钟显示两位数分解函数 		
    	}	
       }
       void main()//主函数
    {
        LCD1602Init();//LCD1602字符型液晶显示器初始化函数
        Timer0Init();//定时器0初始化函数
        LCD1602InitDisplay();//LCD1602字符型液晶显示器初始化显示函数
        while(1)
      {
    	 KeyScan();//按键扫描函数		
       }
    }
    

    三、通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目的Proteus软件仿真单片机外围电路

    在这里插入图片描述

    四、通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目的操作功能描述

    (1)、不修改时分秒个位十位数值,只是启动或停止计时的情况:如果第一次按下移位键,则停止计时,启动计时可按下移位键7次或按下启停键,再次停止计时可按下移位键或按下启停键,再次启动计时可按下移位键7次或按下启停键,周而复始。如果第一次按下启停键,则停止计时,启动计时可按下移位键7次或按下启停键,再次停止计时可按下移位键或按下启停键,再次启动计时可按下移位键7次或按下启停键,周而复始。

    (2)、修改时分秒个位十位数值,再启动或停止计时的情况:要修改时分秒个位十位上的数值,再启动或停止计时,首先必须按下移位键,此时停止计时,通过点击移位键让LCD1602字符型液晶显示器光标移到时分秒相应个位十位数值上,利用点击增加键或减少键修改数值,修改完毕后,启动计时可按下移位键多次让LCD1602字符型液晶显示器光标回到秒钟个位数值上或按下启停键,停止计时可按下移位键或按下启停键,当按下移位键时,又可修改时分秒个位十位上的数值,再次启动计时可按下移位键多次让LCD1602字符型液晶显示器光标回到秒钟个位数值上或按下启停键,周而复始。

    展开全文
  • 1.C51实现数字时钟。 2.用了两个定时器,一个用于闹钟,一个是计时 3.程序简单,功能也简单,用于期末作业和学习交流。 4.按键K4实现时分秒到年月日的转变
  • 使用51单片机在8位数码管上以飞入效果显示动态的时/分/信息,每次飞入一,不能覆盖已飞入数据,直到时/分/信息完整显示到8位数码管上,使编译产生的可执行文件尽量小。
  • 通过点击移位键控制数码管显示时分秒闪烁后进行增加键或减少键修改时分...单片机外围电路2、通过点击移位键控制数码管显示时分秒闪烁后进行增加键或减少键修改时分秒数值的计时项目工程构思(1)、实现什么功能...
  • 1602显示温度 年月日时分秒 可调 加闹铃
  • 可调实时时钟的proteus仿真,可切换显示年月日,时分秒,可进行调节。个数码管显示
1 2 3 4 5 ... 20
收藏数 485
精华内容 194