单片机实习.doc
如有侵权,请联系网站删除,仅供学习与交流单片机实习【精品文档】第 14 页机电工程学院电子信息工程专业实习总结(报告)班 级: 电子信息工程 院(系、部): 机电工程学院 学 生 姓 名: 指 导 教 师: 2015 年 7 月 15 日目录 3.2.1 振荡电路.3.2.2 复位电路.4.2花样流水灯4.3.1 温度传感器 4.3.3 LCD1602温度显示实物图 4.4.3 LCD1602电子时钟仿真图. 4.4.4 LCD1602电子时钟实物图.一、实习目的和意义1.1、实习目的基于AT90C54为核心制作的单片机最小系统,含有单片机工作的最基本组成单元电源电路、复位电路和振荡电路。另外,还有LED电路和RS232烧录串行接口电路以及用于扩展功能的四排与I/O端口相连的插孔。通过对单片机最小系统的研究,掌握单片机各引脚的基本功能,理解单片机工作过程及工作原理,以及与各种外部器件的连接,能够自己制作一个单片机最小系统的开发板并为其设置一个用于下载程序的串口对其进行下载程序并进行调试使我们所学知识与实践结合起来。所以我们应达到以下几点要求:(1)利用单片机最小系统练习对原理图的辨认、焊接、连线,加深对基础知识的理解;(2)掌握程序的编写和调试。对编程和仿真软件的应用有了新的了解,完成系统的初始化,掌握日历时钟芯片、键盘显示等程序的编制及调试;(3)反复对板子进行调试,加深对元器件的了解和板子工作原理的认知;(4)通过单片机系统的调试、程序编制及运行,掌握单片机系统的工作原理、开发方法和操作方法。1.2 实习意义近年来随着计算机在社会领域的渗透, 单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。新世纪对新型人才的要求也越来越高,创新精神和实践能力是对新时期高素质人才的基本要求。在本次实习中,不但可以掌握单片机软、硬件的综合调试方法,而且可以熟练掌握电路原理图,激发对单片机智能性的探索精神,提高学生的综合素质。在制作学习过程中,不但可以掌握软、硬件的综合调试方法,而且可以使学生对单片机智能性产生强烈的欲望。达到最大限度地掌握微机应用技术,软件及接口设计和数据采集与处理的技能,培养电综合实践素质的目。二、实习内容1.熟悉“单片机课程实习”电路板,领会、掌握该电路板的设计原理及硬件布局。2.掌握单片机技术应用平台keil软件的学习。借助平台软件,学习开发板的使用,按照要求编制、调试出正确的汇编语言程序。3.针对实习电路板的功能,编制、调试、编译汇编语言程序,下载烧录并在实验板上运行,或利用软件proteus进行软件仿真。 实现的功能:1. led显示模块:单向循环流水led显示从左往右依次变亮;2. 花样流水灯:从左往右依次变亮、从右往左依次变亮、从左往右再往左依次变亮、从左到右依次变暗,使用软件延时,通过发光二极管显示不同的花样,并且可以通过按键来控制流水灯的速度和模式切换 ;3. 利用数字温度传感器DS18B20测量温度信号,计算后在LCD液晶屏上显示相应的温度值;4. 利用时钟芯片在LCD1602液晶上显示时间,并通过按键进行年、月、日、时、分的调整; 三、功能模块介绍3.1 单片机最小系统图1 单片机最小系统3.2 电路原理3.2.1 振荡电路 振荡电路由一个12M的晶振和两个电容所组成,原理图如下:图2 振荡电路3.2.2 复位电路 复位电路由上电复位和按键复位两部分组成。AT89C51系列单片机即为高电平复位,在复位引脚RST上接一电容到VCC,再接一电阻到GND,由此形成一个RC充放电路,原理图如下:图3 复位电路3.3 按键模块本设计采用的4个独立按键,分别是:“设置”、“确认”、“加”、“减”。在时间显示模块中判断“设置”键是否按下及第几次按下可以分别对日期、时间、星期选定,然后按“加”、“减”即可进行设置,“确认”键按下后,新数据即写入时钟芯片。例如,“设置”键按1下,即可以对年份进行设置,按4下,即是可以对小时进行设置。在花样流水灯模块中采用三个按键,分别是:“模式切换”、“加速”、“减速”。按“模式切换”可对流水灯的花样进行切换,按“加速”、“减速”可使其速度增快减慢。其电路设计如图4所示。图4 4位独立按键模块3.4烧录模块RS232串口电路使用MAX232CPE作为电平转换芯片,并通过套件提供的串口电缆连接到计算机背后的COM口(9针D型口),用于MCS51 LITE与上位机通信以及和其他串口设备的数据交互。图5 单片机程序烧录串行接口模块3.5电源模块电源电路主要采用7805芯片,为单片机提供一个稳定的5V电源,原理图如下:图6 电源输入模块3.6 LCD1602液晶显示模块1602液晶也叫1602字符型液晶,他是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它是由若干个5*7或者5*11等点阵字符位组成,每个点阵字符都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正一味如此所以他不能很好的显示图形(用自定义CGRAM,显示效果也不好)。LCD1602是工业字符型液晶,能够同时显示16x02即32个字符。1602采用标准的16脚接口,其中: 第1脚:VSS为地电源 第2脚:VDD接5V正电源 第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。 第4脚:RS为寄存器选择,高电平选数据寄存器、低电平选指令寄存器。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。 第6脚:E端为使能端,当E由高电平跳变成低电平时,液晶模块执行命令。 第714脚:D0D7为8位双向数据线。 第15脚:背光电源正极 第16脚:背光电源负极图7 液晶LCD1602显示电路四、 重点模块与实例4.1从左到右的流水灯说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果整个系统工作由软件程序控制运行,根据需要,可以上电后系统经过初始化,进入用户设定模式状态。 图8 流水灯显示4.2花样流水灯于AT90C54单片机的彩灯控制方案,实现对LED灯的控制。本方案以AT90C54单片机作为主控核心,与驱动等模块组成核心主控制模块。在主控模块上设有晶振电路和8个LED灯,根据需要编写若干种亮灯模式,根据各种亮灯时间的不同需要,在不同时刻输出灯亮或灯灭的控制信号程序在功能实现过程中的作用 (1)键盘扫描程序:检测是否有按键按下,有按键按下则记录按下键的键值,并跳转至功能转移程序;无按键按下,则返回键盘扫描程序继续检测。 (2)功能转移程序:对检测到的按键值进行判断,是功能键则跳转至相应的功能程序,我们设计的功能程序有三种,即模式切换功能、加速功能和减速的功能。 (3)通过外部中断程序实现速度的调整,由复位口实现电路的原来的速度。图9 花样流水灯仿真图图10 花样流水灯实物图4.3 LCD1602温度显示4.3.1 温度传感器 温度是一个基本的物理量,自然界中的一切过程与温度密切相关。设计里加入DS18B20温度传感器可以随时了解温度的变化。DS18B20的封装引脚如图2.8和单片机与DS18B20的连接如图10。DS18B20温度传感器的I/O(DQ)引脚连接的是单片机的P3.3引脚。图11 DS18B20 图12 测温电路图DS18B20温度传感器主要特性:(1) 适应电压范围更宽,电压范围:3.05.5V,Vcc为外接供电电源输入端,在寄生电源方式下可由数据线供电,GND为电源地。 (2) 独特的单线接口方式,DS18B20在与单片机连接时仅需要一个引脚(DQ)即可实现微处理器与DS18B20的双向通讯。 (3) DS18B20在使用中不需要任何外围元件,全部 传感元件及转换电路集成在形如一只三极管的集成电路内。 (4) 温范围:55125,在-10+85时精度为±0.5。 (5) 可编程的分辨率为912位,对应的可分辨温度分别为0.5、0.25、0.125和0.0625,可实现高精度测温。 (6) 负压特性:电源极性接反时,芯片不会因发热而烧毁, 但不能正常工作。4.3.2 LCD1602温度显示仿真图图13 LCD1602温度显示4.3.3 LCD1602温度显示实物图图14 LCD1602温度显示实物图4.4 LCD1602电子时钟显示4.4.1时钟模块市场上可以选择的时钟芯片很多,功能也不尽相同,价格各异。DS13028 是美国DALLAS 公司推出的一种串行接口实时时钟芯片。芯片内部具有可编程日历时钟和31个字节的静态RAM,它可以对年、月、日、星期、时、分、秒进行计时,日历时钟可自动进行闰年补偿,及时准确,接口简单,使用方便,工作电压范围宽,功耗低,芯片自身还具有对备份电池进行涓流充电功能,可以有效地延长备份电池的使用寿命。DS1302引脚封装如图15所示。图15 DS1302引脚封装图4.4.2 时钟模块连接电路图图16 单片机与DS1302的连接引脚图4.4.3 LCD1602电子时钟仿真图图17 时钟模块仿真图4.4.4 LCD1602电子时钟实物图图18 时钟模块实物图五、实习总结与心得经过一个月的实习我学到了很多知识,也发现了自己存在的一些问题。通过此次的实习我体会到了。只单单学习课本上的知识是不行的,我们需要的更多的是动手能力,是与实践相结合的能力。在这次实习中我们一共焊了最小系统、烧录模块、按键模块、电源模块、流水灯模块、时钟模块六个模块。应用这几个模块,我们分别实现了流水灯的循环点亮、花样流水灯、LCD1602显示屏显示温度、LCD1602显示屏显示时间这四样功能。然后我们分别用protues系统仿真软件对各个模块进行了模拟仿真,用keil软件编制了汇编语言程序,验证了我们所设计的程序。在设计过程中使我懂得在设计程序之前,务必要对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源:懂得设计的关键是要有一个清晰的思路和一个完整的软件流程图。在设计程序时,不能妄想一次就将整个程序设计好,“反复修改,不断改进”是程序设计的必经之路。要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你思路,这样也为资料的保存和交流提供了方便。整个设计的过程中,还是碰到了一些问题。比如,对于键盘的延时防抖问题不能较好的解决;设计中我最大的收获就是自己的动手能力和独立解决问题的能力得到了很大的提高,在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识。感谢这次实习让我意识到了本身的不足,使得自己得到了提升。 六、参考文献1 许珉.单片机原理及应用M.北京:中国电力出版社,2007.082 三恒星科技.MCS-51单片机原理与应用实例M. 北京:电子工业出版社,2008.013 王为青,程国钢.单片机Keil Cx51应用开发技术M. 北京:人民邮电出版社,2007.024 John Markus.电子电路大全M.北京:计量出版社,19955 阎石.数字电子技术基础M.北京:高等教育出版社,1998.12,第4版6 邓元庆.数字电路与逻辑设计M.北京:电子工业出版社,2001附录 实验所用程序如下1. 流水灯#ifndef _REG52_H_#define _REG52_H_/* BYTE Registers */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;/* 8052 Extensions */sfr T2CON = 0xC8;sfr RCAP2L = 0xCA;sfr RCAP2H = 0xCB;sfr TL2 = 0xCC;sfr TH2 = 0xCD;/* BIT Registers */* PSW */sbit CY = PSW7;sbit AC = PSW6;sbit F0 = PSW5;sbit RS1 = PSW4;sbit RS0 = PSW3;sbit OV = PSW2;sbit P = PSW0; /8052 only/* TCON */sbit TF1 = TCON7;sbit TR1 = TCON6;sbit TF0 = TCON5;sbit TR0 = TCON4;sbit IE1 = TCON3;sbit IT1 = TCON2;sbit IE0 = TCON1;sbit IT0 = TCON0;/* IE */sbit EA = IE7;sbit ET2 = IE5; /8052 onlysbit ES = IE4;sbit ET1 = IE3;sbit EX1 = IE2;sbit ET0 = IE1;sbit EX0 = IE0;/* IP */sbit PT2 = IP5;sbit PS = IP4;sbit PT1 = IP3;sbit PX1 = IP2;sbit PT0 = IP1;sbit PX0 = IP0;/* P3 */sbit RD = P37;sbit WR = P36;sbit T1 = P35;sbit T0 = P34;sbit INT1 = P33;sbit INT0 = P32;sbit TXD = P31;sbit RXD = P30;/* SCON */sbit SM0 = SCON7;sbit SM1 = SCON6;sbit SM2 = SCON5;sbit REN = SCON4;sbit TB8 = SCON3;sbit RB8 = SCON2;sbit TI = SCON1;sbit RI = SCON0;/* P1 */sbit T2EX = P11; / 8052 onlysbit T2 = P10; / 8052 only /* T2CON */sbit TF2 = T2CON7;sbit EXF2 = T2CON6;sbit RCLK = T2CON5;sbit TCLK = T2CON4;sbit EXEN2 = T2CON3;sbit TR2 = T2CON2;sbit C_T2 = T2CON1;sbit CP_RL2 = T2CON0;#endif2、花样流水灯#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar ModeNo;uint Speed;uchar TCount=0;uchar Idx;uchar mb_Count=0;bit Dirtect=1;/*uchar code DSY_CODE=0xC0,0XF9, 0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90;*/uint code sTable=0,1,3,5,7,9,15,100,200,230,300,350;void Delay(uint x)uchar i;while(x-) for(i=0;i<120;i+);uchar GetKey()uchar K;if(P1=0xFF) return 0;Delay(10);switch(P1) case 0xFE: K=1;break; case 0xFD: K=2;break; case 0xFB: K=3;break; default: K=0;while (P1!=0xFF); return K;void Led_Demo(uint Led8)P2=(uchar)(Led8&0x00FF);/*P0=(uchar)(Led16>>8);*/void T0_INT() interrupt 1if(+TCount<Speed) return;TCount=0;switch(ModeNo)case 0:Led_Demo(0x0001<<mb_Count);break;case 1:Led_Demo(0x0080>>mb_Count);break;case 2:if(Dirtect)Led_Demo(0x000F<<mb_Count);elseLed_Demo(0x00F0>>mb_Count);if(mb_Count=7) Dirtect=!Dirtect;break;case 3:if(Dirtect)Led_Demo(0x000F<<mb_Count);else Led_Demo(0x00F0>>mb_Count);if(mb_Count=7) Dirtect=!Dirtect;break;case 4:if(Dirtect)Led_Demo(0x003F<<mb_Count);else Led_Demo(0x00FC>>mb_Count);if(mb_Count=7) Dirtect=!Dirtect;break;case 5:if(Dirtect)Led_Demo(0x0001<<mb_Count);else Led_Demo(0x0080>>mb_Count);if(mb_Count=7) Dirtect=!Dirtect;break;case 6:if(Dirtect)Led_Demo(0x0001<<mb_Count);else Led_Demo(0x0080>>mb_Count);if(mb_Count=7) Dirtect=!Dirtect;break;case 7:if(Dirtect)Led_Demo(0x00FE<<mb_Count);else Led_Demo(0x007F>>mb_Count);if(mb_Count=7) Dirtect=!Dirtect;break;default:break;mb_Count=(mb_Count+1)%8;void KeyProcess(uchar Key)switch(Key) case 1:Dirtect=1;mb_Count=0;ModeNo=(ModeNo+1)%8;/*P3=DSY_CODEModeNo;*/break;case 2:if(Idx>1) Speed=sTable-Idx;break;case 3:if(Idx<15) Speed=sTable+Idx;3、温度传感器#include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned char#define delayNOP() _nop_();_nop_();_nop_();_nop_();sbit DQ = P33;sbit LCD_RS = P20;sbit LCD_RW = P21;sbit LCD_EN = P22;uchar code Temp_Disp_Title="Current Temp : "uchar Current_Temp_Display_Buffer=" TEMP: "uchar code Temperature_Char8 = 0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00uchar code df_Table=0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9uchar CurrentT = 0;uchar Temp_Value=0x00,0x00;uchar Display_Digit=0,0,0,0;bit DS18B20_IS_OK = 1;void DelayXus(uint x)uchar i;while(x-)for(i=0;i<200;i+);bit LCD_Busy_Check()bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOP();result = (bit)(P0&0x80);LCD_EN=0;return result;void Write_LCD_Command(uchar cmd)while(LCD_Busy_Check();LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;_nop_();_nop_();P0 = cmd;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;void Write_LCD_Data(uchar dat)while(LCD_Busy_Check();LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;P0 = dat;delayNOP();LCD_EN = 1;delayNOP();LCD_EN = 0;void LCD_Initialise() Write_LCD_Command(0x01);DelayXus(5);Write_LCD_Command(0x38);DelayXus(5);Write_LCD_Command(0x0c);DelayXus(5);Write_LCD_Command(0x06);DelayXus(5);void Set_LCD_POS(uchar pos) Write_LCD_Command(pos|0x80);void Delay(uint x) while(-x);uchar Init_DS18B20() uchar status;DQ = 1;Delay(8);DQ = 0;Delay(90);DQ = 1;Delay(8);DQ = 1;return status;uchar ReadOneByte() uchar i,dat=0;DQ = 1;_nop_();for(i=0;i<8;i+)DQ = 0;dat >>= 1;DQ = 1;_nop_();_nop_();if(DQ)dat |= 0X80;Delay(30);DQ = 1;return dat;void WriteOneByte(uchar dat) uchar i;for(i=0;i<8;i+)DQ = 0;DQ = dat& 0x01;Delay(5);DQ = 1;dat >>= 1;void Read_Temperature() if(Init_DS18B20()=1)DS18B20_IS_OK=0;elseWriteOneByte(0xcc);WriteOneByte(0x44);Init_DS18B20();WriteOneByte(0xcc);WriteOneByte(0xbe);Temp_Value0 = ReadOneByte(); Temp_Value1 = ReadOneByte();DS18B20_IS_OK=1;void Display_Temperature() uchar i;uchar t = 150, ng = 0;if(Temp_Value1&0xf8)=0xf8)Temp_Value1 = Temp_Value1;Temp_Value0 = Temp_Value0+1;if(Temp_Value0=0x00)Temp_Value1+;ng = 1;Display_Digit0 = df_TableTemp_Value0&0x0f;CurrentT= (Temp_Value0&0xf0)>>4) | (Temp_Value1&0x07)<<4);Display_Digit3 = CurrentT/100;Display_Digit2 = CurrentT%100/10;Display_Digit1 = CurrentT%10;Current_Temp_Display_Buffer11 = Display_Digit0 + '0'Current_Temp_Display_Buffer10 = '.'Current_Temp_Display_Buffer9 = Display_Digit1 + '0'Current_Temp_Display_Buffer8 = Display_Digit2 + '0'Current_Temp_Display_Buffer7 = Display_Digit3 + '0'if(Display_Digit3 = 0)Current_Temp_Display_Buffer7 = ' 'if(Display_Digit2 = 0&&Display_Digit3=0)Current_Temp_Display_Buffer8 = ' 'if(ng)if(Current_Temp_Display_Buffer8 = ' ')Current_Temp_Display_Buffer8 = '-'else if(Current_Temp_Display_Buffer7 = ' ')Current_Temp_Display_Buffer7 = '-'else Current_Temp_Display_Buffer6 = '-'Set_LCD_POS(0x00);for(i=0;i<16;i+)Write_LCD_Data(Temp_Disp_Titlei); Set_LCD_POS(0x40);for(i=0;i<16;i+)Write_LCD_Data(Current_Temp_Display_Bufferi); Set_LCD_POS(0x4d);Write_LCD_Data(0x00);Set_LCD_POS(0x4e);Write_LCD_Data('C');void main() LCD_Initialise();Read_Temperature();Delay(50000);Delay(50000);while(1)Read_Temperature();if(DS18B20_IS_OK) Display_Temperature();DelayXus(100);uchar Key;P2=P1=0xFF;P0=0x00;ModeNo=0;Idx=4;/*P3=DSY_CODEModeNo;*/IE=0x82;TMOD=0x00;TR0=1;while(1)Key=GetKey();if(Key!=0) KeyProcess(Key);4、LCD1602#include <reg51.h>#include <intrins.h>#include <string.h>#define uint unsigned int#define uchar unsigned charsbit IO= P10; /DS1302数据线sbit SCLK = P11;/DS130时钟线sbit RST = P12;/DS1302复位线sbit RS = P20; /LCD数据/命令选择端sbit RW = P21;/LCD读/写控制sbit EN = P22;/LCD使能端sbit K1=P34;/选择sbit K2=P35;/加sbit K3=P36;/减sbit K4=P37;/确定uchar tCount=0;uchar MonthsDays=0,31,0,31,30,31,30,31,31,30,31,30,31;uchar *WEEK="SUN","MON","TUS","WEN","THU","FRI","SAT"uchar LCD_DSY_BUFFER1="DATE 00-00-00 " /显示格式uchar LCD_DSY_BUFFER2="TIME 00:00:00 "uchar DateTime7;/所读取的日期时间char Adjust_Index=-1; /当前调节的时间对象:分,时 ,日,月,年(1,2,3,4,6)uchar Change_Flag= "-MHDM-Y" /(分,时,日,月,年)(不调节秒与周)/*-延时程序-*/void DelayMS(uint ms) uchar i;while(ms-)for(i=0;i<120;i+);/-向DS1302写入一字节-/void Write_A_Byte_TO_DS1302(uchar x)uchar i;for(i=0;i<8;i+)IO=x&0x01;/每一位与1与存入IO中SCLK=1;SCLK=0;/一个高脉冲将数据送入液晶控制器x>>=1;/ 右移/-从DS1302读取一字节-/uchar Get_A_Byte_FROM_DS1302()uchar i,b=0x00;for(i=0;i<8;i+)b |= _crol_(uchar)IO,i);SCLK=1;SCLK=0; /每一个高脉冲读取一位数据return b/16*10+b%16; /返回BCD码/-从DS1302指定位置读数据-/uchar Read_Data(uchar addr) uchar dat;RST = 0;SCLK=0;RST=1; /RST高电平时读/写Write_A_Byte_TO_DS1302(addr); /先写入地址dat = Get_A_Byte_FROM_DS1302(); SCLK=1;RST=0;return dat;/-向DS1302某地址写入数据-/Void Write_DS1302(uchar addr,uchar dat)SCLK=0;RST=1;Write_A_Byte_TO_DS1302(addr);Write_A_Byte_TO_DS1302(dat);SCLK=0;RST=0; /高脉冲写入数据/-设置时间-/void SET_DS1302()uchar i; /写控制字,取消写保护Write_DS1302(0x8E,0x00); /分时日月年依次写入for(i=1;i<7;i+) /分的起始地址10000010(0x82),后面依次是时,日,月,周,年,写入地址每次递增2Write_DS1302(0x80+2*i,(DateTimei/10<<4)|(DateTimei%10);Write_DS1302(0x8E,0x80); /加保护