《单片机课程设计总结报告电子万历的设计与制作.doc》由会员分享,可在线阅读,更多相关《单片机课程设计总结报告电子万历的设计与制作.doc(48页珍藏版)》请在三一办公上搜索。
1、单片机课程设计总结报告题 目:电子万年历的设计与制作专 业:班 级:姓 名:指导教师:二 00 七 年 三 月 十日一、设计目的及意义(1)在学习了数字电子技术和单片机原理及接口技术课程后,为了加深对理论知识的理解,学习理论知识在实际中的运用,培养动手能力和解决实际问题的经验让学生接触专用时钟芯片DS1302,并会用DS1302芯片开发时钟模块,应用到其他系统中去。熟悉WAVE软件调试程序和仿真.(2)、通过实验提高对单片机的认识;(3)通过实验提高焊接、布局、电路检查能力;(4)、通过实验提高软件调试能力;(5) 进一步熟悉和掌握单片机的结构及工作原理。(6) 通过课程设计,掌握以单片机核心
2、的电路设计的基本方法和技术,了解表关电路参数的计算方法。(7)通过实际程序设计和调试,逐步掌握模块化程序设计方法和调试技术。(8) 通过完成一个包括电路设计和程序开发的完整过程,使学生了解开发一单片机应用系统的全过程,为今后从事相应打下基础。二、设计内容要求电子万年历能显示阳历年、月、日、星期、小时、分、秒和阴历月、日,在显示阴历时间时能标明是否为闰年。三、方案选择与实验基本原理。按照系统设计功能的要求,初步确定设计系统由主控模块、时钟模块、显示模块、键盘接口模块共4个模块组成,电路系统构成框图如图L1所示。主控芯片使用51系列AT89c52单片机,时钟芯片使用美国DALLAs公司推出的一种高
3、性能、低功耗、带RAM的实时时钟DSl302。采用DSl 302作为主要计时芯片,可以做到计时准确。更重要的是,DSl302可以在很小电流的后备电源(2555v电源,在25v时耗电小于300 nA)下继续计时,并可编程选择多种充电电流来对后备电源进行慢速充电,可以保证后备电源基本不耗电。 显示模块采用普通的共阳LED数码管,键输入采用查询法实现调整功能。 图1 电子万年历电路系统构成框图系统硬件电路的设计图2为电子万年历电路设计原理图,系统由主控制器AT89C52、时钟芯片DSl302、串口显示电路及键扫描电路组成。 图2电子万年历电路设计原理图3.3.1 主控制器AT89C52 ATMEL公
4、司生产的AT89C52单片机采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性F1ash程序存储器。它是一种高性能、低功耗的8位cMos微处理芯片,市场应用最多。主要性能特点有: 8KH F1ash ROM,可以擦除1000次以上,数据保存10年256字节内部RAM。电源控制模式 时钟可停止和恢复 空闲模式; 掉电模式。6个中断源。4个中断优先级。4个8位IO口。全双工增强型UART。3个16位定时计数器,To、T1(标准80c51)和增加的T2(捕获和比较)。全静态工作方式:0-24MH z。3.32 时钟电路DSl302 1ds1302的性能特性 实时时钟,可对秒、分、时、日、
5、周、月以及带闰年补偿的年进行计数; 用于高速数据暂存的318位RAM; 最少引脚的串行Io; 2555V电压工作范围; 25V时耗电小于300 nA; 用于时钟或RAM数据读写的单字节或多字节(脉冲方式)数据传送方式; 简单的3线接口; 可选的慢速充电(至Vcc1)的能力。 D51302时钟芯片包括实时时钟日历和3l字节的静态RAM。它经过一个简单的串行接口与微处理器通信。实时时钟 日历提供秒、分、时、日、周、月和年等信息。对于小于31天的月利月末的日期自动进行调整,还包括闰年校正的功能。时钟的运行可以采用24H或带AM(上午)PM(下午)的12H格式。采用三线接口与cPu进行同步通信,并可采
6、用突发方式一次传送多个字节的时钟信号或RAM数据。Dsl302有主电源后备电源双电源引脚:Vcc1在单电源与电他供电的系统中提供低电源,并提供低功率的电池备份;Vcc2在双电源系统中提供主电源,在这种运用方式中,Vcc1连接到备份电,以便在没有主电源的情况下能保存时间信息以及数据。Ds1302由Vcc1或vcc2中较大者供电。当vcc2大于Vcc1十o2v时,vcc2v给DSl302供电;当vcc2小于Vcc1时,DSl302由Vcc1供电。 2DSl302数据操作原理 Dsl 302在任何数据传送时必须先初始化,把RsT脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在scLK的上升
7、沿被输入。无论是读周期还是写周期,开始8位指定40个寄存器中哪个将被访问到。在开始8个时钟周期,把命令字节装入移位寄存器之后,另外的时钟周期在读操作时输出数据,在写操作时写人数据。时钟脉冲的个数在单字节方式下为8加8,在多字节方式下为8加字节数,最大可达248字节数。 如果在传送过程中置RsT脚为低电平,则会终止本次数据传送,并且I()引脚变为高阻态。上电运行时,在 Vcc2.5 V之前 ,RsT脚必须保持低电平。只有在scLK为低电平时,才能将RsT置为高电平。D引302的引脚及内部结构图如图33所示,表31为各引脚的功能图3 DS1302引脚及内部结构 表1 DS102引脚功能 Dsl30
8、2的控制字如图34所示。控制字节的最高有效位(位7)必须是逻辑1;如果它为0,则不能把数据写入到Dsl302中。位6如果为0,则表示存取日历时钟数据;为1表示存取RAM数据。位51(A4一A0)指示操作单元的地址。最低有效位(位0)如为0,表示要进行写操作;为1表示进行读操作。控制字节总是从最低位开始输入输出。 为了提高对32个地址的寻址能力(地址命令位15逻辑1),可以把时钟日历或RAM寄存器规定为多字节(burst)方式。位6规定时钟或RAM,而位0规定读或写。在时钟日历寄存器中的地址931或RAM寄存器中的地址31不能存储数据。在多字节方式中,读或写从地址0的位0开始。必须按数据传送的次
9、序写最先的8个寄存器。但是,当以多字节方式写RAM时,为了传送数据不必写所有31字节。小管是否写了全部31字节,所写的每一字节都将传送至RAM。 图4 DS1302的控制字 图5 DS1302数据读/写时序 Dsl302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。其H历、时间寄存器及其控制字见表32,其中奇数为读操作,偶数为写操作。 时钟暂停:秒寄存器的位7定义位时钟暂停位。当它为1时,DS1302停止振荡,进入低功耗的备份方式.通常在对Dsl302进行写操作时(如进入时钟调整程序),停止振荡。当它为0时,时钟将开始启动。 AMPM1224小时方式:小时寄存
10、器的位7定义为12或24小时方式选择位。它为高电平时,选择12小时方式。在此方式下,位5是AMPM位,此位是高电平时表示PM,低电平表示AM。在24小时方式下,位5为第二个10小时位(20一23h)。 表2 内部寄存器地址和内容 Dsl302的品振选用32768kH z,电容推荐值为6PF,因为振荡频率较低,也可以不接电容对计时精度影响不大。333 显示电路的设计 显示部分采用普通的共阳数码管显示,采用动态扫描,以减少硬件电路。考虑到一次扫描19位数的管显示时会出现闪烁情况,设计时19个数码管分3排同时扫描。第一排6个数码管分别为千年、百年、十午、年、十月、月,第二排6位数码管分别为十时、时、
11、十分、分、十秒、秒,第三排7位数码管分别为星期、阴历十月、阴历月、阴历十日、阴历日、十日、日。显示时采用串行口输出段码,用3片74ls164来驱动3排数码管,这样扫描一次只需7ms。 741ls164内部为8个D触发器,用以实现数据的串行移位,741ls164特性见表3。单片机以串行口方式0移仿寄存器方式)输山数据,3片74Lsl64作为3排共阳数码管的串并转换显示接口。 74ls164为TTL单向8位移位寄存器,可实现串行输入,并行输出。其中A、B(第1、2脚)为串行数据输入端,2个引脚按逻辑“与”运算规律输入信号,共一个输入信号时可并接,共同作为输入脚。cP(第8脚)为时钟输入端,可连接到
12、串行口的TxD端。每一个时钟信号的上升沿加到cP端时,移位寄存器移一位。8个时钟脉冲过后,8位二进制数全部移入74lsl 64中。MR脚(第9脚)为复位端,当该脚为低电平时,移位寄存器各位复0;只有当它为高电平时,时钟脉冲才起作用。Q1一Q8(第36和10一13引脚)并行输出端分别接数码管的ha(因为串行n从低位开始传送)各段对应的引脚上。在给出了8个脉冲后,最先进入741。s164的第1个字Ll数据到达厂最高位。再来1个脉冲,第1个脉冲就会从最高位移出,进入下个74L5164的第1位。3片741S164首尾相串,而时钟端则接在一起。这样,当输入8个脉冲时,从9片机RXD端输出的第1字节数据就
13、进入了第1片74LSl64中,而当第2个8个脉冲到来后,第l字节数据就进入了第2片74Lsl64,而随后的第2字节的数据则进入了第1片74LS164。这样,当第3个8个脉冲完成后,首次送出的数据被送到了最下面的164(第3片)中,其它数据依次出现在第二和第一片74LS164中,实现了数据在74LS164中的串行输入、并行输出。表3 74LS164特性表 在方式0状态下,串行口为同步移位寄存器方式,其波特率是固定的,为fosc12。数据由RxD(P3.0)端输入或输出,同步移位脉冲由TxD(P3.1)端输出。发送、接收数据时低位在先。所以,根据本小节下面提供的硬件电路图,在编写程序时,查共阳数码
14、管的段码的二进制数据应该将正常的共阳数码管0一9的二进制值按位反序排序,如原来的二进制为11000000(C0H),要改为00000011(03H),就能使数码管正常显示。3.3.4 键盘接口的设计由于按键只有3个,用普通按钮接10kw上拉电阻,用查询法完成读键功能。3.4系统程序的设计 因为使用了时钟芯片Dsl302,阳历程序只需从Dsl302各寄存器中读出年、周、月、日、小时、分、秒等数据,再处理即可。在首次对Dsl302进行操作之前,必须对它进行初始化,然后从Dsl302中读出数据,再经过处理后,送给显示缓冲单元。阳历程序流程图见图36所示。图6 阳历程序流程图342 时间调整程序设计
15、调整时间用2个调整按钮,1个作为移位、控制用,另外1个作为加和减用,分别定义为控制按钮、加按钮。在调整时间过程中,要调整的位与别的位应该有区别,所以增加了闪烁功能,即调整的位一直在闪烁,直到调整下一位。闪烁原理就是,让要调整的一位每隔一定时间熄灭一次,比如说50 m s。利用定时器计时,当达到50 ms溢出时,就送给该位熄灭符,在下一次溢出时。再送正常显示的值,不断交替,直到调整该位结束。此时送正常显示值给该位,再进人下一位调整闪烁程序。时间调整程序程序流程图如图37所示。343 阴历程序设计 阴历程序的实现是要靠阳历日期来推算的。要根据阳历来推算阴历日期,首先要设计算法。推算方法是,根据阳历
16、当前日期在一年中的天数来计算阴历日期。阳历一个月不是30天就是3l天(2月除外,闰年2月为29天,平年2月为28天)。阴历一年有12个月或13个月(含闰月),一个月为30天或29天。如果把一个只有29天的月称为小月,用1为标志,把30天的月称为大月,用0为标志,那么12位二进制就能表示一年12个月的大小。如果有闰月,则把闰月的月份作为“一个字节的高4位,低4位表示闰月大小,大月为0,小月为1这样一个字节就包含了所有闰月的信息。阴历春节和阳历元旦相差的天数也用一个字节表示。总共用1字节就可以存储一年中任何一天阳历和阴历的对应关系的有关数据,例如2004年的阴历和阳历对应关系如表34所列。 图7
17、时间调整程序流程图表4 2004年的阴历和阳历关系表 2004年的春节和元旦差20天,这样2004年的信息表示为:21,42H,52H,21H。其中表示12个月大小信息的字,第4位和第7位不用。第1个字节为十进制,其它的都为十六进制。按此方法,50年的阳历和阴历对应关系表总共使用200字节。 有了算法和数据以后,就可设计软件了。先要根据当前阳历的日期,算出阳历为该年中的第几天。图 3.8为计算阳历中任何一天在该年中为第几天的程序流程图。 计算出当前阳历日期为该年中的第几天后,再减去阳历该年春节和元旦的日差,如果够减则相减的结果就是阴历在该年的总第几天了。根据该数据就可以推算出具体的当前阴历日期
18、;如果不够减,则表示当的阴历年为阳历年的前一年。这种情况下,根据实际、当前阴历日期会处十阴历11月或12月,此时春节和元旦的日差减去前面计算出的当前阳历日期在阳历年为第几天的数据其结果表示当的阴历日期离春节的天数。计算出的阳历天数为该年的第几天,存放在寄存器只2和只3中。计算出天数后,如果大于FFH,则把#FFH存放在R2中,余值存放在R3中。也就是说在用寄存器R2和R3表示的天数信息中R2充当主寄存器,数据先存满R2,再存R3。整个转换程序中,这里面的数据不能被覆盖。 计算出阳历总天数后,就可以根据它来推算阴历日期。推算方法是,先用总天数减去春节相元旦的日差,如果结果为1,则该天正好是春节(
19、因为春节在元旦之后,在计算春节和几旦的日差0时,假设元旦为0天,春节为M天,则日差为M。而前面计算的阳历总天数是该天在该年中的第几天,是以元旦为1而得到的,与计算春节和元旦日差的这种方法相比,其数值少了1所以要在原来本应该以0作为该天就是春节的依据的基础上加1,所以以1作为该天是春节的标志);如果结果小于1,则阴历应该是阳历的前一年;如果结果大于1,说明阳历和阴历为同一年。再根据查表所得的该年的阴历的闰月和大小月的信息,就可以推算出该大的阴历日期了。图39为由总天数推算出阴历日期的程序流程图。图9 推算阴历日期的程序流程图四、调试总结及改进(1)DS1302与微处理器进行数据交换时,首先由微处
20、理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM数据;D5D1指定输入或输出的特定寄存器;最低位LSB(D0)为逻辑0,指定写操作(输入),D0=1,指定读操作(输出)。在DS1302的时钟日历或RAM进行数据传送时,DS1302必须首先发送命令字节。若进行单字节传送,8位命令字节传送结束之后,在下2个SCLK周期的上升沿输入数据字节,或在下8个SCLK周期的下降沿输出数据字节。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命
21、令控制字为C0HFDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM寄存器,在此方式下可一次性读、写所有的RAM的31个字节。 (2)在仿真头调试时候,我发现在LED显示板上能够正常显示数字,但是秒位不能记数,检查DS1302的连接(没有错,接触也良好),说明了这片DS1302不能记数,然后换掉DS1302后此时不但可以正常显示数字,而且可以正常记数,说明刚才那片是坏的。(3)(2M)晶振的调试,在调试晶振的时候发现,在没有给电路同电的时候,晶振两端输出波形是个不稳定的正弦波,而通电后也是个正弦波,但是中间一个引脚接地时候,波形比较稳定,接示波器时间长了,发现DS1302很发烫(
22、时间很短内温度达到很高),但是不接示波器,时间长点也不会出现发烫现象。我认为是示波器引脚上的电和电路板上的电相通的原因。五元器件主控器AT89C52一片、时钟芯片DS1302一片、10P瓷片电容2个、22P瓷片电容3个,32.768K(时钟晶体)1片、510欧排电阻3个、共阳LED 19片,9012三极管1片、8550三极管7个,2M晶体1片、74LS104三片、发光二极管一个、按钮开关2个、万能电路板(大小个1个),5V电源一个、导线若干。六、参考书目1、李振声实验电子技术(P182193).国防工业大学出版社,2001年2 李飞光 单片机课程设计实例指导 北京航空航天大学出版社 2004年
23、七程序调试SCLK EQU P3.2IO EQU P3.3RST EQU P3.4YEAR DATA 66HMONTH DATA 65HWEEK DATA 64HDAY DATA 63HHOUR DATA 62HMINTUE DATA 61HSECOND DATA 60HDS1302_ADDR DATA 32HDS1302_DATA DATA 31H ORG 0000H AJMP START ORG 0003H RETI ORG 000BH RETI ORG 0013H RETI ORG 001BH LJMP INTT1 ORG 0023H RETI ORG 002BH RETISTART:
24、SETB EA MOV SCON,#00H MOV TMOD,#10H MOV TL1,#00H MOV TH1,#00H MOV DS1302_ADDR,#8EH MOV DS1302_DATA,#00H LCALL WRITE MOV DS1302_ADDR,#90H MOV DS1302_DATA,#0A6H LCALL WRITEMAIN1: MOV DS1302_ADDR,#8DH LCALL READ MOV YEAR,DS1302_DATA MOV DS1302_ADDR,#8BH LCALL READ MOV WEEK,DS1302_DATA MOV DS1302_ADDR,#
25、89H LCALL READ MOV MONTH,DS1302_DATA MOV DS1302_ADDR,#87H LCALL READ MOV DAY,DS1302_DATA MOV DS1302_ADDR,#85H LCALL READ MOV HOUR,DS1302_DATA MOV DS1302_ADDR,#83H LCALL READ MOV MINTUE,DS1302_DATA MOV DS1302_ADDR,#81H LCALL READ MOV SECOND,DS1302_DATA MOV R0,YEAR LCALL DIVIDE MOV 7BH,R1 MOV 4BH,R1 M
26、OV 7CH,R2 MOV 4CH,R2 MOV 78H,WEEK MOV 48H,WEEK MOV R0,MONTH LCALL DIVIDE MOV 79H,R1 MOV 49H,R1 MOV 7AH,R2 MOV 4AH,R2 MOV R0,DAY LCALL DIVIDE MOV 76H,R1 MOV 46H,R1 MOV 77H,R2 MOV 47H,R2 MOV R0,HOUR LCALL DIVIDE MOV 74H,R1 MOV 44H,R1 MOV 75H,R2 MOV 45H,R2 MOV R0,MINTUE LCALL DIVIDE MOV 72H,R1 MOV 42H,
27、R1 MOV 73H,R2 MOV 43H,R2 MOV R0,SECOND LCALL DIVIDE MOV 70H,R1 MOV 40H,R1 MOV 71H,R2 MOV 41H,R2 LCALL DISPLAY LCALL GENGXIAN JNB P1.2,NUM JNB P1.1,SETG JNB F0,SSS CLR P1.3 LJMP MAIN1SSS: SETB P1.3 LJMP MAIN1 NUM:MOV MONTH,#0AAH MOV HOUR,#0AAH MOV MINTUE,#0AAH MOV SECOND,#04H MOV R0,MONTH LCALL DIVID
28、E MOV 79H,R1 MOV 49H,R1 MOV 7AH,R2 MOV 4AH,R2 MOV R0,HOUR LCALL DIVIDE MOV 74H,R1 MOV 44H,R1 MOV 75H,R2 MOV 45H,R2 MOV R0,MINTUE LCALL DIVIDE MOV 72H,R1 MOV 42H,R1 MOV 73H,R2 MOV 43H,R2 MOV R0,SECOND LCALL DIVIDE MOV 70H,R1 MOV 40H,R1 MOV 71H,R2 MOV 41H,R2 LCALL DISPLAY JNB P1.2,NUM LJMP MAIN1SETG:
29、SETB TR1 SETB ET1 CLR 08H CLR 09H CLR 0AH CLR 0BH CLR 0CH CLR 0DH CLR 0EH CLR 0FH MOV DS1302_ADDR,#8EH MOV DS1302_DATA,#00H LCALL WRITE MOV DS1302_ADDR,#80H MOV DS1302_DATA,#80H LCALL WRITEGWAIT: LCALL DISPLAY JNB P1.1,GWAITSETG1: LCALL DISPLAY JNB P1.1,SETG2 JNB P1.2,GADDYEAR AJMP SETG1GADDYEAR: MO
30、V R7,66H LCALL ADD1 MOV 66H,A CJNE A,#51H,GADDYEAR1 MOV 66H,#01HGADDYEAR1: MOV DS1302_ADDR,#8CH MOV DS1302_DATA,66H LCALL WRITE MOV R0,66H LCALL DIVIDE MOV 4BH,R1 MOV 7BH,R1 MOV 4CH,R2 MOV 7CH,R2WAITT1: LCALL DISPLAY JNB P1.2,WAITT1 AJMP SETG1SETG2: SETB 0AHGWAIT2: LCALL DISPLAY JNB P1.1,GWAIT2SETG3
31、: LCALL DISPLAY JNB P1.1,SETG4 JNB P1.2,GADDMONTH AJMP SETG3GADDMONTH: MOV R7,65H LCALL ADD1 MOV 65H,A CJNE A,#13H,GADDMONTH1 MOV 65H,#01HGADDMONTH1: MOV DS1302_ADDR,#88H MOV DS1302_DATA,65H LCALL WRITE MOV R0,65H LCALL DIVIDE MOV 79H,R1 MOV 49H,R1 MOV 7AH,R2 MOV 4AH,R2WAITT2: LCALL DISPLAY JNB P1.2
32、,WAITT2 AJMP SETG3SETG4: SETB 0BHGWAIT4: LCALL DISPLAY JNB P1.1,GWAIT4SETG5: LCALL DISPLAY JNB P1.1,SETG6 JNB P1.2,GADDDAY AJMP SETG5GADDDAY: MOV R7,63H LCALL ADD1 MOV 63H,A CJNE A,#32H,GADDDAY1 MOV 63H,#01HGADDDAY1: MOV DS1302_ADDR,#86H MOV DS1302_DATA,63H LCALL WRITE MOV R0,63H LCALL DIVIDE MOV 76
33、H,R1 MOV 46H,R1 MOV 77H,R2 MOV 47H,R2WAITT3: LCALL DISPLAY JNB P1.2,WAITT3 AJMP SETG5SETG6: SETB 0CHGWAIT6: LCALL DISPLAY JNB P1.1,GWAIT6SETG7: LCALL DISPLAY JNB P1.1,SETG8 JNB P1.2,GADDWEEK AJMP SETG7GADDWEEK: MOV R7,64H LCALL ADD1 MOV 64H,A CJNE A,#08H,GADDWEEK1 MOV 64H,#01HGADDWEEK1: MOV DS1302_A
34、DDR,#8AH MOV DS1302_DATA,64H LCALL WRITE MOV R0,64H LCALL DIVIDE MOV 48H,R1 MOV 78H,R1WAITT4: LCALL DISPLAY JNB P1.2,WAITT4 AJMP SETG7SETG8: SETB 0DHGWAIT8: LCALL DISPLAY JNB P1.1,GWAIT8SETG9: LCALL DISPLAY JNB P1.1,SETG10 JNB P1.2,GADDHOUR AJMP SETG9GADDHOUR: MOV R7,62H LCALL ADD1 MOV 62H,A CJNE A,
35、#24H,GADDHOUR1 MOV 62H,#00HGADDHOUR1: MOV DS1302_ADDR,#84H MOV DS1302_DATA,62H LCALL WRITE MOV R0,62H LCALL DIVIDE MOV 74H,R1 MOV 44H,R1 MOV 75H,R2 MOV 45H,R2WAITT5: LCALL DISPLAY JNB P1.2,WAITT5 AJMP SETG9SETG10: SETB 0EHGWAITT10: LCALL DISPLAY JNB P1.1,GWAITT10SETG11: LCALL DISPLAY JNB P1.1,SETGOU
36、T JNB P1.2,GADDMINTUE AJMP SETG11GADDMINTUE: MOV R7,61H LCALL ADD1 MOV 61H,A CJNE A,#60H,GADDMINTUE1 MOV 61H,#00HGADDMINTUE1:MOV DS1302_ADDR,#82H MOV DS1302_DATA,61H CALL WRITE MOV R0,61H LCALL DIVIDE MOV 72H,R1 MOV 42H,R1 MOV 73H,R2 MOV 43H,R2WAITT6: LCALL DISPLAY JNB P1.2,WAITT6 AJMP SETG11SETGOUT: LCALL DISPLAY JNB P1.1,SETGOUT LCALL GENGXIAN MOV DS1302_ADDR,#80H MOV DS1302_DATA,#00H