片机课程设计多功能电子时钟_第1页
片机课程设计多功能电子时钟_第2页
片机课程设计多功能电子时钟_第3页
片机课程设计多功能电子时钟_第4页
片机课程设计多功能电子时钟_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.J I A N G S U U N I V E R S I T Y单片机课程设计多功能电子时钟学院名称: 专业班级: 学生姓名: 学生学号: 一、设计目的(1)能在LED显示器上实现正常的时分秒计时(2)能通过键盘输入当前时间,并从该时间开始计时(3)有校时、校分功能(4)有闹时功能,闹时时间可以设定,通过指示灯表示二、设计内容该课程设计是利用MCS-51单片机内部的定时计数器、中断系统、以及行列键盘和LED显示器等部件,设计一个单片机电子时钟。设计的电子时钟通过数码管显示,并能通过按键实现设置时间和暂停、启动控制等。三、MCS-51单片机系统简介单片机应用系统由硬件系统和软件系统两部分组成

2、。硬件系统是指单片机以及扩展的存储器、IO接口、外围扩展的功能芯片以及接口电路。软件系统包括监控程序和各种应用程序。在单片机应用系统中,单片机是整个系统的核心,对整个系统的信息输入、处理、信息输出进行控制。与单片机配套的有相应的复位电路、时钟电路以及扩展的存储器和IO接口,使单片机应用系统能够运行。在一个单片机应用系统中,往往都会输入信息和显示信息,这就涉及键盘和显示器。在单片机应用系统中,一般都根据系统的要求配置相应的键盘和显示器。配置键盘和显示器一般都没有统一的规定,有的系统功能复杂,需输入的信息和显示的信息量大,配置的键盘和显示器功能相对强大,而有些系统输入/输出的信息少,这时可能用几个

3、按键和几个LED指示灯就可以进行处理了。在单片机应用系统在中配置的键盘可以是独立键盘,也可能是矩阵键盘。显示器可以是LED指示灯,也可以是LED数码管,也可以是LCD显示器,还可以使用CRT显示器。单片机应用系统中键盘一般用的比较多的是矩阵键盘,显示器用的比较多的是LED数码管还LCD显示器。四、设计方案通过键盘输入,设置当前时间,并显示在LCD显示器上,键盘和LED显示通过键盘专用芯片HD7279A进行控制,7279A也是I2C总线接口的芯片,系统中采用并行口线模拟I2C实现 C8051F020和HD7279A的通信。采用LCD液晶显示器显示。而LCD液晶显示则耗能少,能够显示年、月、日、星

4、期等汉字,在显示方面更加灵活,而且改变显示时只要改变软件设计就可以,不用改变硬件电路的设计,易于电路的功能扩展。电路的软件设计也很简单。另外,这种设计硬件更加简洁。采用LCD液晶显示方案的缺点是在显示位数比较少时,价格略显昂贵。时间显示格式为小时十位、小时个位-分十位、分个位-秒十位、秒个位。在处理过程中加上了按键判断程序,能对按键处理,A是进入时间设置,按B进入日历设置,按C进入闹钟设置,设置完毕按D退出。五、程序整个工程中一共有四个文件 main.c  LCD12864.c  key7279.c  Clock.c。首先是main.c,程序如下:#include

5、 "c8051f020.h"  #include <intrins.h> unsigned char flag=0;  /设置标记extern unsigned char h,m,s;/声明时,分,秒,原定义在Clock.c文件中unsigned char ch=0,cm=0,cs=0;/定义闹钟的 时,分,秒unsigned int year=2013,mouth=12,day=31;/定义年,月,日int Count1s=1000; /定义倒数时间为1Sunsigned char newday=0;/新的一天 

6、0;   void Delay1us(unsigned char us) while (us)    _nop_(); _nop_(); _nop_(); _nop_(); _nop_();   -us; void SYSCLK_Init (void)   int i;                  &#

7、160;           / delay counter   OSCXCN = 0x67;                      / start external oscillator with     

8、0;                                 / 18.432MHz crystal   for (i=0; i < 256; i+) ;       

9、0;   / Wait for osc. to start up   while (!(OSCXCN & 0x80) ;          / Wait for crystal osc. to settle   OSCICN = 0x88;                 

10、;     / select external oscillator as SYSCLK                                       / sourc

11、e and enable missing clock                                       / detector#define PRT0CF P0MDOUT#define PRT1C

12、F P1MDOUT#define PRT2CF P2MDOUTvoid PORT_Init (void)   XBR0    = 0x07;                     / Enable SMBus, SPI0, and UART0   XBR1    = 0x00; 

13、0; XBR2    = 0x44;                     / Enable crossbar and weak pull-ups   EMI0CF  = 0x27;   EMI0TC  = 0x21;   P74OUT  = 0xFF;  

14、 P0MDOUT = 0x15; P1MDOUT |= 0x3C;       /P1.2-P1.5推挽输出   P1 &= 0xc3;       /P1.2-P1.5=0void SPI0_Init (void)   SPI0CFG = 0x07;              &

15、#160;      / data sampled on 1st SCK rising edge                                      

16、; / 8-bit data words   SPI0CFG|=0xC0; /CKPOL =1;   SPI0CN = 0x03;                      / Master mode; SPI enabled; flags        &#

17、160;                              / cleared   SPI0CKR = SYSCLK/2/8000000-1;       / SPI clock <= 8MHz (limited b

18、y                                        / EEPROM spec.)unsigned char Count1ms;void Timer0_Init (void) &#

19、160;  CKCON|=0x8;    TMOD|=0x1;     /16Bit   Count1ms=10;    TR0 = 0;                          / STOP Timer0&#

20、160;   TH0 = (-SYSCLK/1000) >> 8;      / set Timer0 to overflow in 1ms    TL0 = -SYSCLK/1000;    TR0 = 1;    / START Timer0    IE|= 0x2; void rili(unsigned char n); void Timer0_ISR (void) interrupt 1

21、  /1ms TH0 = (-SYSCLK/1000) >> 8;      TL0 = -SYSCLK/1000; if (Count1ms) Count1ms-; Count1s-;                  /1000倒数,为0是代表刚好一秒 if(Count1s=0)   

22、;                  flag=1;                      /1S到了,将标记至1 Count1s=1000;     &#

23、160;             /复位1S计数   if(flag=1)                   /判断标记       flag=0;     

24、               /复位标记     s+;                       /1S到 ,s+,秒增加     if(s=60

25、)                /秒满60           s=0;      m+;                  &

26、#160; /分增加          if(m=60)             /分满60           m=0;      h+;         &

27、#160;         /时增加               if(h=24)             /时满24          h=0;   

28、0; newday=1;         /更新新一天标记     rili(newday);       /日历函数,由新一天标记为参数,判断年月日     void Delay1ms(unsigned char T) Count1ms=T; while (Count1ms);void Delay1s(un

29、signed char T) while (T)   Delay1ms(200);  Delay1ms(200);  Delay1ms(200);  Delay1ms(200);  Delay1ms(200);  T-; void clock (void);void main (void)  WDTCN = 0xde; WDTCN = 0xad;       

30、;   /关看门狗 SYSCLK_Init ();         /初始化时钟 Timer0_Init();   /初始化定时器 PORT_Init ();           /初始化IO口 SPI0_Init ();        &

31、#160;  /初始化SPI0  CPT1CN|=0x80; /使能比较器1 REF0CN = 0x03;  /使能片内参考电压 DAC0CN |= 0x80; /使能DAC0 DAC0H=0; DAC0L=0; EA=1;     /开中断 clock();               

32、               /进入后,程序永远在此函数中循环 void rili(unsigned char n) if(n=1) n=0; /day+; /1,3,5,7,8,10,12 每月31天while(1) if(mouth=1|mouth=3|mouth=5|mouth=7|mouth=8|mouth=10|mouth=12) if(day=31) day=1; if(mouth!=12) mouth+; else mouth=1;

33、 year+; else day+; break; /4,6,9,11 每月30天 if(mouth=4|mouth=6|mouth=9|mouth=11) if(day=30) day=1; mouth+; else day+; break; if(mouth=2) if(year%4=0)&(year%100!=0)|(year%400=0) if(day=29) day=1; mouth+; else day+; else if(day=28) day=1;mouth+; elseday+; break; 下面是key7279.c  和 LCD12864.c 两个文件,

34、分别为按键和显示的控制函数。其中在LCD12864.c文件中加入了两个反向显示函数。key7279.c文件内容#include "c8051f020.h" #include <intrins.h>sbit HD7279_DAT=P17;sbit HD7279_CLK=P16;#define NOSELECT7279   P5 |= 0x80  /SPICS4(P57)=1#define SELECT7279   P5 &= (0x80)   /SPICS4

35、(P57)=0;#define Set7279DAT   HD7279_DAT=1#define Clr7279DAT   HD7279_DAT=0#define Set7279CLK   HD7279_CLK=1#define Clr7279CLK   HD7279_CLK=0       void Delay1ms(unsigned char T);void Delay1s(unsigned char T);void Delay1us(unsigned

36、 char T);void Send7279Byte(unsigned char ch)  char i; SELECT7279;      /置CS低电平  Delay1us(50);  /延时50  for (i=0;i<8;i+)    if (ch&0x80) /输出7位到HD7279A的DATA端      Set7279DAT; &

37、#160;  else     Clr7279DAT;    Set7279CLK;  /置CLK高电平   ch=ch<<1;  /待发数据左移   Delay1us(8); /延时8  Clr7279CLK;  /置CLK低电平   Delay1us(8); /延时50  Clr7279DAT

38、;   /发送完毕,DATA端置低,返回 unsigned char Receive7279Byte(void) unsigned char i,ch; ch=0;   Set7279DAT;   /DATA端置为高电平,输入状态 Delay1us(50);  /延时50 for (i=0;i<8;i+)   Set7279CLK;  /置CLK高电平  Delay1us

39、(8); /延时8  ch=ch<<1;  /接收数据左移1位  if (HD7279_DAT)   ch+=1;  /接收1位数据  Clr7279CLK;  /置CLK低电平  Delay1us(8); /延时8  Clr7279DAT;   /接收完毕,DATA端重新置成低电平(输出状态) return ch;void Flash

40、LED(unsigned char No) char i; Send7279Byte(0x88); /发闪烁指令  i=0x1; while (No)   i=i<<1;  No-;  Send7279Byte(i);   /1闪烁 NOSELECT7279;      /置CS高电平 void MoveLeft(void) Send7279Byte(0xA1); 

41、/发左移指令  NOSELECT7279;      /置CS高电平 void MoveRight(void) Send7279Byte(0xA0); /发右移指令  NOSELECT7279;      /置CS高电平 unsigned char code BdSeg=0x7e,0x30,0x6d,0x79, / 0 1 2 3 0x33,0x5b,0x5f,0x70, / 4 5 6 70x7f,0x7b,0x77,0x1f, / 8 9 a b0x4

42、e,0x3d,0x4f,0x47, / c d e f0x00,0x01; /*;              b6;             -;          b1| b0 |b5;      

43、       -        small;          b2| b3 |b4;             - .b7*/void DispLED(char *DispBuf,char ShowDot)/ShowDot 显示小数点位 char i,ch;&

44、#160;ShowDot-; for (i=0;i<6;i+)   ch=DispBufi;  if (ch>='a') && (ch<='f')       ch-='a'ch+=0xa;    if (ch>='A') && (ch<='F')    &

45、#160;  ch-='A'ch+=0xa;    Send7279Byte(0x90+5-i); /不译码  if (ch=' ')   Send7279Byte(0x00);   else   if (ch='-')     Send7279Byte(0x01);    else    

46、    if (ShowDot=i)     Send7279Byte(0x80|BdSegch&0x0f);     else     Send7279Byte(BdSegch&0x0f);      NOSELECT7279;      /置CS高电平 unsigned char GetKeyVal

47、ue(void) char KeyValue; if (CPT1CN&0x40) return -1; /无键按下  Send7279Byte(0x15); /发读键盘指令  KeyValue=Receive7279Byte(); NOSELECT7279;      /置CS高电平  return KeyValue; void WaitKeyOff(void) while  (!(CPT1CN&0x40);LCD12864.c函

48、数内容#include "c8051F020.h"#include <intrins.h>#define LCD_DATA P2#define LCD_RS P30#define LCD_RW P31#define LCD_E  P32#define LCD_CS1  P33#define LCD_CS2  P34#define LCD_RST  P35void Delay1ms(unsigned char);#define SELECTCS 0void LCD_WaitReady1(void) /判断LCD控制芯片KS0

49、108是否忙 LCD_DATA=0xff; _nop_(); LCD_CS2=SELECTCS; LCD_RW=1; LCD_RS=0; LCD_E=1; while (LCD_DATA&0x80); LCD_CS2=!SELECTCS;void LCD_WaitReady2(void) /判断LCD控制芯片KS0108是否忙 LCD_DATA=0xff; _nop_(); LCD_CS1=SELECTCS; LCD_RW=1; LCD_RS=0; 

50、;LCD_E=1; while (LCD_DATA&0x80); LCD_CS1=!SELECTCS;void LCD_WriteCommand1(char ch) /向LCD控制芯片KS0108发送控制命令 LCD_WaitReady1(); LCD_CS2=SELECTCS; LCD_RW=0; LCD_RS=0; LCD_DATA=ch; LCD_E=1; LCD_E=0; LCD_CS2=!SELECTCS;void LCD_WriteCommand2(char ch) 

51、;/向LCD控制芯片KS0108发送控制命令 LCD_WaitReady2(); LCD_CS1=SELECTCS; LCD_RW=0; LCD_RS=0; LCD_DATA=ch; LCD_E=1; LCD_E=0; LCD_CS1=!SELECTCS;void LCD_WriteData1(char ch) /向LCD控制芯片KS0108发送数据命令 LCD_WaitReady1(); LCD_CS2=SELECTCS; LCD_RW=0; LCD_RS=1;&

52、#160;LCD_DATA=ch; LCD_E=1; LCD_E=0; LCD_CS2=!SELECTCS;void LCD_WriteData2(char ch) /向LCD控制芯片KS0108发送数据命令 LCD_WaitReady2(); LCD_CS1=SELECTCS; LCD_RW=0; LCD_RS=1; LCD_DATA=ch; LCD_E=1; LCD_E=0; LCD_CS1=!SELECTCS;void LCD_WriteHZ(char x,char y

53、,char *Dot) /显示16*16点阵汉字char i; for (i=0;i<32;i+)   if (x+i%16)<64)     LCD_WriteCommand1(0xB8+y+i/16);   LCD_WriteCommand1(0x40+x+i%16);   LCD_WriteData1(Doti);    else     

54、LCD_WriteCommand2(0xB8+y+i/16);   LCD_WriteCommand2(0x40+x-64+i%16);   LCD_WriteData2(Doti);   char code Number=/*-  文字:  0123456789:/  -*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x07,0x08,0x10,0x10,0x08,0x07,0x00,0x00,0x10,0x10,0xF8,0

55、x00,0x00,0x00,0x00,0x00,0x10,0x10,0x1F,0x10,0x10,0x00,0x00,0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x14,0x12,0x11,0x10,0x18,0x00,0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x0C,0x10,0x10,0x10,0x11,0x0E,0x00,0x00,0x80,0x40,0x20,0xF8,0x00,0x00,0x00,0x00,0x03,0x02,0x12,0x1F,0x12,0x12,0x00,0

56、x00,0xF8,0x88,0x48,0x48,0x48,0x88,0x00,0x00,0x0C,0x10,0x10,0x10,0x10,0x0F,0x00,0x00,0xE0,0x10,0x88,0x88,0x98,0x00,0x00,0x00,0x0F,0x11,0x10,0x10,0x10,0x0F,0x00,0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x00,0x0E,0x11,0x10,0

57、x10,0x11,0x0E,0x00,0x00,0xF0,0x08,0x08,0x08,0x90,0xE0,0x00,0x00,0x00,0x19,0x11,0x11,0x08,0x07,0x00,0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,;void LCD_WriteChar(char x,char y,char *D

58、ot) /显示8*16点阵字符char i; for (i=0;i<16;i+)   if (x+i%8)<64)     LCD_WriteCommand1(0xB8+y+i/8);   LCD_WriteCommand1(0x40+x+i%8);   LCD_WriteData1(Doti);    else     LCD_WriteCom

59、mand2(0xB8+y+i/8);   LCD_WriteCommand2(0x40+x-64+i%8);   LCD_WriteData2(Doti);   void LCD_WriteChar2(char x,char y,char *Dot) /显示8*16点阵字符   /新添加反向显示函数char i; for (i=0;i<16;i+)   if (x+i%8)<64)    

60、60;LCD_WriteCommand1(0xB8+y+i/8);   LCD_WriteCommand1(0x40+x+i%8);   LCD_WriteData1(Doti);    else     LCD_WriteCommand2(0xB8+y+i/8);   LCD_WriteCommand2(0x40+x-64+i%8);   LCD_WriteData2(Doti);&#

61、160;  void LCD_DispChar(char x,char y,char ch) /128*64  取值x=0-128 y=0-8 if (ch>=0)&&(ch<=0xb)   LCD_WriteChar(x,y,&Numberch*16); void LCD_DispChar2(char x,char y,char ch) /128*64  取值x=0-128 y=0-8  /新添加反向显示函数 if (ch>=0)&&

62、amp;(ch<=0xb)   LCD_WriteChar2(x,y,&Numberch*16); void InitLCD(void) /初始化LCD char i,j; LCD_RST=0; Delay1ms(1); LCD_RST=1; LCD_WriteCommand1(0xc0);  LCD_WriteCommand2(0xc0); LCD_WriteCommand1(0x3f);   /开显示 LCD_Writ

63、eCommand2(0x3f); for (j=0;j<8;j+)   /清屏   LCD_WriteCommand1(0xB8+j); /清左半屏  LCD_WriteCommand1(0x40);  for (i=0;i<64;i+)   LCD_WriteData1(0x00);  LCD_WriteCommand2(0xB8+j); /清右半屏  LCD_WriteComman

64、d2(0x40);  for (i=0;i<64;i+)   LCD_WriteData2(0x00); void DispBmp(char *buf) /显示一幅位图int i,j; for (j=0;j<8;j+)   /显示位图   LCD_WriteCommand1(0xB8+j);   LCD_WriteCommand1(0x40);  for (i=0;i<64;i+)

65、0;  LCD_WriteData1(buf(j*2)*64+i);  LCD_WriteCommand2(0xB8+j);   LCD_WriteCommand2(0x40);  for (i=0;i<64;i+)   LCD_WriteData2(buf(j*2+1)*64+i); Clock.c内容如下#include <c8051f020.h>unsigned char h=23,m=59,s=55;   &#

66、160; /设定初始时间extern unsigned char ch,cm,cs;      /申明闹钟时分秒extern unsigned int year,mouth,day;/申明年月日unsigned char key,key1,key2;      /按键 键值unsigned char i=0,j=0,y1=33,k=0; /循环标记unsigned  char si6=0;        &

67、#160;   /设置模式中存储时间设定值int rili8=3;                  /设置模式中存储日历设定值unsigned  char sn6=0;           /设置模式中存储闹铃设定值void InitLCD(void); /初始化LCDvoid LCD_

68、DispChar(char x,char y,char ch);void LCD_WriteHZ(char x,char y,char *Dot);void DispLED(char *DispBuf,char ShowDot);void Delay1ms(unsigned char T);unsigned char GetKeyValue(void);void WaitKeyOff(void);void LCD_DispChar2(char x,char y,char ch);/*- 文字: 时 -*/char code Shi=0x00,0x00,0xFC,0x44,0x44,0xFC,0

69、x00,0x08,0x48,0x88,0x08,0xFF,0x08,0x08,0x08,0x00,0x00,0x00,0x1F,0x04,0x04,0x0F,0x00,0x00,0x00,0x11,0x20,0x1F,0x00,0x00,0x00,0x00,;/*- 文字: 钟 -*/char code Zhong=0x00,0x60,0x38,0xE7,0x24,0x24,0x04,0x00,0xF8,0x88,0x88,0xFF,0x88,0x88,0xF8,0x00,0x00,0x01,0x01,0x3F,0x11,0x09,0x01,0x00,0x01,0x00,0x00,0x3F,0

70、x00,0x00,0x01,0x00,;/*- 文字: 闹 -*/char code Nao=0x00,0x00,0xF9,0x12,0x90,0x92,0x96,0xFA,0x92,0x92,0x92,0x12,0x02,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x1F,0x00,0x00,0x7F,0x00,0x08,0x1F,0x40,0x80,0x7F,0x00,0x00,;/*- 文字: 日 -*/char code Ri=0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0

71、x00,0x00,0x00, 0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00,;/*- 文字: 历 -*/char code Li=0x00,0x00,0xFE,0x02,0x22,0x22,0x22,0x22,0xFA,0x22,0x22,0x22,0xE2,0x02,0x02,0x00, 0x40,0x30,0x0F,0x00,0x40,0x20,0x18,0x06,0x01,0x00,0x20,0x60,0x3F,0x00,0x00,0x00,;void clock (void

72、) InitLCD();DispLED(" ",0); while(1) LCD_WriteHZ(32,0,Ri); LCD_WriteHZ(48,0,Li); LCD_WriteHZ(64,0,Shi); LCD_WriteHZ(80,0,Zhong); LCD_WriteHZ(0,2,Shi); LCD_WriteHZ(16,2,Zhong); LCD_DispChar(49,2,0xa);LCD_DispChar(73,2,0xa);LCD_WriteHZ(0,4,Ri); LCD_WriteHZ(16,4,Li);LCD_WriteHZ(0,6,Nao); LCD_

73、WriteHZ(16,6,Zhong);LCD_DispChar(33,6,ch/10); LCD_DispChar(41,6,ch%10);LCD_DispChar(49,6,0xa);LCD_DispChar(57,6,cm/10);LCD_DispChar(65,6,cm%10);LCD_DispChar(73,6,0xa);LCD_DispChar(81,6,cs/10);LCD_DispChar(89,6,cs%10); key=GetKeyValue();/获取按键值,当没有按键值时,key=-1;整个循环只运行if(GetKeyValue()=-1)内程序。 if(GetKeyValue()=-1) Delay1ms(30); LCD_DispChar(33,2,h/10);LCD_DispChar(41,2,h%10);LCD_DispChar(57,2,m/10);LCD_DispChar(65,2,m%10);LCD_DispChar(81,2,s/10);LCD_DispChar(89,2,s%10); LCD_DispChar(33,4,year/1000); LCD_DispChar(41,4,(year%1000)/100); LCD_DispChar(49,4,(yea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论