多功能数字电子表-总结报告优质资料_第1页
多功能数字电子表-总结报告优质资料_第2页
多功能数字电子表-总结报告优质资料_第3页
多功能数字电子表-总结报告优质资料_第4页
多功能数字电子表-总结报告优质资料_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

多功能数字电子表总结报告优质资料(可以直接使用,可编辑优质资料,欢迎下载)

多功能数字电子表总结报告优质资料(可以直接使用,可编辑优质资料,欢迎下载)电子技术综合设计总结报告姓名:王功臣、刘聪学号:04101686、04101680专业与班级:电气工程与自动化10-7班设计题目:多功能数字电子表时间:2021~2021学年第(1)学期指导教师:成绩:日期:绪论:随着计算机在社会各领域的渗透和大规模集成电路的发展,单片机的应用正不断的走向深入。单片机是一种集成在电路里的芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能集成到一块硅片上构成的一个小而完善的计算机系统。随着单片机的不断发展,现已应用领域十分广泛。。本文介绍的多功能数字电子钟的控制核心是单片机(STC89C52),以单片机内部定时计数器在计数满1s时产生一次中断,从而计数变量增加1,采用蜂鸣器、数码管显示器、语音报时电路以及其他电路构成。实现了时间显示、电子日历、时间预置、秒表、倒计时、闹铃、语音报时和复位等功能;通过对多功能时钟的设计,加深对单片机的理解,熟悉了单片机的内部硬件资源,掌握单片机的编程方法,学会对单片机各部分硬件资源的控制方法。此外,还要学会怎么利用所学单片机知识独立设计系统的能力,达到学于致用的目的,要学会发创设计编程思想,要学会开发系统的一般过程,并不断创新.一课题任务名称:多功能数字电子表基本要求:计时功能:显示时、分、秒,定闹功能,秒表功能,倒计时功能。提高要求:增加“语音报时”功能,增加“电子日历”功能。二方案比较与选择方案一:采用中规模集成电路,由电容、电阻、CMOS非门、晶体组成震荡电路提供一个频率稳定的方波信号,分频器电路将高频方波信号经若干次分频后得到1Hz的方波信号供秒计数器进行计数,秒位、分位、时位计数器分别为60、60、24进制计数器,译码驱动电路将计数器输出的8421BCD码转换为数码管需要的逻辑状态,并且为保证数码管正常工作提供足够的工作电流。整点报时、校时等功能也可以通过与非门组成的逻辑电路来实现。方案二:采用单片机内部定时计数器中断,控制计数变量,将计数变量通过单片机引脚送至总线驱动,为数码管提供足够的电流,通过程序控制每位数码管,实现动态显示。通过7个按键来实现时间预置、秒表、倒计时、闹钟设置、复位的功能。在没有中断,没有按键按下的时候,单片机循环执行显示程序,当中断发生时、有按键按下时,单片机进入相应的子程序执行。语音报时电路采用isd1420语音芯片,用麦克风录下人声,单片机控制语音芯片在适当的时候通过喇叭播放事先录好的声音。附加功能都可以通过单片机程序来实现。方案比较:方案一重要用逻辑电路来实现,需要的芯片较多,集成化低,功能越多,硬件电路越复杂,需要的芯片比较多,成本也较高,故障率高,而且技术相对落后。方案二采用单片机控制,可以方便地控制外围的器件,所有的功能都可以通过编程来实现,实现的功能也更加丰富,需要的芯片数少,电路相对简单。综合比较两种方案,本设计决定采用方案二。三电路设计3.1系统总体框图3.2各部分电路设计3.2.1复位电路在RST复位引脚接一个电容到VCC,接一个电阻到地就可以了。在给系统上电时,复位电路通过电容加到RST复位引脚一个短暂的高电平信号,这个复位信号随着VCC对电容的充电过程而回落,所以RST引脚复位的高电平维持时间取决于电容的充电时间。为了保证系统安全可靠的复位,RST引脚的高电平信号必须维持足够长的时间。电路图如图。3.2.2时钟电路时钟是单片机的心脏,单片机各功能部件的运行都是以时钟频率为基准,MCS-51单片机内部有一个用于构成振荡器的高增益反相放大器,该高增益反向放大器的输入端为芯片引脚XTAL1,输出端为引脚XTAL2。这两个引脚跨接石英晶体振荡器和微调电容,就构成一个稳定的自激振荡器。电路中的C1、C2的选择在30PF左右,但电容太小会影响振荡的频率、稳定性和快速性。晶振频率为在1.2MHZ~12MHZ之间,频率越高单片机的速度就越快,但对存储器速度要求就高。为了提高稳定性我们采用温度稳定性好的NPO电容,采用的晶振频率为12MHZ。本次系统的时钟电路设计如图。3.2.3数码管显示电路用六个共阳极7段数码管动态扫描显示时间变量,单片机P3口和P0口分别给数码管送位码和字型码,由于P0口没有内置上拉电阻,它输出不了高电平,所以要先给P0口加上上拉电阻。由于数码管输出电流比较小,由P3经过总线驱动器74ls573(或245)给需要显示的数码管的阳极高电平,为数码管提供足够的电流,这样相应的数码管就会点亮,延时一段时间接着显示下一位,循环显示。数码管管压降3.5v左右静态显示时工作电流大约5mA,动态显示时工作电流大约20mA,这里动态显示六个数码管,电流取30mA,所以,流过数码管的的限流电阻计算为:R=(5v-3.5v)/0.03A=50欧姆。3.2.4语音芯片电路采用ISD1420语音芯片,它是美国ISD公司出品的优质单片语音录放电路,由振荡器、语音存储单元、前置放大器、自动增益控制电路、抗干扰滤波器、输出放大器组成。一个最小的录放系统仅由一个麦克风、一个喇叭、两个按钮、一个电源、少数电阻电容组成。使用方便的单片录放系统,外部元件少,信息可保存100年,可反复录放10万次。录音端/REC和下降沿触发放音端/PLAYE分别接开关,用于手动录放音测试。按下开关,此端为低电平,开始录音或放音。此外,录音端口/REC还接到了三极管的集电极,三极管的基极由单片机的P1.0口控制,用于软件控制录音,每当P1.0为高电平时,按照事先设定好的录音时间和存放地址开始录音。三极管的发射极接了一个led,用于提示录音(录音期间led亮,录音结束led灭),集电极接了开关,不录音时关断开关,防止单片机影响引起误录音。3.2.5按键电路P1口通过10K的电阻接+5v电源,同时通过开关接地,开关没按下时P1口为高电平,当按键按下时P1口为低电平。3.2.6蜂鸣器驱动电路由于蜂鸣器额定电流较大,所以单片机无法直接驱动,这里用npn三极管驱动,电路图如图,由单片机控三极管基极来控制三极管的导通与关断。蜂鸣器两端电压按照1.5v计算,三极管集电极限流电阻计算公式为R=(5v-0.3v-1.5v)/50mA=64欧姆。四程序设计4.1总体思路采用定时计数器中断T0,10ms中断一次,秒表计时变量m[0]加1,依次往下进位。m[0]满100,计时变量a[7]的秒变量a[0]加1,依次向下进位。延时函数主函数为一个大的while(1)循环,在这个循环里先进行初始化,然后进入第二个while(1)循环,在没有按键按下时一直显示当前时间变量,当有按键按下时,进入按键函数,再次返回后判断复位变量restar是否为1,为1则跳出小的while(1)循环,在大循环中进行初始化然后再进入小的while(1)循环中。显示函数分为普通显示函数和时间预置状态下的显示函数。时间预置状态下的显示函数通过两个形参来确定要显示的变量以及要显示小数点的位(用于标示可调位)。按键函数keyscan()分为7个子功能函数,通过判断分别进入不同的功能函数执行。4.2程序框图(总体)五测试方案5.1仿真测试各个按键功能的程序分别编写,一个功能的程序编好后,在protues里仿真,出现问题回去分析修改程序直到仿真成功。然后开始接着写下一个功能程序,按照同样的方法测试仿真各个功能程序。5.2语音电路部分测试a)不用单片机控制,给语音芯片的地址端接低电平,从0x00开始录音,上电,按下录音按键,说一段语音,松开录音键,按下播放按键,看喇叭是否正常播放刚才录下的语音。b)通过录音程序,由单片机控制,上电,录音指示灯开始亮灭闪烁,指示灯亮时开始录入“1”、“2”、“3”、“4”、“5”·····的语音。然后通过放音按键看播放是否正确。5.3数字钟部分测试a)将程序烧进单片机,上电运行,观察数码管是否从00.00.00开始计时。b)按下按键3,看数码管显示是否进入时间预置状态。各个可调位的移动是否正确,各个位的增减是否可以,进率是否正确。设置好时间,再次进入时间预置状态,看年月日十分秒星期是否正确,退出状态是否顺利。c)按下按键4,看数码管显示是否进入秒表状态,通过按键1(开始暂停键)和按键2(清零键)观察秒表是否正确,退出状态是否顺利。d)按下按键5,应该进入倒计时状态,按照“b)”的方法进行倒计时初始时间设置的测试。然后再按下按键5,观察倒计时状态,观察计到零时是否停止在00.00.00,退出状态是否顺利。e)按下按键6,看是否进入闹钟时间设置状态,按照“b)”的方法进行闹钟时间预置测试。退出此状态,等待时间到达闹钟时间观察语音芯片是否报时。f)在任意状态下按下按键7观察数码管是否复位清零从00.00.00开始显示。g)测试整点报时。可以先将时间设置在靠近整点前,然后观察到整点时蜂鸣器、语音芯片是否都能正常报时。六测试结果与系统调试a)在各个按键功能的仿真测试上,每个功能按键的程序上都浪费了很长时间,出现了很多问题比如:进率错误、复位按键不灵、显示不稳定、显示乱码、状态跳不出来等等。最终,数字钟显示功能包括时间显示(包括年月日星期)、时间预置、秒表、倒计时、闹钟、蜂鸣器整点报时、复位都能较好地实现。b)一开始,功能正确,但数码管显示非常暗,几乎看不清,一位是限流电阻太大了,改成小的还是不行,有把限流电阻短路掉,数码管显示仍然很暗,最后反复检查电路后发现我们使用的是共阳极数码管,而电路中总线驱动器74ls573接在了字型码信号输出端,将573改接到位选信号线上数码管显示就正常了。c)语音电路一直没有反应,录音之后放不出音,后来发现ISD1420芯片根本买有焊到电路里去,由于芯片没有封装,所以没有引脚,只有28个焊点,要认为地用插针将它固定在电路板上,然后插针的两端分别和电路板和芯片焊在一起。这个问题解决之后电路也检查了几遍语音功能还是没有成功。我觉得是不是有原件坏了。八总结通过实践,基本完成了多功能数字钟的设计制作,它可以实现时间显示(包括年月日星期)、时间预置、秒表、倒计时、闹钟、蜂鸣器整点报时、复位的功能,基本功能实现得比较充分、丰富。从最初的选题、方案选择、查资料、电路设计、程序设计、原件参数的计算、焊接,整个过程下来,自己的基本的能力有了很大的提高。数字钟这个选题,电路不是很复杂,主要是编程麻烦点,很多功能的实现都需要比较复杂的程序来实现,程序的逻辑性比较强,所以,感觉最有收获的应该是C语言编程得到了很好的锻炼。为了美观同时也锻炼焊接技术,我们在焊接时尽量少用排线多用焊锡。另外,通过一起努力,也锻炼了我们的团队合作能力。我们的设计也存在着一些不足:(1)语音电路没有实现,时间有限,检测调试也没有出结果。(2)焊锡的走线存在浪费的现象,可能原件布局不是很合理。另外,有的原件焊错了之后有的线就成了“废线”。(3)程序太长,一些功能应该还有更好更简洁的算法来实现。这些不足也是以后应该努力的地方。九参考文献[1].夏兰,等.语音芯片ISD1420在轴位移监控表中的应用[J].自动化技术与应用.2004,23(11)[2].周润景,等.单片机电路设计分析与制作[M].北京:机械工业出版社,2021.5[3].胡汉才,单片机原理及接口技术,清华大学出版社,1996十附录A电路设计图a)原理图b)PCB图B程序主程序:#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharvoidplaysound(uchara[7]);sbitkey1=P1^0; //key1~key7为数字钟功能按键sbitkey2=P1^1;sbitkey3=P1^2;sbitkey4=P1^3;sbitkey5=P1^4;sbitkey6=P1^5;sbitkey7=P1^6;sbitPLAYLE=P2^7;//语音芯片放音控制位sbitbaoshi=P1^7; //整点报时控制位ucharrestar=0,count=0;//restar:复位标志位count:中断次数记录变量uchara[7]={0}; //存放计时变量星期、年、月、日、时、分、秒ucharm[3]={0}; //存放秒表计时变量分钟、秒、毫秒ucharg[3]={0};//存放闹钟时间变量存放时、分钟、秒ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管段码ucharcodetable1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //带小数点的段码//*********************************************延时函数******************************************************//voiddelay(uintms)//延时函数{uchari;while(ms--)for(i=0;i<110;i++);}//*********************************************中断函数*****************************************************//voidTimer0(void)interrupt1{TH0=(65535-10000)/256;TL0=(65535-10000)%256;m[0]++; //每10ms中断一次,秒表计数变量的毫秒位加1if(m[0]==100){m[0]=0; //毫秒位满100置0,秒位加1m[1]++;a[0]++; //计时变量秒位加1baoshi=0; //整点报时蜂鸣器响1s结束PLAYLE=1; //语音控制端置高,为下一次下降沿触发放音做准备if((a[0]==g[0]&&a[1]==g[1]&&a[2]==g[2])||(a[2]==g[2]&&g[1]==1&&g[0]==0&&a[1]==0&&a[0]==60))//若当前时间和闹钟预置时间相等,则://若闹钟预置时间为01:01:00或00:01:00,则判断a[0]是否为60P2=0x4b; //给送语音芯片送播放地址PLAYLE=0; //开始播放“起床起床起床起床”的声响if(m[1]==100) //秒位满100置0,更高位加1{m[1]=0;m[2]++;if(m[2]==100)m[2]=0;}if(a[0]==60) //秒变量满{a[0]=0;a[1]++;if(!(g[1]==1&&g[0]==0)) //如果特殊情况(闹钟预置时间为01:01:00或00:01:00)不满足,if(a[1]==60) //分钟变量满{a[1]=0; a[2]++;baoshi=1;//若分钟变量满则蜂鸣器整点报时(P1.7输出高电平),维持1秒 playsound(a);//调用放音函数进行语音整点报时if(a[2]==24){a[2]=0; a[3]++; if(a[3]==31&&(a[4]==4||a[4]==6||a[4]==9||a[4]==11)) //日变量加到31溢出(4、6、9、11月) {a[3]=0; a[4]++; } elseif(a[3]==32&&(a[4]==1||a[4]==3||a[4]==5||a[4]==7||a[4]==8||a[4]==10||a[4]==12)) //日变量加到32溢出(1、3、5、7、8、10、12月) {a[3]=0; a[4]++; } elseif(a[3]==29&&a[4]==2&&a[5]%4!=0) //日变量加到29溢出(平年的2月) {a[3]=0; a[4]++; } elseif(a[3]==30&&a[4]==2&&a[5]%4==0) //日变量加到30溢出(润年的2月) {a[3]=0; a[4]++; } else;}}}}}//************************************显示函数********************************************************************//voiddisp(uchara[7]){P3=0x20;P0=table[a[0]%10];delay(2);P3=0x10;P0=table[a[0]/10];delay(2);P3=0x08;P0=table1[a[1]%10];delay(2);P3=0x04;P0=table[a[1]/10];delay(2);P3=0x02;P0=table1[a[2]%10];delay(2);P3=0x01;P0=table[a[2]/10];delay(2);}//*************************************语音整点报时函数*********************************************************************//voidplaysound(uchara[7]){uchari; ucharad; if(a[2]<=10) { P2=0x41; //语音“现在时间”的地址, PLAYLE=0; for(i=0;i<10;i++)disp(a);//放音期间显示时间 PLAYLE=1; ad=a[2]*5; //语音"*"的地址 P2=ad; PLAYLE=0; for(i=0;i<5;i++)disp(a); PLAYLE=1; P2=0x55; //语音"点整"的地址 PLAYLE=0; for(i=0;i<5;i++)disp(a); PLAYLE=1; } if(a[2]>10&&a[2]<=19) { P2=0x41; //语音"现在时间"的地址 PLAYLE=0; for(i=0;i<10;i++)disp(a); PLAYLE=1; P2=0x32; //语音"十"的地址 PLAYLE=0; for(i=0;i<5;i++)disp(a); PLAYLE=1; ad=a[2]*5%10; //语音"*"的地址 P2=ad; PLAYLE=0; for(i=0;i<5;i++)disp(a); PLAYLE=1; P2=0x55; //语音"点整"的地址 PLAYLE=0; for(i=0;i<5;i++)disp(a); PLAYLE=1; } if(a[2]==20) { P2=0x41; //语音"现在时间"的地址 PLAYLE=0; for(i=0;i<10;i++)disp(a); PLAYLE=1; P2=0x0a; //语音"二"的地址 PLAYLE=0; for(i=0;i<5;i++)disp(a); PLAYLE=1; P2=0x32; //语音"十"的地址 PLAYLE=0; for(i=0;i<5;i++)disp(a); PLAYLE=1; P2=0x55; //语音"点整"的地址 PLAYLE=0; for(i=0;i<5;i++)disp(a); PLAYLE=1; } if(a[2]>20&&a[2]<24) { P2=0x41; //语音"现在时间"的地址 PLAYLE=0; for(i=0;i<10;i++)disp(a); PLAYLE=1; P2=0x0a; //语音"二"的地址 PLAYLE=0; for(i=0;i<5;i++)disp(a); P2=0x32; //语音"十"的地址 PLAYLE=0; for(i=0;i<5;i++)disp(a); PLAYLE=1; ad=a[2]*5%10; //语音"*"的地址 P2=ad; PLAYLE=0; for(i=0;i<5;i++)disp(a); PLAYLE=1; P2=0x55; //语音"点整"的地址 PLAYLE=0; for(i=0;i<5;i++)disp(a); PLAYLE=1; }}//*****************************时间预置显示函数(使用小数点区别预置位和其他位)*******************************************//voiddisp1(ucharf[7],ucharn){if(n<4) //n小于4表示,key3按下的次数小于4,数码管显示时分秒,预置位为时、分或秒位 { P3=0x20;//显示秒 if(n==1) //若n等于1,表示key3只按一次,预置位为秒位 P0=table1[f[0]%10]; else P0=table[f[0]%10]; delay(2);P3=0x10; //显示秒 if(n==1) P0=table1[f[0]/10]; else P0=table[f[0]/10]; delay(2); P3=0x08; //显示分 if(n==2) P0=table1[f[1]%10]; else P0=table[f[1]%10]; delay(2); P3=0x04; //显示分 if(n==2) P0=table1[f[1]/10]; else P0=table[f[1]/10]; delay(2); P3=0x02; //显示时 if(n==3) P0=table1[f[2]%10]; else P0=table[f[2]%10]; delay(2); P3=0x01; //显示时 if(n==3) P0=table1[f[2]/10]; else P0=table[f[2]/10]; delay(2); } if(n>3&&n<7) //表示key3按下的次数为4、5或6,数码管显示年月日,预置位为年、月或日位 { P3=0x20;if(n==4) P0=table1[f[3]%10]; else P0=table[f[3]%10]; delay(2); P3=0x10; if(n==4) P0=table1[f[3]/10]; else P0=table[f[3]/10]; delay(2); P3=0x08; if(n==5) P0=table1[f[4]%10]; else P0=table[f[4]%10]; delay(2); P3=0x04; if(n==5) P0=table1[f[4]/10]; else P0=table[f[4]/10]; delay(4); P3=0x02; if(n==6) P0=table1[f[5]%10]; else P0=table[f[5]%10]; delay(2); P3=0x01; if(n==6) P0=table1[f[5]/10]; else P0=table[f[5]/10]; delay(2); } if(n>6) //显示星期,预置位为星期位 { P3=0x20; P0=table1[f[6]%10]; delay(2); }}//*****************************************按键函数*************************************************************************// voidkeyscan(){ ucharnum=1; //num表示要预置的计时变量的序号,按一下,预置位移动一位 uchart=1; //t用在倒计时设置初始时间中,功能类似num ucharb[3]={0} ;//用于存放秒表正在运行时的时间变量(调用秒表显示函数的实参) ucharc[3]={0}; //用于存放秒表开始时刻的m[]值 uchard[3]={0}; //用于存放上一次暂停时的b[]值 uchare[3]={0}; uchari=0,j=0; //*******************时间预置程序********************//if(key3==0) //key3:进入时间预置状态 {delay(10); if(key3==0) {EA=0; while(!key3)disp1(a,num); while(num<8) { while(key1&&key2&&key3&&key7) disp1(a,num); if(key3==0) //调整预置变量序号 { delay(10); if(key3==0) num++; } while(!key3)disp1(a,num); if(key2==0) { delay(10); if(key2==0) if(a[num-1]==0) switch(num) { case1:a[num-1]=60;break; //若秒变量减到零,则置60 case2:a[num-1]=60;break; //若秒变量减到零,则置60 case3:a[num-1]=24;break; //若小时变量减到零,则置24 case4:a[num-1]=31;break; //若日变量减到零,则置31 case5:a[num-1]=13;break; //若月变量减到零,则置13 case6:a[num-1]=100;break; //若年变量减到零,则置100(只显示年份的后两个数字) case7:a[num-1]=8;break; //若星期变量减去到零,则置7 } a[num-1]--; //放在后面,防止计时变量一开始就0溢出 } while(!key2)disp1(a,num); if(key1==0) { delay(10); if(key1==0) a[num-1]++; switch(a[num-1]) //判断计时变量有没有达到溢出值 { case13:if(num==5)a[num-1]=1;break; case24:if(num==3)a[num-1]=0;break; case31:if(num==4)a[num-1]=1;break; case60:if(num==1||num==2)a[num-1]=0;break; case100:if(num==6)a[num-1]=0;break; case8:if(num==7)a[num-1]=1;break; } } while(!key1)disp1(a,num); if(key7==0) //整机复位检测 {delay(5); if(key7==0) {restar=1;break;} } } } EA=1; while(!key7)disp(a);//复位键松手检测 } //******************秒表程序******************//if(key4==0) //进入秒表状态{delay(5); if(key4==0) {while(!key4)disp(b);while(1) {if(key4==0) //若key4按下,退出抄表状态 {delay(5); if(key4==0) while(!key4)disp(b);break; } if(key2==0) //若key2复位键按下,显示000000 {delay(5); if(key2==0) {for(j=0;j<3;j++) {b[j]=0; d[j]=0; } while(!key2)disp(b); while(key1&&key4&&key7)disp(b); } } while(key2&&key4&&key7)//若key2、key4、key7键没按下,则执行下面程序 { if(key1==0) //若秒表启停位key1按下 { delay(5); if(key1==0) { //状态变量i加1 i++; if(i%2==1) //若i为奇,启动秒表 { for(j=0;j<3;j++) c[j]=m[j]; while(!key1) { for(j=0;j<3;j++) b[j]=m[j]-c[j]+d[j];disp(b); } while(key2&&key4&&key1) //若无按键按下,显示 { for(j=0;j<3;j++) b[j]=m[j]-c[j]+d[j]; disp(b); } } else //否则,暂停秒表 { while(!key1)disp(b); while(key2&&key4&&key1&&key7)disp(b); for(j=0;j<3;j++) d[j]=b[j]; //记录暂停时b[]的值 } } } disp(b); } if(key7==0) //整机复位检测 {delay(5); if(key7==0) break; }disp(b); } } } //***************倒计时程序******************// if(key5==0) //进入倒计时状态 {delay(5); if(key5==0) { while(!key5)disp1(e,t); while(t<5) //若按满5次退出秒表 { while(key1&&key2&&key5&&key7) disp1(e,t); if(key1==0) //如果key1按下,初始值加1 {delay(5); if(key1==0) { e[t-1]++; //相应的倒计初始值变量加1 if(e[t-1]==60&&(t==1||t==2)) //加到60,置0,进1 e[t-1]=0; if(e[t-1]==24&&t==3) //加到24,置0,进1 e[t-1]=0; while(!key1)disp1(e,t); while(key1&&key2&&key5&&key7)disp1(e,t); //若无按键按下,显示当前值 } } if(key2==0) //如果key2按下,初始值减1 {delay(5); if(key2==0) { if(e[t-1]==0&&(t==1||t==2)) e[t-1]=60; if(e[t-1]==0&&t==3) e[t-1]=24; e[t-1]--; while(!key2)disp1(e,t); while(key1&&key2&&key5&&key7)disp1(e,t); } } if(key5==0) //如果key5按下 {delay(5); if(key5==0) {t++; //记录按下次数变量加1 if(t==1||t==2||t==3) //按下次数为1、2或3,处于初始值预置状态 { while(!key5)disp1(e,t); while(key1&&key2&&key5&&key7)disp1(e,t); } if(t==4) //如果key5按下4次,则进入倒计时程序 { if(e[0]==0&&e[1]==0&&e[2]==0)//若倒计时变量为0就进入倒计时状态,则 while(key1&&key2&&key5&&key7)//一直显示000000 disp(e); for(j=0;j<3;j++) {c[j]=a[j]; //c记录此刻计时变量 d[j]=e[j]; //d记录倒计时初始值 } while(!key5) {for(j=0;j<3;j++) {e[j]=d[j]-a[j]+c[j]; //做减法运算 disp(e); }} while(key5&&key7) {for(j=0;j<3;j++) e[j]=d[j]-a[j]+c[j]; if(e[0]==0&&(e[1]!=0||e[2]==0)) //减到60时向高位借位 {e[0]=59; e[1]--; } if(e[0]==0&&(e[1]==0||e[2]!=0)) { e[0]=59; e[1]=59; e[2]--; } if(e[0]==0&&(e[1]!=0||e[2]!=0)) {e[0]=59; e[1]--; if(e[1]==0) e[2]--; } if(e[0]==0&&e[1]==0&&e[2]==0) //若倒计时时间减到0,则一直显示000000 while(key5&&key7)disp(e); disp(e); } while(!key5)disp(e); //key5按下了5次,跳出程序前松手检测 t++; //,t加1,使循环条件不满足,跳出倒计时函数 } } } if(key7==0) //整机复位检测 {delay(5); if(key7==0) {t=5;} } } } } //*********************闹钟程序**************************// if(key6==0) //key6:进入闹钟时间预置状态 {delay(5); if(key6==0) { while(!key6)disp1(g,num); while(num<4) { while(key1&&key2&&key6&&key7) disp1(g,num); if(key6==0) //调整预置变量序号 { delay(5); if(key6==0) num++; } while(!key6)disp1(g,num-1); if(key2==0) { delay(10); if(key2==0) if(g[num-1]==0) switch(num) { case1:g[num-1]=60;break; //若秒变量减到零,则置60 case2:g[num-1]=60;break; //若秒变量减到零,则置60 case3:g[num-1]=24;break; //若小时变量减到零,则置24 } g[num-1]--; //放在后面,防止计时变量一开始就0溢出 } while(!key2)disp1(g,num); if(key1==0) { delay(5); if(key1==0) g[num-1]++; switch(g[num-1]) //判断计时变量有没有达到溢出值 { case25:if(num==3)g[num-1]=0;break; case61:if(num==1||num==2)g[num-1]=0;break; } } while(!key1)disp1(g,num); if(key7==0) { delay(5); if(key7==0) { restar=0;num=4; } } } } }//****************复位程序********************// if(key7==0)//key7:复位 { delay(10); if(key7==0) restar=1;}}//***************************************主函数******************************************************************************//voidmain() //主函数{while(1){a[0]=0; //初始化a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=0;a[6]=0;TH0=(65535-50000)/256;TL0=(65535-50000)%256;TMOD=0x01;TR0=1;EA=1;ET0=1;restar=0;while(1){while(!key7)disp(a);while(key3&&key4&&key5&&key6&&key7)disp(a); //若无按键按下,一直显示当前值keyscan(); //有按键按下,进入键盘函数if(restar==1) //判断复位标志位break;}}}录音程序:#include<reg52.h>sbita=P3^7;voiddelay(){ unsignedchari,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);}voidmain(){ a=0;P2=0x00; //录音“0”,放入0x00开始的5个存储单元a=1; //开始录音delay(); //延时0.5sa=0; //结束录音delay(); //延时2s,为下一次录音做准备P2=0x05;//录音"1",放入0x05开始的5个存储单元a=1;delay();a=0;delay();P2=0x0A;//录音"2",放入0x0a开始的5个存储单元a=1;delay();a=0;delay();P2=0x0F;//录音"3",放入0x0f开始的5个存储单元a=1;delay();a=0;delay();P2=0x14;//录音"4",放入0x14开始的5个存储单元a=1;delay();a=0;delay();P2=0x19;//录音"5",放入0x19开始的5个存储单元a=1;delay();a=0;delay();P2=0x1E;//录音"6",放入0x1e开始的5个存储单元a=1;delay();a=0;delay();P2=0x23;//录音"7",放入0x23开始的5个存储单元a=1;delay();a=0;delay();P2=0x28;//录音"8",放入0x28开始的5个存储单元a=1;delay();a=0;delay();P2=0x2D;//录音"9",放入0x2d开始的5个存储单元a=1;delay();a=0;delay();P2=0x32;//录音"10",放入0x32开始的5个存储单元a=1;delay();a=0;delay();P2=0x37;//录音"点整",放入0x37开始的5个存储单元a=1;delay();a=0;delay();P2=0x3C;//录音"1",放入0x05开始的5个存储单元a=1;delay();a=0;delay();P2=0x41;//录音“现在时间”,放入0x41开始的5个存储单元a=1;delay();//延时1sdelay();a=0;delay();P2=0x4B;//录音“起床起床起床起床”a=1;delay();//一共延时2sdelay();delay();delay(); delay(); delay();a=0;delay();}C相关作品图片见文件夹“多功能数字电子表+说明书+王功臣+电气10-7班”。目录摘要21引言32设计方案与要求32.1功能要求32.2系统基本方案选择和论证3单片机芯片的选择和论证……………………3显示模块的选择和论证………4时钟芯片的选择和论证………42.3电路设计最终方案决定42.4各硬件基本原理及介绍4单片机原理及介绍…………………4数码管显示原理及介绍…………………5原理及介绍…………..53硬件设计部分63.1电路设计框图63.2系统硬件概述63.3主要单元电路的设计6单片机主控制模块的设计……………………6时钟电路DS1302的设计…………………….7显示模块的设计………………9锁存器模块的设计…………..104软件设计部分104.1软件设计概述104.2KeilC51和Proteus介绍114.2.1KeilC51的介绍……………...11的介绍……………….114.3整体设计115结束语14基于DS1302与数码管设计的电子表摘要单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子产品等,这些都离不开单片机。单片机是将CPU、RAM、ROM、定时器、计数器和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上,而51系列单片机是各单片机中最为典型和最有代表性的一种。本文通过对一个基于DS1302与数码管的电子表的设计,从而达到学习、了解单片机相关指令在各方面的应用。系统由主控制器AT89C51、实时钟电路DS1302、显示电路组成,能实现时钟显示的功能,能进行时、分、秒的显示。关键词:单片机;DS1302;数码管;电子表引言随着微电子技术的高速发展,随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。单片机以体积小、功能全、性价比高等诸多优点,在工业控制、家用电器、通信设备、信息处理、尖端武器等各种测控领域的应用中独占鳌头,单片机开发技术已成为电子信息、电气、通信、自动化、机电一体化等专业技术人员必须掌握的技术。而电子表作为电子类小设计,是单片机实验中一个很常用的题目。因为它有很好的开放性和可发挥性,不仅考察了对单片机的掌握能力更加强了对单片机扩展的应用。而且在操作的设计上要力求简洁,功能上尽量齐全,显示界面也要出色。电子表已经越来越流行,特别是适合在家庭居室、办公室、大厅、会议室、车站和广场等使用,壁挂式LED数码管显示的万年历逐渐受到人们的欢迎。采用软件和硬件结合的方法,控制LED数码管输出,分别用来显示年、月、日、时、分、秒,其最大特点是:硬件电路简单,安装方便易于实现,软件设计独特可靠。在软件设计过程中,应对硬件部分有相关的了解,这样有助于对设计更深刻的了解,有助于软件设计。设计方案与要求功能要求本电子表的功能:能动态显示小时、分钟、秒系统基本方案选择和论证单片机芯片的选择和论证方案一:采用AT89S52芯片作为硬件核心,采用FlashROM,内部具有4KBROM存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。方案二:采用AT89C51,片内ROM全都采用FlashROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KBROM存储空间,同样具有89S52的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。结论:采用AT89C51作为主控制系统.显示模块的选择和论证方案一:采用LED液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字、图形。但是价格昂贵,需要的接口线多,所以在此设计中不采用LED液晶显示屏。方案二:采用LED数码管动态扫描,LED数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片机连接时,占用的单片机口线少。结论:采用LED数码管作为显示。时钟芯片的选择和论证方案一:直接采用单片机定时计数器提供脉冲信号,使用程序实现年、月、日、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。方案二:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、月、年进行计数,而且精度高。结论:采用DS1302作为时钟芯片。电路设计最终方案决定综上各方案所述,对此次作品的方案选定:采用AT89C51作为主控制系统、DS1302提供时钟、LED数码管动态扫描作为显示。各硬件基本原理及介绍AT89C51单片机原理及介绍单片机是一种集成电路芯片,是采用超大规模集成电路技术把CPU、随机存储器RAM、ROM、多种I/O接口和中断系统、定时器/计数器、A/D转换器等功能集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。AT89C51单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。AT89C51引脚如图所示LED数码管显示原理及介绍LED显示是绝大多数单片机应用系统必备的部件之一,发光二极管组成的LED显示是单片机应用产品中最常用的廉价输出设备。它由若干个发光二极管按一定的规律排列而成。当某一个发光二极管导通时,相应的一个点或一笔画被点亮,控制不同组合的二极管导通,就能显出各种字符。发光二极管的阳极连在一起的称为共阳极显示器,阴极连在一起的成为共阴显示器。1位显示器由8个发光二极管组成,其中7个发光二极管a~g控制7个笔画的亮或暗,另一个控制一个小数点的亮和暗。引脚如图所示DS1302原理及介绍DS1302是美国DALLAS公司推出的一种高性能、低功耗的电子表芯片,附加31字节静态RAM,采用SPI三线接口与CPU一进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。电子表可提供秒、分、时,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5V~5.5V。采用双电源供电(主电源和备用电源)。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。引脚如图所示硬件设计部分主控制器AT89C51电路设计框图主控制器AT89C51显示电路LED数码管时钟电路DS1302显示电路LED数码管时钟电路DS1302系统硬件概述本设计是由AT89C51单片机为控制核心,具有在线编程功能,低功耗,能在3V超低压工作。时钟电路由DS1302提供,采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能,本电路采用DS1302单字节传送方式实现与主控机之间数据的传送。显示部分由LED数码管动态扫描来显示。主要单元电路的设计单片机主控制模块的设计单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端为输入端,XTAL2接外部晶振和微调电容的另一端为输出端。第9引脚为复位输入端,接上电容,电阻及开关后构成复位电路。主控制系统1.内部结构按功能分为8部分:CUP,程序存储器,数据存储器,时钟电路,串行口,并行I/O口,中断系统,定时/计数器。2.引脚定义及功能Vcc:接+5V电源Vss:接地XTAL1和XTAL2:时钟引脚,外接晶体引线端。RST/Vpq:RST是复位信号输入端,Vpd是备用电源输入端。I/O口引脚:P0.0~P0.7:P0口8位双向I/O口;P1.0~P1.7:P1口8位准双向I/O口;P2.0~P2.7:P2口8位准双向I/O口;P3.0~P3.7:P3口8位准双向I/O口。时钟电路DS1302的设计引脚功能及结构DS1302的电路图如下,其中Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。X1和X2是振荡源,外接32.768kHz晶振。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数据输入输出端(双向),SCLK始终是输入端。DS1302与单片机的连接也仅需要3条线:CE引脚、SCLK串行时钟引脚、I/O串行数据引脚。DS1302电路图2.读写时序说明DS1302是SPI总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。DS1302的控制字如图:DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置“0”,接着把RST端置“1”,最后才给予SCLK脉冲。控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。位6:如果为0则表示存取时钟数据,为1表示存取RAM数据位5至位1(A4-A0):指示操作单元的地址位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP”是写保护位,在任何的对时钟和RAM的写操作之前,“WP”必须为0。当“WP”为1时,写保护位防止对任一寄存器的写操作。控制字节总是从最低位开始输入/输出的,在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。数据读写时序如图:显示模块的设计LED数码管(LEDSegmentDisplays)是由8个发光二极管构成。按照一定的图形及排列封转在一起的显示器件。其中7个LED构成7笔字形,1个LED构成小数点(固有时成为八段数码管)LED数码管有两大类,一类是共阴极接法,另一类是共阳极接法,共阴极就是7段的显示字码共用一个电源的负极,是高电平点亮,共阳极就是7段的显示字码共用一个电源的正极,是低电平点亮。只要控制其中各段LED的亮灭即可显示相应的数字、字母或符号。数码管驱动可分为静态和动态两种。静态驱动也称直流驱动,静态驱动是指每个数码管的每一个段码都由一个单片机的I/O口进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O口多。动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共端为位选端,位选端由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但由于位选端不同所以我们只要将需要显示的数码管的位选端打开,该位就显示出字形,没有打开的数码管就不会亮。通过轮流控制各个LED数码管位选端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,人看到的是一组稳定的显示信息,不会有闪烁感,动态显示能够节省大量的I/O口,而且功耗更低。共阳极LED数码管的内部结构原理图

共阴极LED数码管的内部结构原理图

锁存器模块的设计74HC573是一种CMOS器件,器件的输入是和标准CMOS输出兼容的,加上拉电阻,他们能和LS/ALSTTL输出兼容。当锁存使能端LE为高时,这些器件的锁存对于数据是透明的。当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。软件设计部分软件设计概述单片机作为嵌入式系统的核心器件,其应用系统设计包括硬件电路设计和软件电路设计两个方面,学习和应用过程中必须软硬结合。单片机系统调试通常分为软件调试、硬件调试和整体调试三个部分。单片机自身不具备开发功能,必须借助于开发工具。目前,国内外推出了许多基于个人计算机的单片机软或硬开发平台。硬件开发平台方面诸如开发板、实验箱、仿真器、编程器、示波器等,但因其价格不低,开发过程繁琐。因此在软件支持的前提下,应用最普遍的是软件仿真开发平台。单片机应用系统软件仿真开发平台有两个常用的工具软件:Keil和Proteus主要用于单片机源程序的编辑、编译、链接以及调试。。KeilC51和Proteus介绍KeilC51的介绍KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编辑器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境将这些部分组合在一起。Proteus的介绍Proteus是英国Labcenter公司开发的电路分析与实物仿真软件,可以仿真、分析各种模拟器件和集成电路,该软件的特点是:现了单片机仿真和电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能,有各种虚拟仪器,如示波器、信号发生器等,提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态。整体设计整体实现过程:由串行的时钟芯片DS1302将时钟信号送给单片机,单片机处理后输出。而74HC573将串行信号变成并行信号,每个74HC573对应LED八段码,二个74HC573对应二组LED数码管。单片机P0.7-P0.0和P2.7-P2.0分别连接两个数码管组和74HC573锁存器驱动数码管被点亮。其整个过程如下图:主要程序如下:#include"reg52.h"#include"8LED.h"#include"DS1302.h"#include"TIMER.h"#include"DISPLAY.h"#include"KEY.h"#include"EX_INT.h"staticvoidSystemClockDeal(void);voidmain(){ TimerInit(); EX_INT_Init(); //DS1302_Initime(16,12,19,1,12,12,12); //年月日周时分秒 SetPara.Ensure=false; SetPara.SetFlag=false; while(1) { SystemClockDeal(); //系统进程节拍调度 }}staticvoidSystemClockDeal(void){ switch(SystemClockStaus) { caseWAIT: break; caseGET_TIME: { if(SetPara.SetFlag==false) { DS1302_ReadTime(); } TimeToDisbuf(); //把时间按次序存到显示缓冲区 LED8_Code_Match(DisText); //把需要显示的数组转换成数码管码表 if(SetPara.Ensure==true) { SetPara.Ensure=false; SetPara.SetFlag=false; DS1302_Initime(16,12,19,1,SetPara.Hour,SetPara.Minute,0);//年月日周时分秒 } //此处不加break,因为当在GET_TIME状态下,也满足LED_SCAN状态。 } caseLED_SCAN: { LED8_Display(); //数码管动态扫描 SystemClockStaus=WAIT; break; } default: break; }}结束语2021年12月我开始了我的课程设计工作,时至今日,论文基本完成。从最初的茫然,到慢慢的进入状态,再到对思路逐渐的清晰,整个设计过程难以用语言来表达。历经了一个月的奋战,紧张而又充实的毕业设计终于落下了帷幕。回想这段日子的经历和感受,我感慨万千,在这次毕业设计的过程中,我拥有了无数难忘的回忆和收获。当我终于完成了所有打字、绘图、排版、校对的任务后整个人都很累,但同时看着电脑荧屏上的毕业设计稿件我的心里是甜的,我觉得这一切都值了。在我徜徉书海查找资料的日子里,面对无数书本的罗列,最难忘的是每次找到资料时的激动和兴奋;亲手用Proteus设计电路图的时间里,记忆最深的是每一步小小思路实现时那幸福的心情;我从资料的收集中,掌握了很多单片机及其接口应用的知识,让我对我所学过的知识有所巩固和提高,并且让我对当今单片机的最新发展技术有所了解。在整个过程中,我学到了新知识,增长了见识。在今后的日子里,我仍然要不断地充实自己,争取在所学领域有所作为。毕业论文的写作过程是我的一次再学习,再提高的过程。在论文中我充分地运用了大学期间所学到的知识。脚踏实地,认真严谨,实事求是的学习态度,不怕困难、坚持不懈、吃苦耐劳的精神是我在这次设计中最大的收益。参考文献[1]王静霞.《单片机应用技术》,电子工业出版社,2021.[2]张毅刚,彭喜元,姜守达,乔立言.《新编MCS-51单片机应用设计》哈尔滨工业大学出版社,2021[3]马忠梅.《单片机的C语言应用设计》北京航空航天大学出版社2021[4]张道德.《单片机接口技术》,中国水利水电出版社2007[5]石生.《电路基本分析》,高等教育出版社2021[6]谭浩强.《C语言程序设计》(第2版),清华大学出版社.[7]刘国巍,周晓萍,周莉《数字电子技术基础》,国防科技大学出版社2021[8]刘守义,《单片机应用技术》(第2版)西安电子科技大学出版社,2007[9]先锋工作室《单片机程序设计实例》北京:清华大学出版社,2003[10]李群芳,《单片机微型计算机与接口技术》(第2版)北京:电子工业出版“美洲狮感恩十年”年会总结报告宋林山2011年美洲狮感恩十年年会已经落下帷幕,年会的成功举办势必对公司后期的发展产生众多积极的影响,为了准确的把握和预见年会对我们带来的积极效应并采取针对性措施使到这些效应扩大化以及总结年会中准备不足或者忽略的教训,现对年会工作进行总结,方便以后工作开展,提高工作效率。本篇总结报告将从以下四个方面纲目内容进行分析和总结:1:会议前期准备2:会议现场流程3:

温馨提示

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

评论

0/150

提交评论