基于at89s51的密码柜控制器设计_第1页
基于at89s51的密码柜控制器设计_第2页
基于at89s51的密码柜控制器设计_第3页
基于at89s51的密码柜控制器设计_第4页
基于at89s51的密码柜控制器设计_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

PAGE30毕业设计基于AT89S51的密码柜控制器设计

摘要:随着社会物质财富的日益增长和科技文明的高速发展,安全防盗已成为一个备受关注的社会问题。而互开率极高的机械锁泛滥成灾,有诸多安全隐患。本文使用单片机设计了一个密码柜控制器。设计中,使用单片机AT89S51作为主控芯片,E2PROMAT24C02作为数据存储器,并结合外围电路进行设计。该控制器具有密码输入、密码比对、密码修改、错误报警和状态显示等功能。论文详细描述了控制器的设计方案,给出了各功能模块的程序流程图和代码清单。经测试表明,该控制器的软件运行正常,可以实现设计目标。关键词:密码柜;单片机;LED显示;AT89S51;AT24C024

DesignofCodeCabinetControllerBasedonAT89S51AbstractWiththegrowingmaterialwealthofthesocietyandtherapiddevelopmentofscienceandtechnology,securityhasbecomeasocialproblemwhichshouldbepaidmoreattention.Themechanicallockscanbeopenedmutuallywhichhasbecomeasafetyhazard.Inthispaper,adesignofthecodecabinetcontrollerbasedonMCUisproposed.ThedesignisaccomplishedbyusingAT89S51andAT24C02asthemaincontrollerchipandthedatamemory.Inaddition,externalcircuitisalsoadoptedtofinishedthedesign.Thecontrollerhasmanyfunctionssuchaspasswordinputting,passwordcomparing,passwordmodifying,errorwarningandstatedisplayingetc.Inthisthesis,thedesignmethodofthecontrollerisdescribedindetail,andtheprogramflowchartandcodelistoffunctionblocksarepresentedrespectively.Thedebuggingindicatedthatthesoftwareworkswellandcanachievethedesigngoal.Keywords:codecabinet;MCU;LEDdisplay;AT89S51;AT24c02

目录TOC\o"1-2"\h\u3309摘要 1269911引言 4111622密码柜控制器的功能与设计方案 4251362.1密码柜控制器的功能 4313882.2密码柜控制器的设计方案 488323芯片介绍 598083.1单片机AT89S51 5316463.2存储器芯片AT24C024 681653.3译码器74LS138 7130943.4集成稳压模块MC7805 7294604密码柜控制器硬件设计 762534.1电源电路设计 7170004.2输入键盘电路设计 8230624.3复位电路设计 9263954.4时钟电路设计 9176794.5信息存储电路设计 10226784.6数码管显示电路设计 1083304.7报警电路设计 11248384.8开锁电路设计 11140045密码柜控制器软件设计 1240235.1软件工作流程 12225845.2键盘输入子程序 1279435.3密码比对子程序 12227405.4密码修改子程序 13294895.5密码错误报警子程序 13136975.6开锁子程序 13164545.7程序存储器读写子程序 13227915.8状态显示子程序 1464076软件编译与调试 15230206.1KeilC51编译 15300836.2开发板调试 1595017结束语 1630624参考文献 1625298附录1 179468附录2 18

1引言锁自古以来就是把守门户不可或缺的法宝,古代能工巧匠对于机械锁的研究至今仍让世人叹为观止。但是,由于高保密性能的机械锁工艺复杂、成本较高,一直未能推广使用,大多使用的还是传统的简单机械锁。同时,假冒伪劣的机械锁也已泛滥成灾,互开率非常高,极不安全。现在,在大型超市、娱乐场所等,员工个人物品的存放和顾客随身物品的寄存都需要储物柜。而一些工厂、企事业单位保密文件的安全存放,更需要保密设施完备的文件柜。传统的箱柜多采用机械锁,而传统机械锁有诸多不安全因素。随着电子产品的普及和自动化时代的到来,机械产品由于其高繁复性和高废材性,已不能适应人们的需求,慢慢退出市场。而电子产品则以其轻便、快捷、高性价比的特点迅速占领市场。采用电子电路设计的密码锁应运而生,并逐渐引领潮流。本设计采用单片机AT89S51设计了一个密码柜控制器,该控制器可用一个电路控制多个密码柜,通过输入密码对密码柜进行开启和锁闭,操作简便,防盗性强。2密码柜控制器的功能与设计方案2.1密码柜控制器的功能本次设计的,密码柜控制器的功能如下:系统初始化后,进入等待密码输入阶段,当有6位密码输入时(前2位为箱号,后4位为密码),则进行密码比对。密码正确,则显示“P”,此时,若按下“开锁”按钮,对应的柜门打开;若按下“修改密码”按钮,则进入密码修改状态。完成相应操作后,系统会进行初始化,可重新输入密码。密码错误,则进入密码错误环节,提示重新输入。当密码输入错误三次时,就不再读取按键,并进行报警,同时屏幕显示“ERROR”。2.2密码柜控制器的设计方案密码柜控制器设计方案如图1所示,电路分为九个部分:电源电路、LED数码管显示、复位电路、时钟电路、键盘输入、密码储存、报警电路、LED指示、开锁控制电路。本设计以单片机AT89S51为核心设计密码柜的控制器。单片机具有编程方式灵活、I/O端口丰富、控制性能准确等优点。设计中,使用AT24C02作为程序存储器,与单片机P1.0~P1.2相连;输入键盘作为密码输入终端,与单片机P3口相连;数码管电路作为状态显示终端,与单片P0口及P2.0~P2.2口相连;开锁电路用来控制开锁动作,与单片机P2.3~P2.7相连。图1密码柜控制器设计方案3芯片介绍3.1单片机AT89S51AT89S51是美国ATMEL公司生产的低功耗、高性能的8位单片机,采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚。片内含有4K字节的可编程Flash程序存储器,既可在线编程(ISP),也可用传统方法进行编程。AT89S51的封装形式如图2所示,提供以下标准功能:4K字节Flash存储器,128字节内部RAM,4个I/O口,看门狗(WDT),两个数据指针,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89S51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式:空闲方式和掉电方式。空闲方式停止CPU的工作,但允许RAM、定时/计数器、串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作,并禁止其它所有部件,直到下一个硬件复位[1]。图2AT89S51封装图3.2存储器芯片AT24C024AT24C02是支持I2C总线数据传送协议的CMOSE2PROM,其容量为256字节,擦写次数可达10万次以上,写入数据的有效保存时间可达100年[2]。其封装形式如图3所示。图3AT24C02封装图SCL:串行时钟,AT24C02串行时钟输入管脚用于产生器件所有数据发送或接收的时钟,这是一个输入管脚。SDA:串行数据/地址,AT24C02双向串行数据/地址管脚用于器件所有数据的发送或接收,SDA是一个开路输出管脚,可与其它开路输出或集电极开路输出进行线或(wire-OR)。A0、A1、A2:地址输入端,这些输入脚用于多个器件级联时设置器件地址,当这些脚悬空时默认值为0。当使用AT24C02时最大可级联8个器件。如果只有一个AT24C02被总线寻址,这三个地址输入脚(A0、A1、A2)可悬空或连接到Vss,如果只有一个AT24C02被总线寻址这三个地址输入脚(A0、A1、A2)必须连接到Vss。WP:写保护,如果WP管脚连接到Vcc,所有的内容都被写保护只能读。当WP管脚连接到Vss或悬空时,允许器件进行正常的读/写操作[3,4]。3.3译码器74LS13874LS138为3线-8线译码器,其封装形式如图4所示。该译码器有3位二进制输入A1、A2、A3,共有8种状态组合,可编译出8个输出信号~。此外,还设置了3个使能输入端和和。3.4集成稳压模块MC7805设计中,需要一个能提供精确+5V电压的稳压电源,这里使用Motorola公司的电压芯片MC7805,它能将12V左右的电压转变为精确+5V的电压输出[6,7]。其封装形式如图5所示。图474LS138封装图图5MC7805封装图4密码柜控制器硬件设计4.1电源电路设计在单片机系统中,电源电路入侵是干扰入侵的主要途径,为增加系统的稳定性,采用抗干扰稳压电源。电源电路由变压器、整流桥、三端集成稳压电路和滤波电路组成。电源通过低通滤波器和隔离变压器接入电网,如图6所示。在市电与变压器间并联两个0.01μF电容构成低通滤波器,用以吸收市电中的“毛刺”。经变压后得到8V-12V的交流电,并通过桥式整流得到直流电压。然后,由并联100μF的电解电容和0.33μF的瓷片电容构成的滤波器进行滤波,最后使用MC7805将12V左右的电压转变为精确+5V输出。为了进一步降低干扰,在单片系统的VCC处并联电容滤波网络[1,7]。图6电源电路图4.2输入键盘电路设计本设计采用4×4矩阵式键盘,与独立式键盘相比,这种键盘可节省很多I/O口线。矩阵式键盘由行线和列线组成,按键位于行列的交点上。矩阵式键盘的按键识别方式有两种:一是行扫描法,二是线反转法。行扫描法中,首先由行线发出低电平信号,此时,若有按键按下,则相应列线为“0”;无按键按下,则相应列线为“1”。逐行扫描完毕后,若只有一个键按下,则读入键值;若多键按下则按键无效。线反转法中,首先由单片机向列线输出全“0”,读入行线值后,若某行有键按下,则该行线值为“0”。然后再将读取的行线值经行线输出,同时将所有列线置“1”。随后,读取列线值,有键按下的列线值为“0”。这样通过行列交叉定位,可识别出按键的位置。因此线反转法的识别速度比行扫描快很多,本设计采用线反转识别方法。键盘电路如图7所示,按键设置在行列线交点上,行、列线分别接到按键开关两端。其中,行、列线通过上拉电阻接到+5V上,并连接到单片机的P3口[1,8]。图7输入键盘电路图4.3复位电路设计单片机的复位电路如图8所示。在通电瞬间,RC电路充电,RESET端出现正脉冲,从而使单片机复位。在系统的运行过程中,只要按下开关,RESET就能得到高电位,复位有效[1,9,10]。复位脉冲要持续10ms以上,才能保证有效复位。4.4时钟电路设计在单片机的XTAL1引脚和XTAL2引脚之间接12M石英晶体振荡器和30PF的电容,组成并联谐振回路,如图9所示[1,9]。图8单片机复位电路图图9时钟电路4.5信息存储电路设计存储器芯片AT24C02的A0、A1、A2是三条地址线,用于确定芯片的硬件地址。本设计只用到了一片AT24C02,因此A0、A1、A2均接至高电平。WP、SCL、SDA分别接单片机的P1.0、P1.1、P1.2,通过P1.0、P1.1、P1.2来模拟实现I2C的功能[3,11]。图10程序储存电路图4.6数码管显示电路设计数码管显示电路如图11所示。由单片机P2.0、P2.1、P2.2依次输出000B~111B,经74HC138译码后得到位选通信号,顺次选通8个数码管。然后,单片机的P0口的输出数据显示在被选通的数码管上[12]。图11数码管显示电路4.7报警电路设计报警电路如图12所示,由蜂鸣器和外围电路组成。密码输入正确时,蜂鸣器不发声,直接开锁,指示灯亮;密码输入错误时,蜂鸣器发声报警,指示灯熄灭。图12报警电路4.8开锁电路设计开锁电路的功能是将单片机内部信号转化成开锁信号。由于本设计采用集成控制,由一个单片机来控制16个箱体的门锁,因此采用译码器来扩展控制数目。开锁电路如图13所示,使用2片74HC138组合成4线-16线的译码系统,其中P1.5是连接防止误开锁的选通信号。图13开锁电路5密码柜控制器软件设计5.1软件工作流程密码柜控制器的工作流程如图14所示,软件设计主要完成密码比对、密码修改、错误报警、存储器读写、键盘输入、开锁和显示等功能。其中显示功能利用单片机的内部时钟中断完成,中断间隔为10ms。其它功能均通过调用相应子程序实现。主程序流程图如图15,程序代码见附录2。图14软件工作流程图图15主程序流程图5.2键盘输入子程序键盘设计采用了4×4矩阵键盘,采用反线法扫描键盘,得到键盘按键的返回值后,再通过比对来辨别按键的具体功能。键盘输入子程序流程图如图16,程序代码见附录2。5.3密码比对子程序密码比对子程序对键盘输入的密码和密码存储器中的密码进行比对,并根据结果修改相关的标志位,返回给主程序。密码比对子程序流程图如图17,程序代码见附录2。图16键盘输入子程序流程图图17密码比对子程序流程图5.4密码修改子程序密码修改子程序是通过修改密码存储器中的内容,实现密码修改功能。密码修改子程序流程图如图18,程序代码见附录2。5.5密码错误报警子程序密码错误报警子程序的功能是:当错误次数不超过三次时,提示错误,并转入密码输入程序,输入新密码;当输入错误次数达到三次时,进行报警并锁定键盘3分钟。密码错误报警子程序流程图如图19,程序代码见附录2。5.6开锁子程序开锁子程序实现开锁功能,当输入密码正确并按下开锁时,通过P2.4~P2.7口和P1.5的输出开锁信号,控制箱柜的门开启或锁闭。开锁子程序流程图如图20,程序代码见附录2。5.7程序存储器读写子程序程序存储器读写子程序实现对密码存储器访问。当进行密码修改时,需进行写入操作;当进行密码比对时,需进行读出操作。写入程序和读出程序流程图如图21和图22所示,程序代码见附录2。图18密码修改流程图图19密码错误报警流程图图20开锁流程图5.8状态显示子程序状态显示子程序显示系统运行状态,采用内部时钟中断实现,即先通过程序将要显示的数据存入显示缓冲数组内,再通过中断将缓冲数组内的数据显示到数码管上。状态显示子程序流程图如图23,程序代码见附录2。图21写密码流程图图22读密码流程图图23显示流程图6软件编译与调试6.1KeilC51编译KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统。与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势。将程序代码添加到工程中,点击“编译”,通过错误提示修改程序的语法错误与逻辑错误,并再次编译。编译无错误提示后,点击“汇编”,生成16进制的可执行程序。结果如图23所示。6.2开发板调试在万用单片机实验开发板上,将程序通过USB在线下载器下载到单片机中,其下载过程如图24所示。在开发板中调试各程序模块,直到各模块运行正常。密码柜控制器部分功能运行过程如图25-28所示。图23KeilC51编译结果图24程序烧写过程图25等待输入密码图26密码错误报警图27比对正确图28开启01号箱7结束语本次设计以单片机AT89S51为核心,设计了一个密码柜控制器。该密码柜控制器具有电路结构简单、成本低等优点,能够完成密码比对、密码修改、错误报警等功能。测试结果表明,各程序模块运行正常。本次设计比较简单,还有一些不足之处。例如,密码存储器在读写过程中没有采取加密措施,密码有被破解的风险,今后将进一步解决此问题。参考文献178陈开文.基于AT89C51的安全密码锁应用设计[A].科技资讯,2021,9:2-3.管小明,雷伯录,曾凡锦,吴邦国.具有激活功能的实用型密码系统的设计[J].设计参考,202112):33-38.附录1电路原理图

附录2/*名称:基于AT89S51单片机的16箱密码柜学校:洛阳师范学院编写:李良日期:2021年5月指导老师:崔版本号:1.0内容:通过键盘输入密码来完成对16箱密码柜控制。*/#include<reg52.h>#include<intrins.h>#include<string.h>#defineuintunsignedint#defineucharunsignedchar#defineKEYP3//定义键盘接口#defineNo_key20//定义键盘无按键键值#defineAddWr0xae//定义写24c02地址#defineAddRd0xaf//定义读24c02地址sbitSda=P1^2;//定义I2C总线sbitScl=P1^1;sbitWP=P1^0;//定义写保护sbitlight=P1^3;//定义密码正确标示灯sbitlight1=P1^4;//定义错误报警接口sbitkm=P1^5;//定义开锁允许接口ucharj;//数据输入个数ucharaa;//记录键盘锁定时间ucharxh;//箱号uchardispcode[8]={0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40};//显示缓存uchardispbit[8]={0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7};//显示位选ucharcodetable[]={0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40};ucharcodetable1[]={0x73,0x40,0x40,0x40,0x40,0x40,0x40,0x40};ucharcodetable2[]={0x79,0x31,0x31,0x3F,0x31,0x00,0x00,0x00};ucharcodetable3[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};ucharcodeks[]={0x1F,0x2F,0x3F,0x4F,0x5F,0x6F,0x7F,0x8F,0x9F,0xAF,0xBF,0xCF,0xDF,0xEF,0xFF};ucharpassword[4];//密码缓存ucharsave[6];//输入数据缓存ucharconflag;//密码正确标志ucharlockflag;//锁定键盘标志ucharstartflag;//开始标志voidmDelay(ucharyy);//延时子程序voidinit();//初始化子程序voiddisplay_OK();//密码真确显示voiddisplay_enter();//等待输入密码显示voiddisplay_error();//密码错误显示voiddelete();//删除子函数voidChange();//更改密码子函数ucharkeyscan();//键盘扫描子函数ucharkeyscanxz(void);//键值选择子函数voidenter_code(uchart);//输入数据记录子函数voidkaisuo(ucharh);//开锁子函数voidconfirm();//密码比对子函数voidsucceed_an();//密码正确响应voidfail_an();//密码错误响应voidlockkey();//键盘锁定子函数voidalarm();//错误报警子函数voidreset();//数据复位子函数voidStart(void);//开启I2C总线voidStop(void);//关闭I2C总线voidAck(void);//应答voidNoAck(void);//非应答voidSend(unsignedcharData);//发送一个数据unsignedcharRead(void);//读取一个数据voidWrToROM(unsignedcharData[],unsignedcharAddress,unsignedcharNum);//写数据voidRdFromROM(unsignedcharData[],unsignedcharAddress,unsignedcharNum);//读数据/*********主程序***********/voidmain(void){uchartemp;init();//初始化while(1){if(lockflag){temp=keyscanxz();if(temp!=No_key)aa=0;}//锁定键盘是扫描键盘else{temp=keyscanxz();if(temp!=No_key){//判断键值赋予不同的功能if(temp==10){reset();//数据复位startflag=1;//置位开始标志di}if(startflag){enter_code(temp);if(temp==13){confirm();//调用密码比对if(conflag){succeed_an();//调用密码正确响应reset(); memcpy(dispcode,table,sizeof(dispcode));//将要显示数据存入显示缓存数组 }else{fail_an();//密码错误响应 reset();}}if(temp==14)delete();//调用删除子函数,进行数据修改}}}}}/******初始化***********/voidinit(void){//初始化设置内部计时器T0,T1TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TH1=0xB1;TL1=0xE0;ET0=1;TR0=1;ET1=1;TR1=1;EA=1;}/******对各种变量进行复位********/voidreset(){ucharnum;for(num=0;num<8;num++){dispcode[num]=0;//复位显示缓存数组save[num]=0;}//复位显示缓存数组lockflag=0;//复位锁键盘标志conflag=0;//复位密码正确标志j=0;//复位数据个数记录display_enter();}/******显示子程序********/voiddisplay_enter(){dispcode[7]=0x80;}voiddisplay_OK(){memcpy(dispcode,table1,sizeof(dispcode));}voiddisplay_error(){memcpy(dispcode,table2,sizeof(dispcode));}voidTimer1Interrupt(void)interrupt3{ucharii,jj;TH1=0xB1;TL1=0xE0;km=1;//关闭开锁允许for(ii=0;ii<8;ii++){P2=dispbit[ii];//将位选通过p2输出jj=70;P0=dispcode[ii];//将数据通过p0输出while(jj--);}}/****输入密码正确进行响应子程序****/voidsucceed_an(){uchartemp,xmflag,bb[1];light=0;display_OK();xmflag=1;while(xmflag){temp=keyscanxz();if(temp!=No_key){if(temp==12)//开锁选择{light=0;kaisuo(xh); xmflag=0;}if(temp==15)//密码修改选择{light=1;Change(); xmflag=0;}}}bb[0]=0;WrToROM(bb,70,1);//清除密码错误记录}/*****开锁子程序***********/voidkaisuo(ucharh){ucharm=250,mm=250;dispcode[0]=table3[save[0]];//显示开锁箱号dispcode[1]=table3[save[1]];{while(mm--){while(m--){km=0;P2=ks[h];//通过p2口输出开锁数据}}}km=1;light=1;}/******修改密码子程序********/voidChange(){uchark,xmflag;uchartemp;loop:reset();xmflag=1;while(xmflag){temp=keyscanxz();if(temp!=No_key){enter_code(temp);if(temp==14)delete();if(temp==13)xmflag=0;}}memcpy(password,save,sizeof(password));//将第一次输入的密码出入密码缓存数组if(j>4)gotoloop;{loop1:reset();xmflag=1;while(xmflag){temp=keyscanxz();if(temp!=No_key){enter_code(temp);if(temp==14)delete(); if(temp==13)xmflag=0;}if(j>4)gotoloop1;else{for(k=0;k<4;k++)//比对前后两次的密码是否一致{if(password[k]!=save[k])break;}if(k==4){WP=0;//打开写保护WrToROM(password,xh*4,6);//密码一致间密码存入密码存储器 WP=1;//关闭写保护} }}}}/*输入密码错误进行响应子程序****/voidfail_an(){ucharbb[1];RdFromROM(bb,70,1);//读取密码错误次数bb[0]=bb[0]+1;//密码错误次数加1WP=0;//打开写保护WrToROM(bb,70,1);//将错误的次数粗如24c02中display_error();mDelay(255);if(bb[0]>2)//错误三次进行报警{bb[0]=0;WrToROM(bb,70,1);WP=1;alarm();lockkey();}}voidalarm()//密码报警{uchars=50,ss=250,sss=20;while(sss--){while(ss--){while(s--);light1=~light1;}}light1=1;}/*********锁键盘子程序*****/voidlockkey()//锁键盘{lockflag=1;}voidtimer0()interrupt1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(lockflag){aa++;light1=0;if(aa>=60){aa=0;light1=1;lockflag=0;reset(); }}}/******对比密码子程序**********/voidconfirm(){uchark;xh=save[0]*10+save[1]-1;//计算箱号if(xh>16)gotocc;//输入箱号大于16退出比对RdFromROM(password,xh*4,4);//读取原始密码for(k=0;k<4;k++)//逐个比对密码{if(password[k]!=save[k+2])break;}if(k==4){conflag=1;}else{cc:conflag=0;}}/*************************名称:键盘扫描方法:通过线反转发扫描*****************************/ucharkeyscan(void){ucharcord_h,cord_l,cord_p;KEY=0x0f;cord_h=KEY&0x0f;if(cord_h!=0x0f){mDelay(125);//消抖延时if(cord_h!=0x0f){cord_h=KEY&0x0f;KEY=cord_h|0xf0;cord_l=KEY&0xf0;while(1) {KEY=cord_h|0xf0; cord_p=KEY&0xf0;if(cord_p==0xf0) {break;} }return(cord_h+cord_l);//返回键值编码}}return(0xff);}/********键值选择***********/ucharkeyscanxz(void){uchartemp,num;temp=keyscan();switch(temp){case0x7e:num=1;break;case0x7d:num=4;break;case0x7b:num=7;break;case0x77:num=10;break;case0xbe:num=2;break;case0xbd:num=5;break;case0xbb:num=8;break;case0xb7:num=0;break;case0xde:num=3;break;case0xdd:num=6;break;case0xdb:num=9;break;case0xd7:num=14;break;case0xee:num=15;break;case0xed:num=11;break;case0xeb:num=12;break;case0xe7:num=13;break;case0xff:num=20;break;}//计算键值returnnum;}/******输入密码并在屏幕上显示星号******/voidenter_code(uchart){if(t>=0&&t<10){dispcode[j]=0x7F;save[j++]=t;}}/******删除最后一个********/voiddelete(){save[--j]=0;dispcode[j]=0;}/***********延时程序***********/voidmDelay(unsignedcharyy){unsignedinti;for(;yy>0;yy--){ for(i=0;i<125;i++) {;} }}/******密码存储器读写子程序******/voidStart(void)//开启总线{Sda=1;_nop_();_nop_();Scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();Sda=0;_nop_();_nop_();_nop_();_nop_();_nop_();Scl=0;}voidStop(void)//关闭总线{Sda=0;_nop_();Scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();Sda=1;_nop_();_nop_();_nop_();_nop_();_nop_();Scl=0;}voidAck(void)//总线应答{Sda=0; _nop_();_nop_();_nop_(); Scl=1; _nop_();_nop_();_nop_();_nop_();_nop_(); Scl=0; _nop_();_nop_(); }voidNoAck(void)//总线非应答 { Sda=1; _nop_();_nop_();_nop_(); Scl=1; _nop_();_nop_();_nop_();_nop_();_nop_(); Scl=0; _nop_();_nop_(); }voidSend(unsignedcharData)//发送1位数据 { unsignedcharBitCounter=8; unsignedchartemp; do { temp=Data; Scl=0; _nop_();_nop_();_nop_();_nop_();_nop_(); if((temp&0x80)==0x80) Sda=1; else Sda=0;Scl=1; temp=Data<<1; Data=temp; BitCounter--; } while(BitCounter); Scl=0; }unsignedcharRead(void)//读取以为数据 { unsignedchartemp=0; unsignedchartemp1=0; unsignedcharBitCounter=8; Sda=1; do { Scl=0;_nop_();_nop_();_nop_();_nop_();_nop_(); Scl=1; _nop_();_nop_();_nop_();_nop_();_nop_(); if(Sda) temp=temp|0x01; else temp=temp&0xfe; if(BitCounter-1) { temp1=temp<<1; temp=temp1; } BitCounter--; } while(BitCounter); return(temp); }voidWrToROM(unsignedcharData[],unsignedcharAddress,unsignedcharNum)//写数据 { unsignedchari; unsignedchar*PData; PData=Data; for(i=0;i<Num;i++) { Start(); Send(AddWr); Ack(); Send(Address+i); Ack(); Send(*(PData+i)); Ack(); Stop(); mDelay(20); } }voidRdFromROM(unsignedcharData[],unsignedcharAddress,unsignedcharNum)//写数据{ unsignedchari; unsignedchar*PData; PData=Data;for(i=0;i<Num;i++) { Start(); Send(AddWr); Ack(); Send(Address+i); Ack(); Start(); Send(AddRd); Ack(); *(PData+i)=Read(); Scl=0; NoAck(); Stop(); }} Start(); Send(AddRd); Ack(); *(PData+i)=Read(); Scl=0; NoAck(); Stop(); }}

社会实践报告系别:班级:学号:姓名:作为祖国未来的事业的继承人,我们这些大学生应该及早树立自己的历史责任感,提高自己的社会适应能力。假期的社会实践就是很好的锻炼自己的机会。当下,挣钱早已不是打工的唯一目的,更多的人将其视为参加社会实践、提高自身能力的机会。许多学校也积极鼓励大学生多接触社会、了解社会,一方面可以把学到的理论知识应用到实践中去,提高各方面的能力;另一方面可以积累工作经验对日后的就业大有裨益。进行社会实践,最理想的就是找到与本专业对口单位进行实习,从而提高自己的实战水平,同时可以将课本知识在实践中得到运用,从而更好的指导自己今后的学习。但是作为一名尚未毕业的大学生,由于本身具备的专业知识还十分的有限,所以我选择了打散工作为第一次社会实践的方式。目的在于熟悉社会。就职业本身而言,并无高低贵贱之分,存在即为合理。通过短短几天的打工经历可以让长期处于校园的我们对社会有一种更直观的认识。实践过程:自从走进了大学,就业问题就似乎总是围绕在我们的身边,成了说不完的话题。在现今社会,招聘会上的大字报都总写着“有经验者优先”,可还在校园里面的我们这班学子社会经验又会拥有多少呢?为了拓展自身的知识面,扩大与社会的接触面,增加个人在社会竞争中的经验,锻炼和提高自己的能力,以便在以后毕业后能真正真正走入社会,能够适应国内外的经济形势的变化,并且能够在生活和工作中很好地处理各方面的问题,我开始了我这个假期的社会实践-走进天源休闲餐厅。实践,就是把我们在学校所学的理论知识,运用到客观实际中去,使自己所学的理论知识有用武之地。只学不实践,那么所学的就等于零。理论应该与实践相结合。另一方面,实践可为以后找工作打基础。通过这段时间的实习,学到一些在学校里学不到的东西。因为环境的不同,接触的人与事不同,从中所学的东西自然就不一样了。要学会从实践中学习,从学习中实践。而且在中国的经济飞速发展,又加入了世贸,国内外经济日趋变化,每天都不断有新的东西涌现,在拥有了越来越多的机会的同时,也有了更多的挑战,前天才刚学到的知识可能在今天就已经被淘汰掉了,中国的经济越和外面接轨,对于人才的要求就会越来越高,我们不只要学好学校里所学到的知识,还要不断从生活中,实践中学其他知识,不断地从各方面武装自已,才能在竞争中突出自已,表现自已。在餐厅里,别人一眼就能把我人出是一名正在读书的学生,我问他们为什么,他们总说从我的脸上就能看出来,也许没有经历过社会的人都有我这种不知名遭遇吧!我并没有因为我在他们面前没有经验而退后,我相信我也能做的像他们一样好.我的工作是在那做传菜生,每天9点钟-下午2点再从下午的4点-晚上8:30分上班,虽然时间长了点但,热情而年轻的我并没有丝毫的感到过累,我觉得这是一种激励,明白了人生,感悟了生活,接触了社会,了解了未来.在餐厅里虽然我是以传菜为主,但我不时还要做一些工作以外的事情,有时要做一些清洁的工作,在学校里也许有老师

温馨提示

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

评论

0/150

提交评论