《基于16F887单片机数字钟课设设计报告.docx》由会员分享,可在线阅读,更多相关《基于16F887单片机数字钟课设设计报告.docx(59页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、基于16F887单片机数字钟课设设计报告基于16F887单片机数字钟课设设计报告word格式 本文关键词:单片机,格式,报告,设计,数字钟基于16F887单片机数字钟课设设计报告word格式 本文简介:第44页共44页xxxxxx基于PIC16F887单片机的数字钟课程设计报告学生姓名:_学号:_专业班级:_指导老师:_*年*月*日书目1.功能介绍31.1PIC16F887介绍31.2DS1307介绍31.3TC74介绍31.4LM1602L介基于16F887单片机数字钟课设设计报告word格式 本文内容:第44页共44页xxxxxx基于PIC16F887单片机的数字钟课程设计报告学生姓名:_
2、学号:_专业班级:_指导老师:_*年*月*日目录1.功能介绍31.1PIC16F887介绍31.2DS1307介绍31.3TC74介绍31.4LM1602L介绍31.5蜂鸣器介绍32.硬件原理框图43.模块介绍43.1单片机最小系统模块43.2时间和温度通讯模块53.3按键模块53.4蜂鸣器和液晶显示器模块54.软件框图75.软件功能介绍75.1端口LCD和IIC初始化及端口若上拉75.2显示预显示的数字和字母85.3依据闹钟按键推断95.4写入初值到时钟芯片95.5时间加减设置105.6显示时间读和显示温度显示字母星期116.个人心得体会126.1关于PIC课设126.2课设过程遇到的问题及
3、解决措施126.3我的建议14附录1:数字钟的全部C程序15附录2:Proteus完整仿真图441.功能介绍1.1PIC16F887介绍PIC16F887单片机共有40个引脚,其中有33个端口引脚,7个电源地和复位引脚。外部晶振设为4MHz,引脚1接复位按键。此数字钟用到单片机的B端口中断功能,端口若上拉,电平改变下降沿中断。1.2DS1307介绍DS1307时钟芯片是实时时钟芯片,它供应秒分时日月年和星期等数据,有备用电源,主电源掉电备用,时钟晶振是32.768kHz。其限制寄存器的地址为07,其值0b11010000,代表允许其7脚输出每秒1Hz的方波。其秒分时日月年和星期分别存在地址为0
4、0010204050603中。其与单片机的通讯为IIC通讯。1.3TC74介绍温度传感器TC74是感测四周温度值。TC74芯片的默认值为0b1001101(试验板上芯片调试时的地址为0b1001000,此为仿真时用的地址)。单片机首先向TC74改善地址,地址在字节的高7位,最低位为0表示为写。接着单片机向TC74发送其次个数据,即读温度吩咐字RTR,即8位0;然后重新起先,单片机再向TC74发送地址,但此时的最低位为1,表示接下来是要读TC74的温度值。最终单片机接收TC74发出的温度值。TC74与单片机的通讯也为IIC通讯。1.4LM1602L介绍字符型LM016L液晶显示器。要求用4位数据
5、线通讯,传送吩咐也传送地址。其初始化的格式是固定的,不能更改的,初始化见后面所示。输入到液晶显示器的是所示字符的ASCII码,液晶才能正确显示。1.5蜂鸣器介绍蜂鸣器是用来设置闹钟用的。当设定闹钟的时间到时,蜂鸣器响,按键按下,停止响。按键模块是用来进行年月日秒分时和星期加减及设定闹钟用的。采纳的是电平改变的中断模式。2.硬件原理框图220V变压器变压CUP模块液晶显示按键输入DS1307和TC74市电220V电压经变压器变压供CPU运用的低压。DS1307和TC74经CPU显示在液晶上。按键限制DS1307的时间加减和闹钟设置,实现闹钟功能。先在液晶上定位要显示数据的位置,然后将要显示的字符
6、的ASCII码输入到液晶,即可正确数据。.模块介绍3.1单片机最小系统模块此单片机的外部晶振为4MHz,引脚1接有高电平和复位按钮。端口B口用来进行电平改变中断,端口RC3和RC4用来进行IIC通讯,RC1用来输出高电平给蜂鸣器。端口D端口用来输出吩咐和数据给液晶显示器。3.2时间和温度通讯模块DS1307时间芯片可依据输入的数据自动走时。单片机不断地访问DS1307芯片,将访问得到的数据显示在液晶显示器上。其中芯片上读出来的星期是数字星期(01即代表星期一),软件部分将数字星期转换成字母星期(如Wed为星期三)。单片机也访问TC74温度传感器,要得到的数据显示在液晶上。温度传感器小数后面有一
7、位,但是设计时只显示到个位,不显示小数点后面的数字。3.3按键模块按键S1是用来定位时间加减用的,来回按7下,分别对秒分时,星期和日月年。S2可以对时间进行加运算即每按一下,相应的时间加1;S3可以时间进行减运算即每按一下,相应的时间减1;S4是闹钟按键,按第一下,进入闹钟设置模式,此时再按S2或S3可以对时间进行设定。按其次下时,CPU进入比较模式,即把DS1307的时间和设定保存好的时间进行比较,等待设定的时间到时,蜂鸣器起先响。当按第三下时,蜂鸣器停止响,相应的变量清零,从重新起先。3.4蜂鸣器和液晶显示器模块当定时时间到,RC1输出高电平,二极管导通,蜂鸣器起先响。当RC1输出低电平常
8、,二极管截止,蜂鸣器停止响。液晶显示器用来显示时间,星期和温度,首先要进行显示时间定位,即写入吩咐。然后进行显示数据输入,即定稿数据。VEE和VSS都拉低,VDD拉高电平。RS为0时,写吩咐,为1时写数据;R/为1时表示读,0时表示写;E数据使能端,下降沿送入有效。RD0RD3,数据输入端,运用液晶显示器端口的高4位。4.软件框图端口LCD和IIC初始化及端口若上拉显示预显示的数字和字母延迟2秒写入初值到时钟芯片显示时间读和显示温度显示字母星期时间加减设置闹钟设置和进行比较蜂鸣器响C=0或2C=1C=2S4第三次按下蜂鸣器不响C=3依据闹钟按键推断该功能在中断程序段中5.软件功能介绍5.1端口
9、LCD和IIC初始化及端口若上拉/初始化端口voidCSH(void)TRISB=0b11111111;/端口B全为输入TRISC=0b00011000;/端口C中RC3和RC4为输入,其余为输出ANSELH=0b00000000;/选择I/O口ANSEL=0;/选择I/O口OPTION=0b00000000;/允许若上拉,下降沿中断WPUB=0b11111111;/B口若上拉TRISA4=1;/A口第5引脚为输入TRISD=0b00000000;/限制LCD1604,全为输出IOCB=0b00001111;/允许电平改变中断INTCON=0b11001000;/允许全局中断,B口电平改变中断
10、FMQ=0;/蜂鸣器不响LCD_CSH();/LCD初始化IIC_CSH();/IIC初始化此为对端口LCD和IIC的初始化,上面均有具体的说明,在此不做过多的重复。LCD的初始化,上电时须要延时15ms及以上,此为延时20ms,其C程序见附录。IIC的初始化,初始化过程事实上是对几个相关的寄存器设置的过程,其C程序见附录。5.2显示预显示的数字和字母constcharMENU0217=“010900628“,“linyixing“;/完全根据数组中的字符显示整屏voidDISP_MENU(constcharA)chari,j;for(i=0;i4;/取高4位LCD_WRITE_4(R2,FL
11、AG);/先写高4位R2=R1/高4位清0,取低4位LCD_WRITE_4(R2,FLAG);/再送低4位DELAY_US(10);/延时100us/写R1的低4位,FLAG为寄存器选择,1为吩咐,0为数据voidLCD_WRITE_4(charR1,charFLAG)LCD_RW=0;NOP();/写模式LCD_RS=FLAG;NOP();/寄存器选择PORTDNOP();/RD高4位先清0LCD_E=1;NOP();/使能PORTD|=R1;NOP();/送4位LCD_E=0;NOP();/数据送入有效LCD_RS=0;NOP();PORTD/RD高4位清0此程序的功能的把给定的字符显示到
12、LCD液晶显示器上,字符串有两行,分行显示。先是对要显示的位置进行定位,如第一行第0位。然后将一个字符的凹凸4位分别送入显示,显示时送入的是ASCII码。5.3依据闹钟按键推断此为依据c=0,1,2来推断的。为0或2时,显示的是时钟芯片的时间,其中为2时,时钟有在比较时间;为1时显示的时闹钟设定的时间。c为3时蜂鸣器不响。其C程序详见附录。5.4写入初值到时钟芯片LCD_WRITE(0b00000001,COM);/清屏WRITE_DS1307(0x07,0x10);/写限制字到LCDWRITE_DS1307(0x00,0x00);/0秒WRITE_DS1307(0x01,0x00);/00分
13、WRITE_DS1307(0x02,0x11);/11hWRITE_DS1307(0x03,0x03);/星期3WRITE_DS1307(0x04,0x08);/8日WRITE_DS1307(0x05,0x05);/5月WRITE_DS1307(0x06,0x12);/12年/写ds1307,地址为address,数为datavoidWRITE_DS1307(charADDRESS,charda)START_BIT;IIC_SEND(ADDR);IIC_SEND(ADDRESS);IIC_SEND(da);STOP_BIT;/发送数R并等待发送完成,收到从机的应答信号,中断用voidIIC_S
14、END_interrupt(charR)SSPBUF=R;/发送SSPIF=0;while(RW=1);/在主动模式下,推断发送是否完成while(SSPIF=0);/等待发送完成while(ACKSTAT=1);/等待从机发送应答信号NOP();NOP();写入初值到时钟芯片时,要用到IIC通讯,即IIC发送。先送时钟地址,再送要写入数据的地址,再送入数据。此可对时钟芯片的年月日,秒分时和星期进行设定初值。5.5时间加减设置/校正时候实现“加”功能子程序voidINC(void)if(a=7)/年部分校正AAAA6+=1;/假如a=7,则数组6自动加1if(AAAA6AAAA6=AAAA6+
15、0x10;/数组6元素的低四位大于9时,则低四位清零而高四位进1位if(AAAA60x99)AAAA6=AAAA6/假如数组6元素值大于0x99,则整个数都清零if(c=0)WRITE_DS1307_interrupt(0x06,AAAA6);/将经过修改的数组元素写入if(c=1)LCD_WRITE_interrupt(LINE1+4,COM);DISP_HEX_interrupt(AAAA6);此功能从DS1307中读出时间数据,然后对数据进行加减运算,再把修改后的时间写入到时钟芯片中,即可实现对时间的加减运算。由于程序篇幅较长,在此只列出部分加的C程序,其余加C程序及减C程序详见附录。5
16、.6显示时间读和显示温度显示字母星期READ_DS1307(0x00,0x07);/读时钟芯片(设置闹钟时间是没有这一行指令)DISP_TIME(*AAAA);/实时显示时间(详细C程序见附录)R1=READ_T();/读温度传感器的值DISP_T(R1);/显示温度值DISP_XINGQI(AAAA3);/显示字母星期/显示字母星期voidDISP_XINGQI(charb)if(b=1)/假如b=1,则显示MonLCD_WRITE(LINE1+13,COM);/其次行第13位LCD_WRITE(M,DAT);LCD_WRITE(o,DAT);LCD_WRITE(n,DAT);/13、14、
17、15分别显示M、o、nelseif(b=2)/假如b=2,则显示TueLCD_WRITE(LINE1+13,COM);/同上LCD_WRITE(T,DAT);LCD_WRITE(u,DAT);LCD_WRITE(e,DAT);/同上其完整程序详见附录,在此只给出其中的一部分。/读TC74的温度值signedcharREAD_T(void)signedcharR2;SEN=1;/起先条件while(SEN=1);/检测起先条件是否完成?IIC_SEND(TC74_ADD_CONFIG(0x20F1);/调试用_CONFIG(0x3FFF);#defineLCD_ERD6/LCDE读写使能限制#d
18、efineLCD_RWRD5/LCD读(1)/写(0)限制线#defineLINE10b10000000#defineLINE20b11000000#defineLCD_RSRD4/LCD寄存器选择数据(1)指令(0)/RD4-RD7分别接DB4-DB7,RD7为忙标记#defineCOM0/在LCD_WRITE()中的第2参数为0表示写吩咐#defineDAT1/在LCD_WRITE()中的第2参数为1表示写数据#defineTC74_ADD0b1001101/TC74的7位地址#defineRTR0b00000000/TC74的读温度吩咐#defineADDR0b11010000/时钟芯片
19、的地址#defineYEAR_PLINE1+2/年的显示位置#defineHOUR_PLINE2+2/时的显示位置#defineKEY_DECRB2#defineKEY_INCRB1#defineFMQRC1/产生起始位,检测完成起始位?#defineSTART_BIT/SEN=1;/while(SEN=1)/停止位,检查至停止位结束#defineSTOP_BIT/PEN=1;/while(PEN=1)/发送重复起先,确定重复起先已完成?#defineRE_START_BIT/RSEN=1;/while(RSEN=1)/接收使能模式,确定接收使能?#defineRECEIVE_ENABLE_B
20、IT/RCEN=1;/while(RCEN=1)/自动应答,检查是否完成应答?#defineACK_BIT/ACKDT=0;/ACKEN=1;/while(ACKEN=1)/不应答,检查是否完成无应答?#defineNOT_ACK_BIT/ACKDT=1;/ACKEN=1;/while(ACKEN=1)bank1charDD16;/一行LCD显示数据暂存bank1charAAAA7;/存放时钟芯片读出来的数据bank1charCCCC7;/存放闹钟设定的时间voidCSH(void);/初始化voidLCD_CSH(void);/LCD初始化voidLCD_BUSY(void);/检测LCD是
21、否忙charLCD_READ(void);/读LCD,忙检测用voidLCD_WRITE(char,char);/LCD写1字节,吩咐或数据voidLCD_WRITE_4(char,char);/LCD写半字节voidDISP_C(char);/在指定行中显示字符,字符在数组DD中voidDISP_MENU(constchar);/由常数数组显示整屏字符signedcharREAD_T(void);/读温度传感器的温度值voidIIC_CSH(void);/IIC的初始化voidIIC_SEND(char);/IIC的发送与接收voidDISP_T(char);/显示温度值voidBCD(ch
22、ar);/BCD码转换voidDELAY_US(char);/延迟程序,10uS级voidDELAY(unsignedint);/延迟程序,mS级voidDELAY_I(unsignedint);/中断用的延迟程序,mS级voidDISP_TIME(char);/显示时钟的时间voidDISP_HEX(char);/将一个字节分两个字节显示voidREAD_DS1307(char,char);/读时钟芯片voidWRITE_DS1307(char,char);/向时钟芯片写入值voidinterruptISR(void);/按键中断程序voidDISP_XINGQI(char);/星期转换,显
23、示字母星期voidINC(void);/按键加1voidDEC(void);/按键减1voidIIC_SEND_interrupt(char);/中断用IIC发送和接收voidWRITE_DS1307_interrupt(char,char);/中断用写时钟芯片/voidREAD_DS1307_interrupt(char,char);voidLCD_WRITE_interrupt(char,char);/中断用写LCDvoidDISP_HEX_interrupt(char);/中断用将一个字节显示成两个字节/整屏界面,每行16个字符,最终加一个结束符constcharMENU0217=“01
24、0900628“,“linyixing“;/定义常数constcharLINE2=LINE1,LINE2;/定义数组和变量charSW,GW,a=0,c=0,d,i;/主程序main(void)signedcharR1;/DELAY(100);CSH();/端口,LCD和IIC初始化DISP_MENU(*MENU0);/显示整屏DELAY(2000);/延迟2秒,看清显示是什么LCD_WRITE(0b00000001,COM);/清屏WRITE_DS1307(0x07,0x10);/写限制字到LCDWRITE_DS1307(0x00,0x00);/0秒WRITE_DS1307(0x01,0x0
25、0);/00分WRITE_DS1307(0x02,0x11);/11hWRITE_DS1307(0x03,0x03);/星期3WRITE_DS1307(0x04,0x08);/8日WRITE_DS1307(0x05,0x05);/5月WRITE_DS1307(0x06,0x12);/12年while(1)if(c=0)|(c=2)/当C=0或C=2时执行READ_DS1307(0x00,0x07);/读时钟芯片DISP_TIME(*AAAA);/实时显示时间R1=READ_T();/读温度传感器的的值DISP_T(R1);/显示温度值DISP_XINGQI(AAAA3);/显示字母星期if(c
26、=1)/C=1时执行DISP_TIME(*AAAA);/显示闹钟修改的时间R1=READ_T();/同上DISP_T(R1);/同上DISP_XINGQI(AAAA3);/同上if(CCCC2=AAAA2)/当设定的时间到时,蜂鸣器响;/显示字母星期voidDISP_XINGQI(charb)if(b=1)/假如b=1,则显示MonLCD_WRITE(LINE1+13,COM);/其次行第13位LCD_WRITE(M,DAT);LCD_WRITE(o,DAT);LCD_WRITE(n,DAT);/13、14、15分别显示M、o、nelseif(b=2)/假如b=2,则显示TueLCD_WRIT
27、E(LINE1+13,COM);/同上LCD_WRITE(T,DAT);LCD_WRITE(u,DAT);LCD_WRITE(e,DAT);/同上elseif(b=3)/假如b=3,则显示WedLCD_WRITE(LINE1+13,COM);/同上LCD_WRITE(W,DAT);LCD_WRITE(e,DAT);LCD_WRITE(d,DAT);/同上elseif(b=4)/假如b=4,则显示ThuLCD_WRITE(LINE1+13,COM);/同上LCD_WRITE(T,DAT);LCD_WRITE(h,DAT);LCD_WRITE(u,DAT);/同上elseif(b=5)/假如b=5
28、,则显示FriLCD_WRITE(LINE1+13,COM);/同上LCD_WRITE(F,DAT);LCD_WRITE(r,DAT);LCD_WRITE(i,DAT);/同上elseif(b=6)/假如b=6,则显示SatLCD_WRITE(LINE1+13,COM);/同上LCD_WRITE(S,DAT);LCD_WRITE(a,DAT);LCD_WRITE(t,DAT);/同上elseif(b=7)/假如b=7,则显示SunLCD_WRITE(LINE1+13,COM);/同上LCD_WRITE(S,DAT);LCD_WRITE(u,DAT);LCD_WRITE(n,DAT);/同上/中
29、断子程序voidinterruptISR(void)DELAY_I(30);/按键去抖RBIF=0;/标记位清零if(RB3=0)/闹钟键按下a=0;c+=1;d+=1;if(RB0=0if(a=8)a=1;if(RB1=0if(RB2=0if(c=1)/闹钟键按下if(RB0=0)/闹钟键按下的定位a+;if(a=8)a=1;if(RB1=0)/同上INC();if(RB2=0)/同上DEC();for(i=0;i9)AAAA6=AAAA6AAAA6=AAAA6+0x10;/数组6元素的低四位大于9时,则低四位清零而高四位进1位if(AAAA60x99)AAAA6=AAAA6/假如数组6元素
30、值大于0x99,则整个数都清零if(c=0)WRITE_DS1307_interrupt(0x06,AAAA6);/将经过修改的数组元素写入if(c=1)LCD_WRITE_interrupt(LINE1+4,COM);DISP_HEX_interrupt(AAAA6);/月部分校正if(a=6)AAAA5+=1;if(AAAA5AAAA5=AAAA5+0x10;/数组5元素的低四位大于9时,则低四位清零而高四位进1位if(AAAA50x12)AAAA5=AAAA5AAAA5=AAAA5+0x01;/假如数组5元素值大于0x12,则整个数都清零再加1if(c=0)WRITE_DS1307_in
31、terrupt(0x05,AAAA5);/将经过修改的数组元素写入elseif(c=1)LCD_WRITE_interrupt(LINE1+7,COM);DISP_HEX_interrupt(AAAA5);/日部分校正if(a=5)AAAA4+=1;if(AAAA4AAAA4=AAAA4+0x10;/数组4元素的低四位大于9时,则低四位清零而高四位进1位if(AAAA40x31)AAAA4=AAAA4AAAA4=AAAA4+0x01;/假如数组4元素值大于0x31,则整个数都清零再加1if(c=0)WRITE_DS1307_interrupt(0x04,AAAA4);/将经过修改的数组元素写入
32、elseif(c=1)LCD_WRITE_interrupt(LINE1+10,COM);DISP_HEX_interrupt(AAAA4);/星期部分校正if(a=4)AAAA3+=1;if(AAAA37)AAAA3=1;/假如数组3的元素大于7时,则复位到1if(c=0)WRITE_DS1307_interrupt(0x03,AAAA3);/将经过修改的数组元素写入elseif(c=1)LCD_WRITE_interrupt(LINE1+13,COM);DISP_HEX_interrupt(AAAA3);/时部分校正if(a=3)AAAA2+=1;if(AAAA2AAAA2=AAAA2+0
33、x10;/数组2元素的低四位大于9时,则低四位清零而高四位进1位if(AAAA20x23)AAAA2=AAAA2/假如数组2元素值大于0x24,则整个数都清零if(c=0)WRITE_DS1307_interrupt(0x02,AAAA2);/将经过修改的数组元素写入elseif(c=1)LCD_WRITE_interrupt(LINE2+2,COM);DISP_HEX_interrupt(AAAA2);/分部分校正if(a=2)AAAA1+=1;if(AAAA1AAAA1=AAAA1+0x10;/数组1元素的低四位大于9时,则低四位清零而高四位进1位if(AAAA10x59)AAAA1=AA
34、AA1/假如数组1元素值大于0x59,则整个数都清零if(c=0)WRITE_DS1307_interrupt(0x01,AAAA1);/将经过修改的数组元素写入elseif(c=1)LCD_WRITE_interrupt(LINE2+5,COM);DISP_HEX_interrupt(AAAA1);/秒部分校正if(a=1)AAAA0+=1;if(AAAA0AAAA0=AAAA0+0x10;/数组0元素的低四位大于9时,则低四位清零而高四位进1位if(AAAA00x59)AAAA0=AAAA0/假如数组0元素值大于0x59,则整个数都清零if(c=0)WRITE_DS1307_interru
35、pt(0x00,AAAA0);/将经过修改的数组元素写入elseif(c=1)LCD_WRITE_interrupt(LINE2+8,COM);DISP_HEX_interrupt(AAAA0);/校正时候实现“减”功能子程序voidDEC(void)if(a=7)/年部分校正AAAA6-=1;/假如a=0,则数组6自动减1if(AAAA6AAAA6=AAAA6+0x09;/数组6元素的低四位大于9时,则低四位清零且改为0x09,而高四位则自动减1if(AAAA6AAAA6=AAAA6+0x99;/假如数组6元素高四位大于9时,则整个数值清零再改为0x99if(c=0)WRITE_DS1307
36、_interrupt(0x06,AAAA6);/将经过修改的数组元素写入elseif(c=1)LCD_WRITE_interrupt(LINE1+4,COM);DISP_HEX_interrupt(AAAA6);/月部分校正if(a=6)AAAA5-=1;if(AAAA5AAAA5=AAAA5+0x09;/数组5元素的低四位大于9时,则低四位清零且改为0x09,而高四位则自动减1if(AAAA5=0x00)AAAA5=AAAA5+0x12;/假如数组5元素等于0时,则整个数值改为0x12if(c=0)WRITE_DS1307_interrupt(0x05,AAAA5);/将经过修改的数组元素写
37、入elseif(c=1)LCD_WRITE_interrupt(LINE1+7,COM);DISP_HEX_interrupt(AAAA5);/日部分校正if(a=5)AAAA4-=1;if(AAAA4AAAA4=AAAA4+0x09;/数组4元素的低四位大于9时,则低四位清零且改为0x09,而高四位则自动减1if(AAAA4=0x00)AAAA4=AAAA4+0x31;/假如数组4元素等于0时,则整个数值改为0x31if(c=0)WRITE_DS1307_interrupt(0x04,AAAA4);/将经过修改的数组元素写入elseif(c=1)LCD_WRITE_interrupt(LIN
38、E1+10,COM);DISP_HEX_interrupt(AAAA4);/星期部分校正if(a=4)AAAA3-=1;if(AAAA31)AAAA3=7;/假如数组3的元素小于1时,则复位到7if(c=0)WRITE_DS1307_interrupt(0x03,AAAA3);/将经过修改的数组元素写入elseif(c=1)LCD_WRITE_interrupt(LINE1+13,COM);DISP_HEX_interrupt(AAAA3);/时部分校正if(a=3)AAAA2-=本文来源:网络收集与整理,如有侵权,请联系作者删除,谢谢!第59页 共59页第 59 页 共 59 页第 59 页 共 59 页第 59 页 共 59 页第 59 页 共 59 页第 59 页 共 59 页第 59 页 共 59 页第 59 页 共 59 页第 59 页 共 59 页第 59 页 共 59 页第 59 页 共 59 页