精华内容
下载资源
问答
  • 对时是12小时还是24
    千次阅读
    2021-07-25 21:05:37

    本来是计算与08:00之间的半小时数,结果遇到时间是12:00的结果居然是-8

     String startDate = "12:00";
     String endDate = "20:30";
     SimpleDateFormat simpleDateFormat = new SimpleDateFormat("hh:mm");
     try {
           Date parse = simpleDateFormat.parse(startDate);
           System.out.println(parse);
           System.out.println(parse.getTime() / (1000 * 60 * 30  )+1);
           Date parse1 = simpleDateFormat.parse(endDate);
           System.out.println(parse1.getTime() / (1000 * 60 * 30  )+1);
         } catch (ParseException e) {
                e.printStackTrace();
    }
    -------结果
    Thu Jan 01 00:00:00 CST 1970
    -15
    26
    

    最后发现是给SimpleDateFormat的时间格式给错了,但其实细心的小伙伴看的话,其实endDate哪里其实是20.30不属于12小时制,但SimpleDateFormat还是给我们转换成了对的时间(需要注意的是00:00、08:00、12:00、24:00)。

    SimpleDateFormat格式设置24小时制时,HH代表24小时制,hh代表12小时制

    更多相关内容
  • C++24小时制转换成12小时

    千次阅读 2020-12-12 02:49:22
    Write a program that converts from 24-hour notation to 12-hour notation.For example,it should convert 14:25 to 2:25 PM.The input is given as two integers.There should be at least three functions,one ...

    英文题目(老师给的原版题目):

    Write a program that converts from 24-hour notation to 12-hour notation.For example,it should convert 14:25 to 2:25 PM.The input is given as two integers.There should be at least three functions,one for input,one to do the conversion,and one for output.Record the AM/PM information as a value of type char,’A’ for AM and ‘P’ for PM.Thus,the function for doing the conversions will have a call-by-reference formal parameter of type char to record whether it is AM or PM.(The function will have other parameters as well.)Include a loop that lets the user repeat this computation for new input values again and again until the user says he wants to end the program.

    中文题目(简单翻译一下):

    将24小时制转换为12小时制的程序。例如,它应该将14:25转换为2:25 PM。输入是两个整数。应该至少有三个函数,一个用于输入,一个用于转换,一个用于输出。将AM/PM信息记录为char类型的值,’ A '表示AM, ’ P '表示PM。因此,用于进行转换的函数将具有一个char类型的按引用调用形参,以记录它是AM还是PM。(该函数还有其他参数。)包含一个循环,让用户对新的输入值一次又一次地重复这个计算,直到用户说他想结束程序。

    代码:

    #include <iostream>
    
    using namespace std;
    int time_24_hour,time_24_minute,time_12_hour,time_12_minute;
    
    void Input(){
        cout<<"请输入时间(24小时制,小时和分钟之间用空格区分):"<<endl;
        cin>>time_24_hour;
        cin>>time_24_minute;
        if(time_24_minute<0||time_24_hour<0||time_24_hour>24||time_24_minute>60){
            cout<<"输入错误程序退出!"<<endl;
            exit(0);
        }
    }
    
    void Output(){
        char time_quanyum;
        if(time_24_hour>=12){
            time_quanyum='P';
        }
        else{
            time_quanyum='A';
        }
        if(time_12_minute<10){
            cout<<"转换成12小时制之后的时间为 "<<time_12_hour<<":0"<<time_12_minute<<" "<<time_quanyum<<endl;
        }
        else{
            cout<<"转换成12小时制之后的时间为 "<<time_12_hour<<":"<<time_12_minute<<" "<<time_quanyum<<endl;
        }
    }
    
    void Conversion(){
        if(time_24_hour<=12){
            time_12_hour=time_24_hour;
        }
        else{
            time_12_hour=time_24_hour-12;
        }
        time_12_minute=time_24_minute;
    }
    
    
    int main() {
        char choice;
        do{
            Input();
            Conversion();
            Output();
            cout<<"是否继续转换?(y或n)"<<endl;
            cin>>choice;
            if(choice!='y'&&choice!='n'){
                cout<<"输入错误程序退出!"<<endl;
                exit(0);
            }
        }while(choice=='y');
        cout<<"退出成功!"<<endl;
        return 0;
    }
    
    
    展开全文
  • 24时间差计算公式 excel中计算24小时

    千次阅读 2021-07-25 06:18:37
    excel中计算24小时制时间差怎样在excel中计算24小时制时间差,在一天之内的小编会,不过不在一天之内外套一个MOD函数,就行了,这样试试 =MOD("0:36"-"22:32",1) MOD的特点是返回值不会为负,如果第一参数为负,会自动...

    excel中计算24小时制时间差

    怎样在excel中计算24小时制时间差,在一天之内的小编会,不过不在一天之内外套一个MOD函数,就行了,这样试试 =MOD("0:36"-"22:32",1) MOD的特点是返回值不会为负,如果第一参数为负时,会自动转化的,第二参数为1,就是代表一天,用这个函数=MOD("22:32"-"0:36",1)时也不影响正常计算.

    时间20:30与0:24相差多少?怎么算?

    089d62a30a6fcc648c29c2a946141981.png

    时间相减计算方法,小时与小时相减,分与分、秒与秒相减,分秒相减为负数时向高位(小时或分)借一为60进行。 20:30与0:24相差多少?如果是同一天,相差20-0=20小时,30-24=6分,结果相差为20小时6分钟。

    请问用什么方法可以更好的计算时间差,小编现在还没有思路噢。例如:13:3忘了自己曾经多美好,不会脏话,不会笑里藏刀。

    后面的时间加上(24小时×相差的天数),再减去前面的时间。特别注意时间的进位。 具体到楼主的问题,就是: (12:23:34+24:00:00)-13:34:32 =(12+24):(23+00):(34+00)-13:34:32 =36:23:34-13:34:32 =(36-13):(23-34):(34-32) =23:(-11):02 =22:(60-等待,不是消极地投向灭亡,而是抓紧岁月的希望,让从容镇静的心态引领你走向前方,当等待的旋律幻化成绕梁的清响,希望的交响乐就如天籁般灿烂。

    用excel算出时间差的公式

    例如开始时间为2010-1-27 11:04:04 结束时间为:2010-1-28 9:07:14 如何时间在Excel中是特殊的数值,可以直接加减计算 Excel版本参考:2010 举例演示:A1和A2为两个时间,分享时间差 能冲刷一切地除了眼泪,就是时间,以时间来推移豪情,时间越长,抵触越淡,似乎一杯不时稀释地茶。

    回车,查看效果 要点提示:如果结果为数值。小编爱的是从前的你,爱小编的是从前的你,所以小编被甩了。

    excel中两个日期间时间相减不能超过24小时的怎么计算

    两列日期时间直接相减,如果时间差小于1,表示时间差未超过24小时。

    下面是小编写的程序:大神看看该如何修改?让他能够实现当按下一个按键,曾经坚持过不知道是因为替自己着想而放弃的还是替别人着想而放弃的

    现在是2004-03-26 13:31:40 过去是:2004-01-02 11:30:24 要获得两个日期差,差的形式为:XX天XX小时XX分XX秒 方法一: DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Date d1 = df.parse("2004-03-26 13:31:40"); D总有一天,小编会让爱小编的人自豪,弃小编的人后悔,厌小编的人不尽如意,笑小编的人目瞪口呆.

    php如何计算当前的时间到今天24点整之间的时间差(很简单,用时间戳,不清楚时间戳可以百度一下,首先$date=今天24点的时间戳。 $now=当前的时间戳 然后相减得出时间差,这个不用教了吧。至于时间戳的转换,你百度一下时间戳。

    如何在EXCEL中根据日期时间分享两列数的差值?

    A列是日期和时间,如2010-4-30 19:23,B列是日期和时间,如2010-5-3 10:打开Excel表格2019版本,然后输入日期数据。 成熟的人不问过去聪明的人不问现在豁达的人不问未来

    输入日期后,在旁边的单元格输入公式=H4-G4,用后面的时间减去前面的时间。 怪小编当初眼盲心瞎脑子傻,奋不顾身钟情他,最后丢了笑容回不了家,烟酒脏话一样没落下。

    输入公式,按回车键就可以得到两个日期相差的天数了。 有一天你会忘记小编,投身于新的爱情放纵她的世界里;有一天你会有一个美丽的妻子,可爱的孩子;有一天你会忙碌在纷繁的人群中,忘记年轻时的梦想;有一天你会与小编擦肩而过,但却辨认不出彼此;有一天你会偶尔想起小编的名字,但却记不起小编的模样;有一天你会终老于病房,到死都不再想起小编……

    如果要小时的话,在公式后面乘以24。

    在EXCEL当中如何用公式有条件的算出2个时间差没有谁会无缘无故的对你好,所有的关心都来源于喜欢。

    如何将如下数据,在EXCEL当中如何用公式有条件的算出2个时间差,只要他不明白你的算法,请举例。 只能猜了:=TEXT(IF(MOD(A2,1)>17.5/24,INT(A2)+17.5/24-A1,A2-A1),"h小时m分钟") 小编知道,你一直努力的把思念压制在心底是为了让别人以为自己其实没有那个人也可以过得很不错

    Excel中怎样把时间差转成小时

    在A1中时间为7:20,在B1中时间是17:30时间差为10小时1,怎样在C1中计Excel中把时间差转成小时的具体操作步骤如下: 奇怪吧,小编想念你的方式,竟然是不提不问不听,并且,尽量不去想起。

    首先在电脑上点击打开Excel表格软件,接着在此文档的页面内输入要进行计算时间差的数值。 有时,放弃是另一种坚持,你错失了夏花绚烂,必将会走进秋叶静美。

    输入完毕后,在后方的单元格内输入“=ROUND((D4-C4)*24,3)”,然后单击键盘上的“ENTER”键。

    展开全文
  • 1、中断允许寄存器IE 2、中断优先级寄存器IP 3、定时器/计数器工作方式寄存器TMOD 4、定时器/计数器控制寄存器TCON 5、数码管和流水灯在中断中的应用 6、24小时制钟表

    一、中断

    1、中断概念

    单片机处理某一事件A时,事件B突然发生(中断发生),而且事件B的优先级大于事件A的优先级,则单片机暂停对事件A的执行,转向执行事件B(中断响应),执行完事件B后,再回到事件A,继续执行事件A。(中断返回)

    2、中断嵌套

    若事件的优先级A<B<C<D…单片机执行事件A时,发生了事件B,则暂停执行事件A而转向执行事件B,在执行事件B时,又发生了事件C,则停止执行事件B,进而转向执行事件C,执行事件C时,事件D发生,则单片机停止执行事件C,转向执行事件D…当事件D执行完毕,单片机返回事件C继续执行事件C,事件C执行完毕,单片机返回事件B继续执行事件B,事件B执行完毕,返回事件A继续执行事件A。这种在中断服务过程中又产生中断,并且发生中断响应的过程,就是中断嵌套。

    注:事件D执行完毕后,返回事件C,并不是重新开始执行事件C,而是接续中断发生时的进度,继续执行。同事件B、C的中断返回

    二、中断源(优先级顺序必记!)

    中断源默认中断级别
    INT0外部中断0最高
    T0定时器/计数器0中断第2
    INT1外部中断1第3
    T1定时器/计数器1中断第4
    T1/TI串行口中断第5
    T2定时器/计数器2中断最低

    注1:上表中T2定时器/计数器是52单片机特有的。
    注2:上表中的的优先级顺序一定要记住!!!接下来的一些寄存器每一位的信息也是按照这个顺序设定的。

    三、中断允许寄存器IE和中断优先级寄存器IP

    1、中断允许寄存器IE(Interrupt Enable )

    位序号D7D6D5D4D3D2D1D0
    位符号EA_ET2ESET1EX1ET0EX0

    这个寄存器的位符号和顺序一定要熟记,从低位到高位依次是:外部中断0、定时器/计数器0、外部中断1、定时器/计数器1、串行中断、D6位无效(52单片机用,T2)、EA全局中断允许位。

    前五位的顺序就是之前我们强调的中断源优先顺序,记住顺序后,这里就很容易记住IE寄存器。

    编写中断程序时,第一步需要打开全局中断允许,第二步需要选择中断源。其中寄存器某位软件置1表示打开,0表示关闭,单片机在上电是,IE寄存器每一位被清零,所以中断允许位及各中断源选择都处于关闭状态,需要程序进行操作。

    打开头文件:

    在这里插入图片描述在这里插入图片描述
    可以看到定义了8位的IE寄存器,编写程序时可直接对该寄存器操作。

    比如选择外部中断0作为中断源,则IE寄存器D7位置1打开全局中断允许位,D0位软件置1打开外部中断0,此时IE寄存器的状态值为:10000001,即0x81;
    程序为:(根据头文件,IE是有定义的,IE可以直接使用)

    IE=0x81;
    

    再查看头文件:

    在这里插入图片描述

    IE寄存器的每一位都重新命名。可以对每一位进行单独操作。所以上述程序还可以写成:

    	EA=1;
    	EX0=1;
    

    为了加深理解,再举个例子:比如现在需要使用定时器/计数器1作为中断源
    方法一:
    D7位置1,D3位置1,所以IE状态值:10001000,即0x88

    所以程序:

    IE=0x88;
    

    方法二:

    	EA=1;
    	ET1=1;
    

    2、中断优先级寄存器IP(Interrupt Priority)

    D7D6D5D4D3D2D1D0
    ---PSPT1PX1PT0PX0

    上表中从低位到高位依次:外部中断0、定时器/计数器0、外部中断1、定时器/定时器1、串行口中断,依旧是我们之前记忆的中断源优先级顺序

    中断优先级顾名思义,是用来设置优先级别的,类似STm32的NVIC 的优先级组,在实际应用中根据需要设置高优先级中断,形成中断嵌套。

    该寄存器的某一位软件置1,表示将该位设置为高优先级,高优先级优先于低优先级发生中断响应,若俩中断源同为高优先级或同为低优先级,则按照默认顺序发生中断响应(我们一直强调记忆的那个顺序)。正因为有了IP寄存器,所以中断源的响应顺序并不是一直不变,它根据我们的设置来适应需求。

    如果程序中没有对IP寄存器进行设置,则单片机上电后IP寄存器每一位都清零,相当于没有设置高优先级,中断响应顺序仍旧按照默认顺序发生。

    打开头文件:

    在这里插入图片描述
    在这里插入图片描述

    IP寄存器是在头文件里定义了的,并且寄存器的每一位都通过位操作重新命名,所以与IE寄存器相同,也有俩种操作方法。

    举例说明:
    若设置定时器/计数器T0和外部中断1为高优先级,则IP寄存器状态值:00000110,即0x06

    程序:

    IP=0x06;
    

    或者:

    PT0=1;
    PX1=1;
    

    此时优先级顺序:
    定时器/计数器0——>外部中断1(它俩按照默认顺序排,高优先级)——>外部中断0——>定时器/计数器1——>串行口中断(它仨按照默认顺序排,低优先级)

    四、定时器中断

    来到本博的重点——定时器中断,首先要知道,定时器/计数器的实质是加1计数器,由高八位和低八位俩个寄存器组成

    打开头文件,可以看到定时器1和2的高8位和低8位的寄存器。

    在这里插入图片描述

    1、定时器工作原理

    定时器实质是加1计数器,根据计数脉冲来+1计数,脉冲来源有俩种,一种是由系统的时钟振荡器输出脉冲经12分频后送来,另一种是T0或T1引脚输入的外部脉冲源,每来一个脉冲计数器就+1,当计数器16位都为1时(65535),再来一个脉冲后+1,计数器会归零,此时计数器的溢出使TCON寄存器中TF0或TF1置1,向CPU发送中断请求,也就是说定时器计满数就中断请求一次。

    假如计数器初值为N0,每t0时间计数器+1,则每次中断间隔时间为:(65536-N0)*t0。

    求t0:
    设晶振频率为F,晶振产生的信号为正弦波(等效为矩形波,与阈值和占空比有关),则周期为1/F s,一个机器周期为12个振荡周期(所以系统的时钟振荡器输出脉冲经12分频后当作计数脉冲),所以一个机器周期为12/F s,一个机器周期计数器+1,所以计数器每+1一次的时间为:12/F s。
    对于12MHZ的晶振,t0=12/(12* 10^6)s=10 ^-6s=1us。
    对于11.0592MHZ的晶振,t0=12/(11.0592*10^6)s≈1.09us

    求N0:
    若初值为0,则12MHZ晶振发生一次中断需要时间:t=t0* 65536=65.536ms
    这个t在程序中不好处理,所以加入初值,使t为一个整数,比如50ms,此时若想延时1s,只需中断20次即可。
    当t=50ms时,计数器加的数为:50* 10^-3s/(1*10 ^-6s)=50000,所以初始值为:N0=65536-50000=15536

    所以每次中断计数器溢出清零后,需重新给计数器设置初值15536,把它放入高8位和低8位寄存器。
    高8位存放:
    TH0(TH1)=(65536-50000)/256=15536/256=60(等式一)
    低8位存放:
    TL0(TL1)=(65536-50000)%256=15536%256=176(等式二)

    至于为什么对256取余和取商,这里就不在解释(记住就好),学过算法的朋友应该知道,利用分治思想求大整数乘法,分而治之的“分”可能会用的这种方法。

    从上面也看到,每50ms产生依次中断,所以等式一和等式二都减了50000(us),若20ms产生一次中断,则:
    TH0(TH1)=(65536-20000)/256=45536/256=177
    TL0(TL1)=(65536-20000)%256=45536%256=224

    12MHZ晶振的装载初值程序如下:

    //12MHZ重装载初值,定时器0
    TH0=65536-50000/256;
    TL0=65536-50000%256;
    

    若是11.0592MHZ晶振,之前说过,计数器+1的时间约为1.09us,若t0=50ms,则N=50* 10^3s/(1.09*10 ^-6s)≈45872

    11.0592MHZ晶振的装载初值程序如下:

    //11.0592MHZ重装载初值,定时器0,中断间隔50ms
    TH0=65536-45872/256;
    TL0=65536-45872%256;
    

    2、定时器/计数器工作方式寄存器TMOD(Timer Mode)

    位序号D7D6D5D4D3D2D1D0
    位符号GATEC/TM1M0GATEC/TM1M0

    上表的寄存器 低四位为T0定时器,高四位为T1定时器。
    GATE——顾名思义,门,为门控制位

    GATE=0,定时器/计数器启动和停止受TCON寄存器(下一部分总结)中TR0(定时器0时)或TR1(定时器1时)控制,TR(0或1)=1时启动相应定时器,TR(0或1)=0时停止相应定时器。

    GATE=1,定时器/计数器启动和停止受TCON寄存器中TR0(定时器0时)或TR1(定时器1时)和外部中断引脚INT0或INT1俩者共同控制

    C/T——Counter/Timer,定时器和计数器选择位,该位为1时是计数器模式,为0时是定时器模式。

    M1M0——工作方式选择。下表所示(记)

    M1M0工作方式
    00方式0,为13位定时器/计数器
    01方式1,为16位定时器/计数器
    10方式2,8位初值自动重装的8位定时器/计数器
    11方式3,仅适用于T0,分成俩个8位计数器,T1停止计数

    我们之前计算的装载值N0是方式1的,方式0和方式2的计算类似,我们目前只用方式1的16位寄存器,之后博客中再总结方式0、2、3。

    编写程序时需要选择使用定时器/计数器0还是1,此时要对TMOD寄存器的D7和D3的GATE进行操作,需要选择使用定时器还是计数器,此时需要对TMOD寄存器的俩个C/T位进行操作,需要选择工作方式,此时需要对TMOD寄存器的M1M0位进行操作。

    查看头文件:
    在这里插入图片描述

    没有对该寄存器的每一位再重新定义,所以不能对寄存器每位单独操作。现举例说明:

    (1)使用定时器0工作方式1

    使用定时器0,若只受TCON寄存器的TR0控制启动和停止,低4位的GATE位为0,采用定时器,所以C/T位为0,方式1,所以M1M0位为01,所以TMOD寄存器的状态值:00000001,即0x01

    程序:

    TMOD=0x01;
    

    (2)使用计数器1工作方式1

    采用计数器1,所以TMOD高4位GATE=0(只受TR0控制),C/T位为1,M1M0位为01,所以TMOD的状态值:01010000,即0x50

    程序:

    TMOD=0x50;
    

    (3)使用定时器1工作方式1、计数器0工作方式1

    采用定时器1和计数器0,所以高4位和低4位的C/T位分别时0和1,GETA位都为0(分别只受TR1和TR0控制),M1M0位都为01,所以TMOD寄存器的状态值:00010101,即0x15

    程序:

    TMOD=0x15;
    

    3、定时器/计数器控制寄存器TCON(Timer Control)

    位序号D7D6D5D4D3D2D1D0
    位符号TF1TR1TF0TR0IE1IT1IE0IT0

    上表从低位到高位:D0、D1是外部中断0,D2、D3是外部中断1,D4、D5是定时器中断0、D6、D7是定时器中断1

    D7——>TF1定时器1溢出标志位(Timer Flag)
    当定时器1计满溢出时,由硬件使IF1置1,并且申请中断,当进入中断服务函数后该位自动清零。

    D6——>TR1定时器1运行控制位(Timer Running)
    上一部分TMOD寄存器总结过,当GATE=0时,定时器/计数器启动和停止仅受TCON寄存器的TR0或TR1控制,当GATE=1时定时器/计数器启动和停止受TCON寄存器的(TR0或TR1)和(INT0或INT1)引脚的电平状态一起控制。所以当TMOD寄存器的GATE=1时,且INT1引脚为高电平,TR1软件置1启动定时器1,当TMOD寄存器的GATE=0时,TR1软件置1启动定时器1,不论GATE=1或0,TR1位软件置0即可关闭计数器1。

    D5——>TF0定时器0溢出标志位(Timer Flag)
    当定时器0计满溢出时,由硬件使IF0置1,并且申请中断,当进入中断服务函数后该位自动清零。

    D4——>TR0定时器0运行控制位(Timer Running)
    当TMOD寄存器GATE=0时,定时器/计数器启动和停止仅受TCON寄存器的TR0或TR1控制,当GATE=1时定时器/计数器启动和停止受TCON寄存器的(TR0或TR1)和(INT0或INT1)引脚的电平状态一起控制。所以当TMOD寄存器的GATE=1时,且INT0引脚为高电平,TR0软件置1启动定时器0,当TMOD寄存器的GATE=0时,TR0软件置1启动定时器0,不论GATE=1或0,TR0位软件置0即可关闭计数器0。

    D3、D2、D1、D0是关于外部中断的,定时器中断用不到这四位,我们之后博客涉及到再详述。

    五、总结+面向程序

    到此为止,我们总结了四个寄存器分别是:中断允许寄存器IE、中断优先级寄存器IP、定时器/计数器工作方式寄存器TMOD、定时器/计数器控制寄存器TCON。

    中断允许寄存器IE
    EA是全局中断允许位,如果要使单片机使用中断,该位必须打开,所以程序开头必须对该位软件置1,从D0——D5是按照默认优先级顺序排列的,这6位是中断源允许位,单片机使用什么中断源,就将对应位软件置1。并且EA寄存器各位在头文件中都进行了定义,所以可以对任意一位单独操作。

    中断优先级寄存器IP
    该寄存器是设置高优先的,对于一般性工程,优先级按照默认顺序即可,没有必要使用IP,所以编写程序时,一般不使用该寄存器。

    定时器/计数器工作方式寄存器TMOD
    该寄存器高4位控制定时器/计数器1,低4位控制定时器/计数器0,D7、D3位的GATE一般为低电平,所以 计数器/定时器的通断只受TCON寄存器的TR1或TR0控制。D6、D2位C/T是定时器、计数器选择位,该位必须选。此外D5、D4和D1、D0的M1M0是工作方式选择位,一般为方式1的16位定时器/计数器,所以M1M0位为01。

    此外需要注意该寄存器没有对每一位进行定义,程序中只能TMOD=0x…来设置TMOD寄存器。

    定时器/计数器控制寄存器TCON
    定时器中断中只用到高4位,其中D6位的TR1和D4位的TR0是需要软件操作的,因为与TMOD寄存器的GATE有关系,所以需要TR0、TR1来启动定时器/计数器

    程序流程:
    ①TMOD设置GATE、C/T、M1M0(TMOD寄存器)
    ②装载初值TH(0/1),TL(0/1)
    ③EA=1 打开全局中断允许位,允许使用中断(IE寄存器)
    ④ET0=1或ET1=1(定时器中断,用不到外部中断)(IE寄存器)
    ⑤TR0=1或TR1=1,启动定时器(第一步设置GATE=0时)(TCON寄存器)

    例:利用定时器1工作方式1实现LED每0.5s闪烁一次

    根据上面的程序流程:
    ①定时器1工作方式1,所以TMOD高四位GATE=0,C/T=0,M1M0=01,所以TMOD=0x10;
    ②11.0592HZ晶振,装载初值:TH1=(65536-45875)/256;TL1=(65536-45875)%256;
    ③EA=1;
    ④ET1=1;
    ⑤TR1=1;

    代码:

    TMOD=0x10;
    TH1=(65536-45872)/256;
    TL1=(65536-45872)%256;
    EA=1;
    ET1=1;
    TR1=1;
    

    写中断服务函数,格式:
    void 函数名()interrupt 中断号 using 工作组
    {
    函数体
    }
    ①中断服务函数是无返回值的函数,所以用关键字void
    ②中断号,与默认的优先级顺序一致,定时器0的中断号为1,定时器1的中断号为3
    ③工作组为单片机RAM区从0-31总共32字节分成四组工作寄存器,每组为8位寄存器,可以指定使用哪一组工作寄存器,C51编译时会自动分配工作组,所以“using 工作组”可以省略不写。

    本例题中每50ms产生一次中断,产生10次中断为0.5s,所以每产生10次中断对LED进行一次操作。

    void T1_time() interrupt 3
    {
    	num++;
    	if(num==10)
    	{
    		num=0;
    		led1=~led1;
    	}
    }
    

    但是每次产生中断后,计数器清零,计数器是从0开始重新计数的,所以每产生一次中断,就应该重新进行一次初始值装载。

    完整程序:

    #include <reg52.h>
    #define uint unsigned int
    uint num;
    sbit led1=P1^0;
    void main()
    {
    TMOD=0x10;
    TH1=(65536-45872)/256;
    TL1=(65536-45872)%256;
    EA=1;
    ET1=1;
    TR1=1;
    
    while(1);//程序停到这里。一直等待中断
    }
    
    void T1_time() interrupt 3
    {
    	TH1=(65536-45872)/256;
    	TL1=(65536-45872)%256;
    	num++;
    	if(num==10)
    	{
    		num=0;
    		led1=~led1;
    	}
    }
    

    六、例子

    1、流水灯和数码管综合(中断)

    题:
    用定时器0工作方式1实现数码管前俩位59s循环计时,定时器1工作方式1实现流水灯间隔1s闪烁。

    分析:.
    定时器1工作方式1实现流水灯与上节中例子一致,现考虑定时器0工作方式1实现数码管前俩位59s循环计时,数码管显示数字分为个位和十位,俩个数字分开显示,打开数码管2位选,送入个位数字,打开数码管1位选,送入十位数字,数码管显示数字是一直存在的,与中断无关,中断只与数字的改变有关系,所以单独建立数码管显示函数,主函数循环调用数码管显示函数即可。

    定时器0实现数码管程序:

    
    #include <reg52.h>
    #define uint unsigned int
    #define uchar unsigned char
    uchar code table[]={
    0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71
    };
    uchar num;
    uint ge ,shi;
    sbit dula=P2^6;
    sbit wela=P2^7;
    void  display_time(uint ,uint);
    void delay_ms(uint);
    void main()
    {
    	
    	TMOD=0x01;
    	TH0=(65536-45872)/256;
    	TL0=(65536-45872)%256;
    	EA=1;
    	ET0=1;
    	TR0=1;
    	while(1)
    	{
    		display_time(ge ,shi);//时间一直显示中
    	}
    }
    
    void T0_time()interrupt 1
    {
    TH0=(65536-45872)/256;//每50ms产生一次中断
    TL0=(65536-45872)%256;//所以每20次中断,个位+1
    num++;
    if(num==20)
    {
    	num=0;
    	ge++;
    	if(ge==10)
    	{
    		shi++; //时间进位
    		ge=0;
    	}
    	if(shi==6)
    	shi=0; //时间归零
    }
    
    }
    
    void  display_time(uint ge ,uint shi)
    {
    	wela=1;
    	P0=0xfd; //选择数码管2
    	wela=0;
    	
    	dula=1;
    	P0=table[ge];//送入个位数字
    	dula=0;
    	delay_ms(5);
    
    	wela=1;
    	P0=0xfe; //选择数码管1
    	wela=0;
    
    	dula=1;
    	P0=table[shi];//送入十位数字
    	dula=0;	
    	delay_ms(5);
    
    }
    void delay_ms(uint ms)
    {
    	uint i,j;
    	for(i=ms;i>0;i--)
    	for(j=110;j>0;j--);
    }
    
    

    注意在上述程序的display_time()函数中,对数码管2和数码管1操作完毕后,都要延时一点时间,保证俩个数码管互不影响。

    再加上定时器1控制LED,完整程序如下:

    
    #include <reg52.h>
    #define uint unsigned int
    #define uchar unsigned char
    uchar code table[]={
    0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71
    };
    uchar num0,num1;
    uint ge ,shi;
    sbit dula=P2^6;
    sbit wela=P2^7;
    sbit led1=P1^0;
    void  display_time(uint ,uint);
    void delay_ms(uint);
    
    void main()
    {
    	TMOD=0x11;//写在一起
    	//定时器0
    	//TMOD=0x01;
    	TH0=(65536-45872)/256;
    	TL0=(65536-45872)%256;
    	EA=1;
    	ET0=1;
    	TR0=1;
    	
    	//定时器1
    	//TMOD=0x10;
    	TH1=(65536-45872)/256;
    	TL1=(65536-45872)%256;
    	EA=1;
    	ET1=1;
    	TR1=1;
    	while(1)
    	{	
    		display_time(ge ,shi);//时间一直显示中
    	}
    }
    
    void T0_time()interrupt 1 //数码管处理 T0定时器
    {
    	TH0=(65536-45872)/256;//每50ms产生一次中断
    	TL0=(65536-45872)%256;//所以每20次中断,个位+1
    	num0++;
    	if(num0==20)
    	{
    		num0=0;
    		ge++;
    		if(ge==10)
    		{
    			shi++; //时间进位
    			ge=0;
    		}
    		if(shi==6)
    		shi=0; //时间归零
    	}
    }
    
    void T1_time()interrupt 3 //LED处理 T1定时器
    {
    	TH1=(65536-45872)/256;
    	TL1=(65536-45872)%256;
    	num1++;
    	if(num1==20)
    	{
    		num1=0;
    		led1=~led1;
    	}
    }
    
    void  display_time(uint ge ,uint shi)
    {
    	wela=1;
    	P0=0xfd; //选择数码管2
    	wela=0;
    	
    	dula=1;
    	P0=table[ge];//送入个位数字
    	dula=0;
    	delay_ms(5);
    
    	wela=1;
    	P0=0xfe; //选择数码管1
    	wela=0;
    
    	dula=1;
    	P0=table[shi];//送入十位数字
    	dula=0;	
    	delay_ms(5);
    }
    void delay_ms(uint ms)
    {
    	uint i,j;
    	for(i=ms;i>0;i--)
    	for(j=110;j>0;j--);
    }
    

    2、24小时制时钟

    1) 方法一(核心算法不一样)

    直接计算小时的个、十位,分钟的个、十位,秒钟的个、十位,然后再分别在六个数码管显示

    #include <reg52.h>
    #define uint unsigned int
    #define uchar unsigned char
    uchar code table[]={
    0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71
    };
    uchar num;
    uint hour_ge,hour_shi,minute_ge, minute_shi,second_ge,second_shi;
    sbit dula=P2^6;
    sbit wela=P2^7;
    void  display_time(uint,uint,uint,uint,uint,uint);
    void delay_ms(uint);
    void main()
    {
    	TMOD=0x01;
    	TH0=(65536-45872)/256;
    	TL0=(65536-45872)%256;
    	EA=1;
    	ET0=1;
    	TR0=1;
    	while(1)
    	{	
    		display_time(hour_shi,hour_ge,minute_shi,minute_ge,second_shi,second_ge);
    		//时间一直显示中
    	}
    }
    
    void T0_time()interrupt 1 //数码管处理 T0定时器
    {
    	TH0=(65536-45872)/256;//每50ms产生一次中断
    	TL0=(65536-45872)%256;//所以每20次中断,个位+1
    	num++;
    	if(num==20)
    	{
    		num=0;
    		second_ge++;//秒+1
    	}
    	if(second_ge==10)
    	{
    		second_ge=0;
    		second_shi++;
    		if(second_shi==6)
    		{
    			second_shi=0;
    			minute_ge++;
    			if(minute_ge==10)
    			{
    				minute_ge=0;
    				minute_shi++;
    				if(minute_shi==6)
    				{
    					minute_shi=0;
    					hour_ge++;
    					if(hour_ge==10)
    					{
    						hour_ge=0;
    						hour_shi++;
    						if(hour_shi==2&&hour_ge==4)
    						{
    							hour_shi=0;
    							hour_ge=0;
    						}
    
    					}	
    				}	
    			}
    		}
    	}
    	
    }
    
    
    
    void display_time(uint hour_shi,uint hour_ge,uint minute_shi,uint minute_ge,uint second_shi,uint second_ge)
    {
    	wela=1;
    	P0=0xdf;//第六个数码管送入second_ge
    	wela=0;
    
    	dula=1;
    	P0=table[second_ge];
    	dula=0;
    	delay_ms(1);
    
    	wela=1;
    	P0=0xef;//第五个数码管送入second_shi
    	wela=0;
    	
    	dula=1;
    	P0=table[second_shi];
    	dula=0;
    	delay_ms(1);
    
    	wela=1;
    	P0=0xf7;//第四个数码管送入minute_ge
    	wela=0;
    
    	dula=1;
    	P0=table[minute_ge];
    	dula=0;
    	delay_ms(1);
    
    	wela=1;
    	P0=0xfb;//第三个数码管送入minute_shi
    	wela=0;
    
    	dula=1;
    	P0=table[minute_shi];
    	dula=0;
    	delay_ms(1);
    
    	wela=1;
    	P0=0xfd;//第二个数码管送入hour_ge
    	wela=0;
    
    	dula=1;
    	P0=table[hour_ge];
    	dula=0;
    	delay_ms(1);
    	
      	wela=1;
    	P0=0xfe;//第一个数码管送入hour_shi
    	wela=0;
    
    	dula=1;
    	P0=table[hour_shi];
    	dula=0;
    	delay_ms(1);
    
    }
    
    void delay_ms(uint ms)
    {
    	uint i,j;
    	for(i=ms;i>0;i--)
    	for(j=110;j>0;j--);
    }
    
    

    2) 方法二(核心算法不一样)

    通过定时器对时间按照秒计时,然后再把秒计算成时.分.秒的形式。但是按照24小时制计时,总共的秒数:60* 60* 24=86400s>65536(单片机无符号整型最大应该是2^16,16位,俩个字节,如果有误,请朋友们评论区提醒我),而12小时的秒数为60* 60*12=43200,可以按照这个数计秒数,当秒数小于这个数,说明是前半天,秒数大于这个数,就是后半天,计算后半天可以在现在的时间基础上+12小时再显示。

    完整程序:

    #include <reg52.h>
    #define uint unsigned int
    #define uchar unsigned char
    uchar code table[]={
    0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71
    };
    uchar num;
    uint hour_ge,hour_shi,minute_ge, minute_shi,second_ge,second_shi;
    uint time,hour,minute,second;
    uint m;
    sbit dula=P2^6;
    sbit wela=P2^7;
    void  display_time(uint,uint,uint,uint,uint,uint);
    void delay_ms(uint);
    void main()
    {
    	TMOD=0x01;
    	TH0=(65536-45872)/256;
    	TL0=(65536-45872)%256;
    	EA=1;
    	ET0=1;
    	TR0=1;
    	while(1)
    	{	
    		display_time(hour_shi,hour_ge,minute_shi,minute_ge,second_shi,second_ge);
    		//时间一直显示中
    	}
    }
    
    void T0_time()interrupt 1 //数码管处理 T0定时器
    {
    	TH0=(65536-45872)/256;//每50ms产生一次中断
    	TL0=(65536-45872)%256;//所以每20次中断,个位+1
    	num++;
    	if(num==20)
    	{
    		num=0;
    		time++;//秒+1
    	}
    	if(time==43201)//进入后半天
    	{
    		time=1; 
    		m=12; 
    	}
    	hour=m+time/3600;//前半天时m=0,后半天时m=12
    	minute=(time-hour*3600)/60;
    	second=time%60;
    
    	hour_shi=hour/10;
    	hour_ge=hour%10;
    	minute_shi=minute/10;
    	minute_ge=minute%10;
    	second_shi=second/10;
    	second_ge=second%10;
    
    	if(hour==23&&minute==59&second==59)//每天最后1秒
    	  time=0;		
    	
    }
    
    void display_time(uint hour_shi,uint hour_ge,uint minute_shi,uint minute_ge,uint second_shi,uint second_ge)
    {
    	wela=1;
    	P0=0xdf;//第六个数码管送入second_ge
    	wela=0;
    
    	dula=1;
    	P0=table[second_ge];
    	dula=0;
    	delay_ms(1);
    
    	wela=1;
    	P0=0xef;//第五个数码管送入second_shi
    	wela=0;
    	
    	dula=1;
    	P0=table[second_shi];
    	dula=0;
    	delay_ms(1);
    
    	wela=1;
    	P0=0xf7;//第四个数码管送入minute_ge
    	wela=0;
    
    	dula=1;
    	P0=table[minute_ge];
    	dula=0;
    	delay_ms(1);
    
    	wela=1;
    	P0=0xfb;//第三个数码管送入minute_shi
    	wela=0;
    
    	dula=1;
    	P0=table[minute_shi];
    	dula=0;
    	delay_ms(1);
    
    	wela=1;
    	P0=0xfd;//第二个数码管送入hour_ge
    	wela=0;
    
    	dula=1;
    	P0=table[hour_ge];
    	dula=0;
    	delay_ms(1);
    	
      	wela=1;
    	P0=0xfe;//第一个数码管送入hour_shi
    	wela=0;
    
    	dula=1;
    	P0=table[hour_shi];
    	dula=0;
    	delay_ms(1);
    
    }
    
    void delay_ms(uint ms)
    {
    	uint i,j;
    	for(i=ms;i>0;i--)
    	for(j=110;j>0;j--);
    }
    
    展开全文
  • ECharts显示24小时时间数据的一种办法

    万次阅读 热门讨论 2016-12-18 21:59:13
    通过ECharts3的时间轴,我们可以把一个采集的设备数据呈现在图上面,可是如何漂亮呈现固定的24小时的数据,笔者是通过ECharts的文档,做出了上图的效果。 为什么需要呈现24小时的数据呢?通过
  • 掌握基本规律,轻松玩转24点游戏

    千次阅读 2021-06-16 04:10:25
    关键词:24点如果说起扑克牌,你会想起什么?斗地主、魔术还是赌神?...24点游戏,就是利用一副扑克牌(去掉大小王,共52张),然后随机抽取4张牌,通过4个数字进行不重复使用,计算得到24的游戏。因为是游戏,就考...
  • 运营一个需求,要查询一些数据,每1小时一次的数据 ,Excel表格如下: 第一肯定要是用 GROUP BY 然后 一、单表 SELECT DATE_FORMAT( create_time, '%Y-%m-%d %H' ) as time, COUNT( DISTINCT member_id) as ...
  • 通过北京市历史24小时气象和大气污染物数据,采用普通线性回归、岭回归和Lasso回归进行建模分析,对比模型预测效果选择最优模型,预测之后12小时天气数据中PM2.5的值 二、项目背景 在北京,冬天最令人头疼的就是雾...
  • mysql怎么在当前时间增加一小时

    千次阅读 2021-03-04 02:35:31
    我就废话不多说了,大家还是直接看代码吧~create or replace function aa1(a1 integer[],a2 bigint) returns void AS $$declare ii integer;declare num integer; begin II:=2021-01-16 17:49:22条件查询-模糊匹配...
  • 十二小时制与二十四小时制详解

    千次阅读 2012-03-21 14:26:35
    今天晚上居然被这个十二小时制糊弄晕了,于是在网上一阵狂搜,总算基本明白,但还是有些疑问,这个十二小时制和二十四小时制还真的不是件简单的事情,大家点进文章前,请先思考两个问题,12:58PM到底是白天还是晚上...
  • 24点算法讲解与实现

    万次阅读 2018-01-04 16:17:04
     博主曾在网上看到有很多关于24点的算法,但很多都是没有找全所有表达式,要么就是没有去重,而且搜索的时间过长,有些慢的要半个小时才能得到结果。所以经过我的不懈努力,经过几天的研究,目前我的这个24点的算法...
  • 用户访问session进行分析

    千次阅读 2018-07-17 12:17:14
    一、模块的目标:用户访问session进行分析 1、可以根据使用者指定的某些条件,筛选出指定的一些用户(有特定年龄、...3、按时间比例,比如一天有24小时,其中12:00~13:00的session数量占当天总session数量的50...
  • 2020.12.7 在以下几个选项中,正确的从小到大的排序是( ) A 地球<太阳系<可观测宇宙<银河系 B 地球<太阳系<银河系<可观测宇宙 C 太阳系<地球<银河系<可观测宇宙 D 银河系<太阳系<...
  • 我们出来打工没有人容易的,无论外包还是正式员工,本质上都是没有什么区别的,既然一天都是24小时既然都是打工,那就尽自己最大的努力,积极向上的去面对每一天。 前人栽树后人乘凉,现在的为10年后的你栽的树有多...
  • 全球24个时区的划分

    万次阅读 2017-09-26 13:53:11
    全球24个时区的划分 ...过去世界各地原本各自订定当地时间,但随着交通和电讯的发达,各地交流日益频繁,不同的地方时间,造成许多困扰,于是在西元1884年的国际会议上制定了全球性的标准,明定以英国伦
  • HCIP-H12-223单选题库

    千次阅读 多人点赞 2021-04-21 10:37:40
    查看VTY类型用户界面视图下允许接入的协议配置是否正确 答案A 【答案解析】telnet登录的故障原因有很多,首先要检查的还是网络的连通性,如果网络没有连通,客户端是无论如何都无法登录telnet服务器的。所以首先...
  • [摘要]:本文提出了一种完全通过点点技术实现的电子现金系统,它使得在线支付能够直接由一方发起并支付给另外一方,中间不需要通过任何的金融机构。虽然数字签名(Digital signatures)部分解决了这个问题,但是...
  • 明敏 发自 凹非寺量子位 报道 | 公众号 QbitAI被苹果M1一通狂虐之后,英特尔的反击来了。刚刚,英特尔放话第12代酷睿i9不仅比苹果M1 Max还要快,而且是有史以来速度最快的移动...
  • 在到午夜12点前的24小时中的最强风速(km / h) WindDir9am 上午9点的风向 WindDir3pm 下午3点的风向 WindSpeed9am 上午9点之前每个十分钟的风速的平均值(km / h) WindSpeed3pm...
  • NewTech:2019年5月4日《巴菲特股东大会》—6小时20多个亮点50多个问答(划重点) 导读 巴菲特股东大会,即伯克希尔·哈撒韦股东大会,每年于五月的第一个星期六召开。 北京时间5月4日晚,伯克希尔·哈撒韦公司...
  • 电脑选择待机休眠的时候大约耗电功率是多少W?...电脑选择待机休眠的时候...Windows7的电源选项中,可分别设定屏幕与电脑的休眠时间,有趣的是,当显示器休眠,主机还是照常运作。从数据上来看,闲置状态下,屏幕与...
  • 大学生网络直播的看法

    千次阅读 2018-12-14 19:26:52
    大多数学生还是喜欢这个平台,如果有机会,还是有很多学生积极参与其中的。也让我更好的认识到这个平台,我认为直播这个行业还有进步与继续发展的空间。 不足 但在调查过程中也发现自己不足之处,此次调查对象,...
  • 我每天的24小时

    千次阅读 热门讨论 2008-08-28 07:35:00
    为此,在此向大家嗮嗮我的每天的24小时,希望大家能理解哦,特别是那些经常抱怨我不能时时在线,及时解答问题的读者朋友们。 近几年来,我一直非常讨厌,而又十分无奈地接受了我现在的这种纯工作(至少90%以上是...
  • 另外,小编也有根据以下总结内容,录制了JVM讲解视频。里面有个用visio画的JVM内部结构图,每部分的作用都有详细讲解,希望能有帮助。网址:https://edu.csdn.net/lecturer/board/10494 1.java自动管理堆(heap...
  • 1 月 27 日,历史上的今天,Jim Clark 离开硅图公司;苹果推出 iPad;甲骨文宣布完成包括 Solaris 在内的太阳微系统公司收购。
  • 小李的Build之路(上) 转自:刘欣码农翻身2016-07-10 摘要:手工Build的烦恼要...上班第一天,CTO兼架构师兼项目经理兼开发组长老张把小李叫去,谆谆教导说:“小李啊,我看了你的简历,我你在公司的发展还是挺看好的,...
  • (5)UDP支持一一 一多 多多的交互通信; (6)UDP的首部开销小,只有8字节. TCP和UDP的区别 (1)TCP是可靠传输,UDP是不可靠传输; (2)TCP面向连接,UDP无连接; (3)TCP传输数据有序,UDP不保证数据的有序性...
  • 其实在购买高层的住宅,购房者亲睐的楼层还是中间楼层。 目前开发商比较适用的高层定价法则是:底层的房源一般是,然后逐步的往上加价,幅度是每高一层,平均加10-100元不等,少数的品牌楼盘可能幅度更...
  • 目录 第1章介绍... 1 1.1.什么是Wireshark.... 1.1.1.主要应用......1.1.6.多种协议解码提供支持... 2 1.1.7.开源软件... 2 1.1.8.Wireshark不能做的事... 2 1.2.系通需求... 2 1.2.1.一般说明... 2 ...
  • 7行代码让B站崩溃3小时,竟因“一个诡计多端的0”

    千次阅读 多人点赞 2022-07-25 00:09:22
    (手动狗头)时隔一年,背后“真凶”现在终于被阿B披露出来——没想到吧,就是这么简单几行代码,直接干趴B站两三个小时,搞得B站程序员彻夜无眠头发狂掉。你可能会问,这不就是个普普通通用来求最大公...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 81,893
精华内容 32,757
热门标签
关键字:

对时是12小时还是24