毕业设计(论文)基于单片机的智能数字闹钟程序代码
《毕业设计(论文)基于单片机的智能数字闹钟程序代码》由会员分享,可在线阅读,更多相关《毕业设计(论文)基于单片机的智能数字闹钟程序代码(30页珍藏版)》请在装配图网上搜索。
1、姚辉虎的毕业设计-基于单片机的智能数字闹钟程序代码程序代码 main.c#include <reg51.h>#include <intrins.h>#include <yf.h> unsigned char clock_data4;sbit speaker = P24;/ 蜂鸣器sbit bell = P22; /铃响bit bell_on=0;bit key_ok=0;unsigned char bell_time=0x20;uchar week_clock_set;#defi
2、ne FIRST_ADDR 0/定义全局变量unsigned char yy,mo,dd,xq,hh,mm,ss;/ 定义时间映射全局变量(专用寄存器)uchar j;/*/函数声明extern unsigned char read_clock(unsigned char ord);extern void lcdwc(unsigned char cmdcode);extern void hzkdis(unsigned char code *s);extern void hzkdis2(unsigned char *s);extern char Read_One_Byte
3、(unsigned char addr);extern void Write_One_Byte(unsigned char addr,unsigned char thedata);void lcm_w_ss(void);extern void lcdreset(void);extern void Init_DS18B20(void);extern char gotkey();extern void Init_1302(void);extern unsigned int ReadTemperature(void);extern void write_clock(unsigned char ord
4、, unsigned char dd);extern void disp_hz(uchar x,uchar *c_str,uchar w);extern void delay(unsigned int t);void new_time(void);void read_clockss(x); /void lcm_w_temp(void) ;void read_clockS(void) ss = read_clock(0x81);/读取秒数据 mm = read_clock(0x83);/读取分钟数据 hh = read_clock(0x85);/小时
5、60;dd = read_clock(0x87);/日 mo = read_clock(0x89);/月 xq = read_clock(0x8b);/星期 yy = read_clock(0x8d);/年/*void Set_time(unsigned char sel) /根据选择调整的相应项目加1并写入DS1302 signed char address,item; signed char max,mini; if(sel=7) address=0x80; max=0;mini=0;
6、160; /秒 if(sel=6) address=0x82; max=59;mini=0; /分钟 if(sel=5) address=0x84; max=23;mini=0; /小时 if(sel=3) address=0x86; max=31;mini=1; /日 if(sel=2) address=0x88; max=12;mini=1;
7、 /月 if(sel=1) address=0x8c; max=99; mini=0; /年 if(sel=4) address=0x8a; max=7;mini=1; /星期 /读取1302某地址上的数值转换成10进制赋给item item=(read_clock(address+1)/16)*10 + (read_clock(address+1)%16; if(KEY_Y =
8、0) item+;/数加 1 if(KEY_N= 0) item-;/数减 1 if(item>max) item=mini;/查看数值有效范围 if(item<mini) item=max; write_clock(0x8e,0x00);/允许写操作
9、0; write_clock(address,(item/10)*16+item%10);/转换成16进制写入1302 write_clock(0x8e,0x80);/写保护,禁止写操作 / updata (); /刷新数据 / lcm_w_mm();/刷新 分 */void DelayM(unsigned int a)/延时函数 1MS/次 unsigned char i; while( -a != 0)
10、0;for(i = 0; i < 125; i+); /一个 ; 表示空语句,CPU空转。 /i 从0加到125,CPU大概就耗时1毫秒 /*/向LCM中填写 年 数据void lcm_w_yy(void) / if (read_clock(0x8d) != yy) unsigned char str2; &
11、#160; str2=0; yy = read_clock(0x8d); lcdwc(0x83+FIRST_ADDR); hzkdis("20"); lcdwc(0x84+FIRST_ADDR); str0=(yy/16+0x30); str1=(yy%16+0x30); hzkdis2(s
12、tr); hzkdis2("年"); /*/向LCM中填写 月 数据void lcm_w_mo(void)/ if(read_clock(0x89) != mo) unsigned char str2; str2=0; / lcm_w_test(0,0x90); lcdwc(0x90+FIRST_ADDR) ; if(mo/16 != 0) str0=mo/16+0x3
13、0; /十位消隐 elsestr0=0x20 ;/同上 str1=mo%16+0x30; hzkdis2(str); lcdwc(0x91+FIRST_ADDR); hzkdis("月"); /*/星期处理并送入LCM的指定区域void lcm
14、_w_xq(void) unsigned char sel; unsigned char str2; str2=0; /if(read_clock(0x8b) != xq) /xq = read_clock(0x8b); sel = (read_clock(0x8b)%16; /字节低4位的BCD码放入sel lcdwc(0x97+FIRST_ADDR);/写入指定区域(97H 第二行第8个字) if(sel=7) hzkdis("日");
15、60; / if(sel=6) hzkdis("六"); / if(sel=5) hzkdis("五"); / if(sel=4) hzkdis("四"); / if(sel=3) str0=0xc8;str1=0xfd;hzkdis2(str)/*lcm_w_test(1,
16、0xc8);lcm_w_test(1,0xfd)*/; /此指令等于lcm_w_word("三"); 因为“三”的内码失效。 if(sel=2) hzkdis("二"); / if(sel=1) hzkdis("一"); /星期一 lcdwc(0x95+FIRST_ADDR); hzkdis("星期") ; /*/向LCM中填写 日
17、 数据void lcm_w_dd(void) unsigned char str2 ; str2=0;/ if(read_clock(0x87) != dd) dd = read_clock(0x87); lcdwc(0x92+FIRST_ADDR); if(dd/16 != 0)str0=(dd/16)+0x30; /十位消隐 el
18、sestr0=0x20;/同上 str1=dd%16+0x30; hzkdis2(str); lcdwc(0x93+FIRST_ADDR); hzkdis("日"); /*/向LCM中填写 小时 数据void lcm_w_hh(void) unsigned cha
19、r str2 ; str2=0; if(read_clock(0x85) != hh) /hh = read_clock(0x85); if (hh > 0x07 && hh < 0x22 /*&& w = 0*/) / beep = 0; led_r = 0; DelayM(100); / beep = 1; led_r = 1;
20、 lcdwc(0x88+FIRST_ADDR); str0=hh/16+0x30; str1=hh%16+0x30; hzkdis2(str); /*/向LCM中填写 分钟 数据void lcm_w_mm(void) unsigned char str2; str2=0; if(read_clock(0x83) != mm)
21、 mm = read_clock(0x83); /*if( w = 0) days(); /节日显示 updata (); /刷新数据 */ /* lcm_w_test(0,0x89); lcm_w_test(1,0x3a); /":"&
22、#160;lcm_w_test(1,(mm/16)+0x30); lcm_w_test(1,mm%16+0x30); lcm_w_test(1,0x2e); /"."*/ lcdwc(0x89+FIRST_ADDR); hzkdis(":"); str0=(mm/16)+0x30; str1= mm%16+0x30; hzkdis2(str); hzkdis(":"); /*/向LCM中填写 秒 数据void l
23、cm_w_ss(void) unsigned char str2 ; str2=0;/ if(read_clock(0x81) != ss) /判断是否需要更新 /*ss = read_clock(0x81); /更新数据 lcm_w_test(0,0x8b); /秒值在LCM上的写入位置 lcm_w_test(1,(ss/16)+0x30); /写十位 lcm_w_test(1,ss%16+0x30)
24、; /写个位 led_b = led_b; /背光闪烁 lcm_w_mm();/刷新 分 */ /lcm_w_mm(); ss=read_clock(0x81); lcdwc(0x8b+FIRST_ADDR); str0=ss/16+0x30; str1=ss%16+0x30;
25、 hzkdis2(str);lcm_w_temp(void) /unsigned char str14; uchar str2; unsigned int i=0; unsigned char a=0,b=0,c=0; uchar temp=28; i=ReadTemperature();/读温度并送显 /* a=i/100; str13=a+
26、0x30; str12=0x2e; str11=(i/10-a*10)+0x30; str10=(i-a*100-b*10)+0x30; /lcm_w_test(1,c+0x30); /小位1位 /lcm_w_word(""); /度C/ str10=(i/100)%10+0x30; / str11=(i%100)/10)+0x30;/ str12=(i%10)+0x30;*/ str0=temp/10+0x30;
27、str1=temp%10+0x30; lcdwc(0x8e+FIRST_ADDR); hzkdis2(str); lcdwc(0x8f+FIRST_ADDR); hzkdis("");/*/刷新数据void updata (void) lcm_w_hh();/刷新 小时 lcm_w_dd();/刷新 日 lcm_w_xq();/更新星期值 lcm_w_mo();/刷新 月&
28、#160; lcm_w_yy();/刷新 年 lcm_w_mm(); lcm_w_ss(); lcm_w_temp(); /初始化界面void restlib() lcdwc(0x80+FIRST_ADDR); hzkdis("校园打铃系统"); lcdwc(0x90+FIRST_ADDR); hzkdis("初始化.&qu
29、ot;); lcdwc(0x88+FIRST_ADDR); hzkdis("姚辉虎"); lcdwc(0x98+FIRST_ADDR); hzkdis("");/*void rj1lib() unsigned char str2; lcdwc(0x80+FIRST_ADDR); str0=yy/10+0x30; str1=yy%10+0x30; hzkdis("2
30、0"); hzkdis2(str); hzkdis("年"); lcdwc(0x90+FIRST_ADDR) ; if(mo/16 != 0) str0=mo/16+0x30; /十位消隐 elsestr0=0x20 ;/同上 str1=mo%16+0x30; hzkdis2(str); lcdwc(0x91+FIRST_ADDR); hzkdis("月");
31、160; lcdwc(0x92+FIRST_ADDR); if(dd/16 != 0)str0=(dd/16)+0x30; /十位消隐 elsestr0=0x20;/同上 str1=dd%16+0x30; hzkdis2(str); lcdwc(0x93+FIRST_ADDR); hzkdis("日"); lcdwc(0x88+FIRST_ADDR); str0=hh/16+0x30; str1=hh%16+0x3
32、0; hzkdis2(str); lcdwc(0x89+FIRST_ADDR); hzkdis(":"); str0=(mm/16)+0x30; str1= mm%16+0x30; hzkdis2(str); lcdwc(0x81+FIRST_ADDR); /*-*/ /* /不同按键实现不同功能 void gongneng(int gotkeys) int gn,gn10,gn0
33、; gn=gotkeys; switch(gn) case 0: DelayM(2000);gn0=gotkey();if(gn0=0) lcdreset();restlib();Init_DS18B20();Init_1302();DelayM(3000); cxjmlib();break; /长按系统初始化; case 10: lcdreset(); lcdw
34、c(0x80+FIRST_ADDR); hzkdis("1.设置时间"); lcdwc(0x90+FIRST_ADDR); hzkdis("2.设置闹时"); lcdwc(0x88+FIRST_ADDR); hzkdis("3.系统初始化"); lcdwc(0x79+FIRST_ADDR); hzkdis(""); tt:gn10=gotkey(); / if (gn1
35、0!=16) goto tt;tt1:gn10=gotkey(); / if (gn10=16) goto tt; switch(gn10) case 1: lcdreset(); read_clockS(); rj1lib();tt2: gn10=gotkey();
36、0; if (gn10!=16) goto tt2; tt3: gn10=gotkey(); if (gn10=16) goto tt2; switch(gn10) case 0: break; case 1: break; case 2: break; case 3:
37、; break; case 4: break; case 5: break; case 6: break; case 7: break; case 8: break; case 9: break; default:goto tt3; break; case 2: lc
38、dreset();read_clockS();naozhonglib();tt4: gn10=gotkey(); if (gn10!=16) goto tt4 ; gn10=gotkey(); if (gn10=16) goto tt4;
39、; break; case 3: lcdreset();rj3lib(); tt6: gn10=gotkey(); if (gn
40、10!=16) goto tt6; gn10=gotkey(); if (gn10=16) goto tt6; if(gn10=10) /键值为10就初始化系统 lcdres
41、et();restlib();Init_DS18B20();Init_1302();DelayM(3000); cxjmlib(); if(gn10=11) / 键值为11取消初始化,返回程序主界面; lcdreset();cxjmlib(); &
42、#160; break;tt8: gn10=gotkey(); if (gn10!=16) goto tt8 ; gn10=gotkey(); if (gn10=16) goto tt8
43、 break; default: goto tt1;
44、60; */void read_clockss(x) hh=Read_One_Byte(x*4+0x20); mm=Read_One_Byte(x*4+0x21); ss=Read_One_Byte(x*4+0x22); week_clock_set=Read_One_Byte(x*4+0x23);void Write_clock
45、ss(x) Write_One_Byte(x*4+0x20,hh); Write_One_Byte(x*4+0x21,mm); Write_One_Byte(x*4+0x22,ss); Write_One_Byte(x*4+0x23,week_clock_set);/* bit cmp_clock() /每分钟检测一次 unsigned char a1; for (a1=0;a1<32;a1+) read_clockss(a1);
46、60; /acc0 = a1*4+0x20 .acc1 .acc2 .acc3 if (hh=clock_data0) && (mm=clock_data1) return 1; return 0;*/unsigned char yy,mo,dd,xq,hh,mm,ss;/ 定义时间映射全局变量(专用寄存器)void clr_xs() lcdwc(0x80+FIRST_ADDR); hzkdis("");
47、60; lcdwc(0x90+FIRST_ADDR); hzkdis(""); lcdwc(0x88+FIRST_ADDR); hzkdis(""); lcdwc(0x98+FIRST_ADDR); hzkdis(""); void disp_set_clock() unsigned char
48、 sel; uchar str2; str2=0; lcdwc(0x91+FIRST_ADDR); str0=yy/16+0x30; str1=yy%16+0x30; hzkdis2(str);
49、; hzkdis2("年"); str0=mo/16+0x30; str1=mo%16+0x30; hzkdis2(str); hzkdis2("月"); str0=dd/16+0x30;
50、 str1=dd%16+0x30; hzkdis2(str); hzkdis2("日"); lcdwc(0x89+FIRST_ADDR); str0=hh/16+0x30; str1=hh%16+
51、0x30; hzkdis2(str); hzkdis2("时"); str0=mm/16+0x30; str1=mm%16+0x30; hzkdis2(str); hzkdis2("分")
52、; str0=ss/16+0x30; str1=ss%16+0x30; hzkdis2(str); hzkdis2("秒"); / lcdwc(0x98+FIRST_ADDR);
53、60; sel = (read_clock(0x8b)%16; /字节低4位的BCD码放入sel
54、; lcdwc(0x9c+FIRST_ADDR);/写入指定区域(97H 第二行第8个字) if(sel=7) hzkdis("07"); /
55、160; if(sel=6) hzkdis("06"); / if(sel=5) hzkdis("05"); /
56、 if(sel=4) hzkdis("04"); / if(sel=3) hzkdis("03"); /
57、0; if(sel=2) hzkdis("02"); / if(sel=1) hzkdis("01"); /星期一
58、 lcdwc(0x9a+FIRST_ADDR); hzkdis("星期") ; void disp_clock_set()
59、160; uchar str2; str2=0; lcdwc(0x89+FIRST_ADDR); str0=hh/16+0x30; str1=hh%16+0x30; hzkdis2(str);
60、hzkdis2("时"); str0=mm/16+0x30; str1=mm%16+0x30; hzkdis2(str); hzkdis2("分");/* str0=ss/16+0x30; str1=
61、ss%16+0x30; hzkdis2(str); hzkdis2("秒"); */ / week_clock_set / lcdwc(0x98+FIRST_ADDR); / hzkdis2(&quo
62、t; "); /*bit set_xs_1_flicker(uchar x,bit y) /修改数据标志 uchar a,str2; str1=0x1e; bit flicker=0; key_ok=1; while (gotkey()!=16) xs_fl0: while(1) for
63、60; (a=0;a<20;a+) / delay(500); if (gotkey()!=16) goto xs_fl1; key_ok=0; xs_fl1: lcdwc(x+FIRST_ADDR); if
64、(flicker) hzkdis2("_"); else str0=0x31; str1=0x1e; hzkdis2(str); flicker = flicker; a=gotkey(); if ( (a<10) && (key_ok=0)key_ok=1; y=a*16+(y%16); goto xs_lf2;
65、if (a=0x0b) return(y); if(a=10)return(y); if(a=13) lcdwc(x+FIRST_ADDR); str0=y/16+0x30; str1=y%16+0x30; hzkdis2(str); return(y);
66、60; if(a=14) goto xs_lf2; */uchar set_xs_flicker(uchar x,y) /修改数据标志 uchar a,str2; bit flicker=0; key_ok=1; while
67、(gotkey()!=16) xs_fl0: while(1) for (a=0;a<20;a+) delay(500); if (gotkey()!=16) goto xs_fl1; key_ok=0; xs_fl1: lcdwc(x
68、+FIRST_ADDR); if (flicker) hzkdis2("_"); else str0=y/16+0x30; str1=y%16+0x30; hzkdis2(str); flicker = flicker; a=gotkey(); if ( (a<10) && (key_ok=0)key_ok=1; y=a*16+(y%16)
69、; goto xs_lf2; if (a=0x0b) return(y); if(a=10)return(y); if(a=13) lcdwc(x+FIRST_ADDR); str0=y/16+0x30; str1=y%16+0x30; hzkdis2(str);
70、 return(y); if(a=14) goto xs_lf2; xs_lf2: while(1) for (a=0;a<20;a+) delay(500); if (gotkey()!=16) goto xs_fl3;
71、; key_ok=0; xs_fl3: lcdwc(x+FIRST_ADDR); if (flicker) str0=y/16+0x30; str1=0x5f; hzkdis2(str);
72、60; else str0=y/16+0x30; str1=y%16+0x30; hzkdis2(str); flicker = flicker; a=gotkey(); if ( (a<10) && (key_ok=0) key_ok=1; y=(y/16)*16+a;
73、; lcdwc(x+FIRST_ADDR); str0=y/16+0x30; str1=y%16+0x30; hzkdis2(str); return(y); if (a=0x0b) return(y); if(a=10) return(y); if(a=13)
74、160;goto xs_fl0; if(a=14) lcdwc(x+FIRST_ADDR); str0=y/16+0x30; str1=y%16+0x30; hzkdis2(str); return(y);
75、60; void xs_pls() clr_xs(); lcdwc(0x91+FIRST_ADDR); hzkdis("设置已经保存"); delay(10000);void set_clock()
76、60; while(1) lcdreset(); / read_clockS(); clr_xs(); lcdwc(0x82+FIRST_ADDR); hzkdis("时间设置"); disp_set_clock();set_cl1:
77、; yy=set_xs_flicker(0x91,yy); if(gotkey()=11) read_clockS();return; if(gotkey()=10) new_time();xs_pls(); return; set_cl2: mo=set_xs_flicker(0x93,mo);
78、 if(gotkey()=11) read_clockS();return; if(gotkey()=10) new_time(); xs_pls(); return; if(gotkey()=13) goto set_cl1;set_cl3: dd=set_xs_flicker(0x95,dd);
79、160;if(gotkey()=11) read_clockS();return; if(gotkey()=10) new_time();xs_pls(); return; if(gotkey()=13) goto set_cl2;set_cl4: hh=set_xs_flicker(0x89,hh); if(gotkey()=11) read_cl
80、ockS();return; if(gotkey()=10) new_time();xs_pls(); return; if(gotkey()=13) goto set_cl3;set_cl5: mm=set_xs_flicker(0x8b,mm); if(gotkey()=11) read_clockS();return;
81、 if(gotkey()=10) new_time();xs_pls(); return; if(gotkey()=13) goto set_cl4;set_cl6: ss=set_xs_flicker(0x8d,ss); if(gotkey()=11) read_clockS();return; if(gotkey()=10)
82、;new_time();xs_pls(); return; if(gotkey()=13) goto set_cl5;set_cl7: xq=set_xs_flicker(0x9c,xq); if(gotkey()=11) read_clockS();return; if(
83、gotkey()=10) new_time();xs_pls(); return; if(gotkey()=13) goto set_cl6 ; goto set_cl7; clock_set(uchar x) /设置闹钟 uchar str2; str2=0;clkset1: if (x=0) x=1; if (x>
84、32) x=1; while(1) lcdreset(); read_clockss(x); /改为要修改的闹钟 clr_xs(); lcdwc(0x82+FIRST_ADDR)
85、; hzkdis("闹钟设置"); lcdwc(0x87+FIRST_ADDR); str0=x/10+0x30; str1=x%10+0x30; hzkdis2(str); disp_clock_set(
86、); delay(100); hh=set_xs_flicker(0x89,hh); if(gotkey()=11) read_clockS();return; if(gotkey()=10) Write_clockss(x);xs_pls(); return; if(gotke
87、y()=13) Write_clockss(x);x=x-1; goto clkset1; if(gotkey()=14) Write_clockss(x);x=x+1; goto clkset1; mm=set_xs_flicker(0x8b,mm);set1: if(gotkey()=11) read_clockS();return; if
88、(gotkey()=10) Write_clockss(x);xs_pls(); return; if(gotkey()=13) Write_clockss(x); x=x-1;goto clkset1; if(gotkey()=14) Write_clockss(x); x=x+1; goto clkset1; goto set1;/*
89、; ss=set_xs_flicker(0x8d,ss);set2: if(gotkey()=11) read_clockS();return; if(gotkey()=10) Write_clockss(x);xs_pls(); return; if(gotkey()=13) Write_clockss(x); x=x-1;goto clkset1;
90、0; if(gotkey()=14) Write_clockss(x); x=x+1;goto clkset1; goto set2;*/ /*-*/*/*/ main() uchar i; lcdreset(); Init_DS18B20(); read_clockS(); &
91、#160; while(1) updata(); /主屏幕时间刷新 if (ss=0) /闹钟打铃判断 for (i=1;i<33;i+) if (hh=Read_One_Byte(
92、i*4+0x20) if (mm=Read_One_Byte(i*4+0x21) bell_on=1; goto main1;
93、 main1: if(bell_time>ss) if(bell_on=1)bell=0; speaker=speaker;delay(5000); else &
94、#160;bell=1;speaker=1;bell_on=0; delay(500); i=gotkey(); if (i=key_set) set_0: lcdreset(); key_ok=0; delay(10);
95、0;lcdwc(0x80+FIRST_ADDR); hzkdis("1.设置时间"); lcdwc(0x90+FIRST_ADDR); hzkdis("2.设置闹时"); lcdwc(0x88+FIRST_ADDR); hzkdis("3.系统初始化"); lcdwc(0x98+FIRST_ADDR); hzkdis("4.返回");
96、0; set_1: if(gotkey()=16)goto set_1; switch(gotkey() case 1: set_clock();break; case 2: clock_set(1);break; case 3:
97、;DelayM(2000);if(gotkey()=3) lcdreset();restlib();DelayM(4000); lcdreset();Init_1302();Init_DS18B20();read_clockS();break; if(gotkey()=0x03) goto set_2; if(gotkey()!=0x04) goto set_0;
98、;set_2: lcdreset(); void new_time(void) write_clock(0x8e,0x00);/允许写操作 write_clock(0x8c,yy);/年 write_clock(0x88,mo);/月 write_clock(0x86,dd);/日 write_clock(0x84,hh);/小时 wri
99、te_clock(0x82,mm);/分钟 write_clock(0x80,ss);/秒 write_clock(0x8a,xq);/星期 write_clock(0x90,0xa5);/充电 write_clock(0x8e,0x80);/禁止写操作yf.h#ifndef _YF_H_#define _YF_H_/定义累加器A中的各位sbit a0 = ACC 0;sbit a1 = ACC 1;sbit a2 = ACC 2;sbit a3 = ACC 3;sbit a4 = ACC 4;sbit a5 = ACC 5;sbit a6 = ACC 6;sbit a7 = ACC 7; #define uchar unsigned char#define key_set 10#define key_esc 11/*/定义全局变量sbit KEY_Y=P33;sbit KEY_N=P32;/*
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。