欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    基于STC89C51单片机的模拟电梯设计精品资料.docx

    • 资源ID:96697083       资源大小:134.61KB        全文页数:31页
    • 资源格式: DOCX        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基于STC89C51单片机的模拟电梯设计精品资料.docx

    目录一、 设计任务11.1 设计内容与要求1二、设计系统主要功能的说明22.1 设计设备的选择22.2 设计原理2三、硬件电路设计33.1电源部分33.2按键部分43.3 数码管显示原理53.4电机驱动原理53.5单片机最小系统6四、软件设计流程74.1 延时程序控制74.1.1 循环延时服务控制84.1.2 编码按键扫描控制84.2 软件的实现84.2.1主程序的实现84.2.2子函数服务程序的实现94.2.3 键盘扫描的实现方法9五、软、硬件的调试115.1 调试方案的确定115.2 调试过程11六、设计心得11参考文献13附录A 模拟电梯的程序15摘要: 本设计是使用宏晶公司的STC89C51RC加外围器件作控制单元,用数码管显示,制作的经济实惠的电梯模拟系统。其原理图可分为按键部分、显示部分、电机部分、最小系统部分。两个按键(一个电梯内,一个电梯外)对应一个楼层,另有开门、关门两个按键。芯片一旦检测到某楼层的按键被按下,就会在对应端口输出5V高电平驱动电机来到该楼层,程单序会延迟几分钟,等人进入电梯后,关门,去到要去的楼层。在整个过程中,数码管会显示楼层数。最小系统为单片机提供时钟信号和复位功能。 关键词:STC89C51 单片机 模拟电梯 四位一体数码管一、 设计任务(选题) 随着科技的发展,单片机因强大的功能、低廉的价格,越来越被广泛使用,成为很多电子产品中不可缺少的部分。同时因为单片机是模拟电子与数字电子的结合品,它的应用对于我们电子专业来说是一门必要掌握的课程。 电梯对人们来说已经是必不可少了乘载工具,所以将单片机应用于实际的生活中,才达到学以致用、举一反三的境界。二、 方案设计1.处理部分:现在的单片机越来越注重功耗和处理数据快慢的问题,目前最低功耗最有发展潜力的单片机是美国TI公司的MSP430系列。不过这里为了学以致用和节约成本,同时电梯的处理数据就不需要那么高的速度,所以选用8位的STC89C51单片机。2.显示部分:本来可以用15*18的点阵,可是考虑到成本和接电路布线的繁琐,更糟糕的是那耗电大而不是实际的电路就没必要。所以直接用四位的数码管显示就好了。3.控制部分:本来可以用4*4的键盘,现在只用了四位数码管代表三层楼,所以只用3个按键代表梯内3层楼,3个按键代表梯外3层楼,加上“关门”和“开门(延时)键各一个,总共8个键组成编码式按键就行了。功能:三、 硬件部分1.原理框图2.原理图细分电源部分:用变压器把交流电220V转为交流电9V(不能小于或者等于交流电5伏,因为三端稳压管7805的输入端输出端电波压差为2.5V),交流9V经过整流桥D1后得到平均值为8.1V单方向全波脉动电压,其中停含有较大的汶波,为了得到平滑的电压,在其后面加滤波电容滤除交流成分。涤纶电容104可用来抵消输入端的电感效应,还可以消除电源的高频干扰。一般取值是0.1-1uF。波动较大8.1V电压经7805的1脚输入,输出端输出稳定的5V,最后还要用电解电容10uF和涤纶电容104再次滤波,使电压更稳定,以供单片机和其他元器件需要。按键部分:8个按键分别是电梯外三个键代表想电梯来到的每一层楼,电梯内三个键代表想要去的三层楼,一个关门键和一个开门键。它们一边直接接地,另一边直接接STC的P1和P3口,这样就可以用高低电平去判断,然后执行对应键的操作函数。显示部分:用一个四位的共阳数码管,再用四个9015(PNP)三极管去控制显示。这样就不会占用四个I/O而浪费资源。当然数码管还要加上100的限流电阻。再备用一个LED灯。电机部分:用P20和P21输出高低之间去驱动8550组成的对称电路,从而控制电机的正转和反转。晶振部分:用12M和30pF的涤纶电容使单片机STC89C51起振,从而为单片机STC89C51提供频率信号。最小系统:用一个按键、200和利用电容(电解电容22uF)充放电原理去使STC89C51重新上电复位。四、 软件部分1. 程序流程图五、 调试和验证首先布局好电路的摆布,如何让人一目了然,如何好看。跟着把电路焊接完毕。 先不要急着把单片机插上去整个系统调试,而是先测试电源部分5V正常与否。当我测试到5V波动很大或者直接没有时,发现三端稳压管7805之后的那个涤纶电容104已经击穿了,换了一个之后电源稳定正常了。 然后在仿真软件Proteus上对照自己设计的电路画了个电路图,因为上面没有9015三极管只有通用的PNP三极管只好用这个来替补。当我在Keil C51上随便编了一个显示5678的函数把它灌入仿真软件上调试时,发现数码管四位都是显示8。然后我再倒头看看程序是否错误,感觉真的没错啊。又用另外的方式编写了显示1234的程序,它还是一样显示4444。我就在Keil 上一步一步地调试程序,真的感觉没有错,当时一时懵了。最后我就做了决定,直接把把程序烧进上,插上到电路板上,那显示竟然与自己编写的完全一致喔。那时一片黑云散了,心情很好。 后来觉得调试不方便,不可能每次都要把程序烧进单片机上在电路板上调试。我就仿真软件上把那个通用三极管换成反相放大器,这样调试就好了。六、心得每一次努力都总会有或多或少的收获,所以当我们做每一件事时都要全力以赴,否则就不要去做。这对我们以后工作乃至生活形成一个良好的习惯和心态。结论谢辞在、 首先感谢各位老师三年来的教导。俗话说入靠师傅,修行在个人。刚接触这个专业时,还不清楚学什么,能学到什么,而现在虽说七、参考文献 谭浩强编著.C语言程序设计胡宴如、耿苏燕编著.模拟电子技术 刘守义、杨宏丽、王静霞编著.单片机应用技术 郑鹏思、林远长、董前程、矫津毅编著.Protel99 SE附录A模拟电梯程序#include<reg51.h>sbit key3=P11;sbit key2=P10;sbit key1=P12;sbit key4=P13;sbit key5=P14;sbit key6=P37;sbit key7=P36; /关门升降sbit key8=P35; /开门延时键sbit P24=P24;sbit P25=P25;sbit P26=P26;sbit P27=P27;sbit zhengzhuan=P20; /电动机正转sbit fanzhuan=P21; /电动机反转unsigned int i,j;unsigned char sanlou=0;unsigned charerlou=0;bit biaozhi=0;unsigned charyilou=0;unsigned char qusanlou=0;unsigned char querlou=0;unsigned char quyilou=0; unsigned char code tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/-延时1ms函数-void delay(unsigned int t) for(i=0;i<t;i+) for(j=0;j<121;j+) ; /-外按三楼函数-void display3(void) if(qusanlou=1) for(i=0;i<500;i+) for(j=0;j<121;j+) ; if(P26=0)/如果现在在一楼则显示从一楼到三楼函数 P2=0xb0; P0=tab1; for(i=0;i<500;i+) for(j=0;j<121;j+) if(key2=0) /判读外二楼有没有人按下 delay(10); while(key2=0); erlou=1; if(key8=0&&qusanlou=1);/同时要是之前的内三楼键按下才有效 delay(10); while(key8=0); delay(1000); /如果再次开门就延时1s if(key7=0) delay(10); while(key7=0); i=200;/把i变成200跳出延时函数 zhengzhuan=1; fanzhuan=0; /电机正转 delay(1000); delay(1000); delay(1000); delay(1000);/上一层楼的时间 P2=0xd0; P0=tab2; for(i=0;i<500;i+) for(j=0;j<121;j+) if(key8=0&&qusanlou=1); /同时要是内三楼键按下才有效 delay(10); while(key8=0); delay(1000); /如果再次开门就延时1s if(key7=0) delay(10); while(key7=0); i=200;/把i变成200跳出延时函数 if(erlou=1) delay(1000); /在二楼停留多1s当模拟有人进出 zhengzhuan=0; fanzhuan=0; /电机停止 zhengzhuan=1; fanzhuan=0; /电机正转 delay(1000); delay(1000); delay(1000); delay(1000);/上一层楼的时间 P2=0xe0; P0=tab3; for(i=0;i<500;i+) for(j=0;j<121;j+) if(key8=0&&qusanlou=1); /同时要是内三楼键按下才有效 delay(10); while(key8=0); delay(1000); /如果再次开门就延时1s if(key7=0) delay(10); while(key7=0); i=200;/把i变成200跳出延时函数 if(P25=0) P2=0xd0; P0=tab2; zhengzhuan=1; fanzhuan=0; /电机正转 delay(1000); delay(1000); delay(1000); delay(1000); P2=0xe0; P0=tab3; if(P24=0)/如果现在还是显示3楼 P2=0xe0; P0=tab3; sanlou=0; erlou=0; qusanlou=0; zhengzhuan=0; fanzhuan=0; /电机停止/-外按二楼函数,不过最后还是到先三楼去-void display2(void) if(querlou=1) for(i=0;i<500;i+) for(j=0;j<121;j+) ; if(P26=0) /如果现在在一楼则显示从一楼到二楼再到三楼函数 P2=0xb0; P0=tab1; for(i=0;i<500;i+) for(j=0;j<121;j+) if(key8=0&&querlou=1); /同时要是内二楼键按下才有效 delay(10); while(key8=0); delay(1000); /如果再次开门就延时1s if(key7=0) delay(10); while(key7=0); i=200;/把i变成200跳出延时函数 zhengzhuan=1; fanzhuan=0; /电机正转 delay(1000); delay(1000); delay(1000); delay(1000); /上一层楼的时间 P2=0xd0; P0=tab2; for(i=0;i<500;i+) for(j=0;j<121;j+) if(key8=0&&querlou=1); /同时要是内二楼键按下才有效 delay(10); while(key8=0); zhengzhuan=0; fanzhuan=0; /电机停止 delay(1000); /如果再次开门就延时1s if(key7=0) delay(10); while(key7=0); i=200;/把i变成200跳出延时函数 zhengzhuan=0; fanzhuan=0; /电机停止 delay(1000); delay(1000); delay(1000);/在二楼停留多1s当模拟有人进出 zhengzhuan=1; fanzhuan=0; /电机正转 delay(1000); delay(1000); delay(1000); delay(1000);/上一层楼的时间 P2=0xe0; P0=tab3; for(i=0;i<500;i+) for(j=0;j<121;j+) if(key8=0&&querlou=1); /同时要是内二楼键按下才有效 delay(10); while(key8=0); delay(1000); /如果再次开门就延时1s if(key7=0) delay(10); while(key7=0); i=200;/把i变成200跳出延时函数 erlou=0; biaozhi=biaozhi;/为了不让在显示完上升函数时再去显示下降函数 /- / 如果现在是在三楼的话 /- if(P24=0&&biaozhi=0) /如果现在在三楼的话则从三楼到二楼再到一楼 P2=0xe0; P0=tab3; for(i=0;i<200;i+) for(j=0;j<121;j+) if(key8=0&&querlou=1); /同时要是内二楼键按下才有效 delay(10); while(key8=0); delay(1000); /如果再次开门就延时1s if(key7=0) delay(10); while(key7=0); i=200;/把i变成200跳出延时函数 zhengzhuan=0; fanzhuan=1; /电机反转 delay(1000); delay(1000); delay(1000); delay(1000);/上一层楼的时间 P2=0xd0; P0=tab2; for(i=0;i<200;i+) for(j=0;j<121;j+) if(key8=0&&querlou=1); /同时要是内二楼键按下才有效 delay(10); while(key8=0); zhengzhuan=0; fanzhuan=0; /电机停止 delay(1000); /如果再次开门就延时1s if(key7=0) delay(10); while(key7=0); i=200;/把i变成200跳出延时函数 zhengzhuan=0; fanzhuan=0; /电机停止 delay(1000); /在二楼停留多2S当模拟有人进出 zhengzhuan=0; fanzhuan=1; /电机反转 delay(1000); delay(1000); delay(1000); delay(1000);/上一层楼的时间 P2=0xb0; P0=tab1; for(i=0;i<200;i+) for(j=0;j<121;j+) if(key8=0&&querlou=1); /同时要是内二楼键按下才有效 delay(10); while(key8=0); delay(1000); /如果再次开门就延时1s if(key7=0) delay(10); while(key7=0); i=200;/把i变成200跳出延时函数 erlou=0; biaozhi=0; querlou=0; zhengzhuan=0; fanzhuan=0; /电机停止/-外按一楼函数-void display1(void) if(quyilou=1) for(i=0;i<500;i+) for(j=0;j<121;j+) ; if(P24=0) /如果现在在三楼则显示从三楼到一楼函数 P2=0xe0; P0=tab3; for(i=0;i<200;i+) for(j=0;j<121;j+) if(key2=0)/判读外二楼有没有人按下 delay(10); while(key2=0); erlou=1; if(key8=0&&quyilou=1); /同时要是内一楼键按下才有效 delay(10); while(key8=0); delay(1000); /如果再次开门就延时1s if(key7=0) delay(10); while(key7=0); i=200;/把i变成200跳出延时函数 zhengzhuan=0; fanzhuan=1; /电机反转 delay(1000); delay(1000); delay(1000); delay(1000);/上一层楼的时间 P2=0xd0; P0=tab2; for(i=0;i<200;i+) for(j=0;j<121;j+) if(key8=0&&quyilou=1); /同时要是内一楼键按下才有效 delay(10); while(key8=0); zhengzhuan=0; fanzhuan=0; /电机停止 delay(2000); /如果再次开门就延时2s if(key7=0) delay(10); while(key7=0); i=200;/把i变成200跳出延时函数 if(erlou=1) zhengzhuan=0; fanzhuan=0; /电机停止 delay(1000); /在二楼停留多1s当模拟有人进出 zhengzhuan=0; fanzhuan=1; /电机反转 delay(1000); delay(1000); delay(1000); delay(1000);/上一层楼的时间 P2=0xb0; P0=tab1; for(i=0;i<200;i+) for(j=0;j<121;j+) if(key8=0&&quyilou=1); /同时要是内一楼键按下才有效 delay(10); while(key8=0); delay(2000); /如果再次开门就延时2s if(key7=0) delay(10); while(key7=0); i=200;/把i变成200跳出延时函数 yilou=0; erlou=0; if(P25=0) P2=0xd0; P0=tab2; zhengzhuan=0; fanzhuan=1; /电机反转 delay(1000); delay(1000); delay(1000); delay(1000); P2=0xb0; P0=tab1; yilou=0; if(P26=0)/如果现在还是显示3楼 P2=0xb0; P0=tab1; yilou=0; quyilou=0; zhengzhuan=0; fanzhuan=0; /电机停止/-void main (void) P2=0xb0; P0=tab1; /一开始显示一楼 while(1) if(key3=0) /判断外三楼键 delay(10); while(key3=0); sanlou=1; qusanlou=0; if(sanlou=1) display3(); /显示外三楼的函数 /- if(key2=0) /判读外二楼键 delay(10); while(key2=0); erlou=1; querlou=0; if(erlou=1) display2(); /显示外二楼的函数 /- if(key1=0) /判读外一楼键 delay(10); while(key1=0); yilou=1; quyilou=0; if(yilou=1) display1(); /显示外一楼的函数 /- / 电梯内键 /- if(key4=0)/判断内去三楼键 delay(10); while(key4=0); sanlou=1; qusanlou=1; if(key5=0)/判断内去二楼键 delay(10); while(key5=0); erlou=1; querlou=1; if(key6=0)/判断内去一楼键 delay(10); while(key6=0); yilou=1; quyilou=1; 附录资料:不需要的可以自行删除Abstract: Based on the comprehensive analysis on the plastic parts structure service requirement, mounding quality and mould menu factoring cost. A corresponding injection mould of internal side core pulling was designed. By adopting the multi-direction and multi-combination core-pulling. A corresponding injection mould of internal side core pulling was designed, the working process of the mould was introducedC语言详解 - 枚举类型注:以下全部代码的执行环境为VC+ 6.0在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是:#define MON 1#define TUE 2#define WED 3#define THU 4#define FRI 5#define SAT 6#define SUN 7在此,我们定义一种新的数据类型,希望它能完成同样的工作。这种新的数据类型叫枚举型。1. 定义一种新的数据类型 - 枚举型 以下代码定义了这种新的数据类型 - 枚举型enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN;(1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。(2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。(3) 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。(4) 可以人为设定枚举成员的值,从而自定义某个范围内的整数。(5) 枚举型是预处理指令#define的替代。(6) 类型定义以分号;结束。2. 使用枚举类型对变量进行声明新的数据类型定义完成后,它就可以使用了。我们已经见过最基本的数据类型,如:整型int, 单精度浮点型float, 双精度浮点型double, 字符型char, 短整型short等等。用这些基本数据类型声明变量通常是这样:char a; /变量a的类型均为字符型charchar letter;int x, y, z; /变量x,y和z的类型均为整型intint number;double m, n;double result; /变量result的类型为双精度浮点型double既然枚举也是一种数据类型,那么它和基本数据类型一样也可以对变量进行声明。方法一:枚举类型的定义和变量的声明分开enum DAY MON=1, TUE, WED, THU, FRI, SAT, SUN;enum DAY yesterday;enum DAY today;enum DAY tomorrow; /变量tomorrow的类型为枚举型enum DAYenum DAY good_day, bad_day; /变量good_day和bad_day的类型均为枚举型enum DAY方法二:类型定义与变量声明同时进行:enum /跟第一个定义不同的是,此处的标号DAY省略,这是允许的。 saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday workday; /变量workday的类型为枚举型enum DAYenum week Mon=1, Tue, Wed, Thu, Fri Sat, Sun days; /变量days的类型为枚举型enum weekenum BOOLEAN false, true end_flag, match_flag; /定义枚举类型并声明了两个枚举型变量方法三:用typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明:typedef enum workday saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday workday; /此处的workday为枚举型enum workday的别名workday today, tomorrow; /变量today和tomorrow的类型为枚举型workday,也即enum workdayenum workday中的workday可以省略:typedef enum saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday workday; /此处的workday为枚举型enum workday的别名workday today, tomorrow; /变量today和tomorrow的类型为枚举型workday,也即enum workday也可以用这种方式:typedef enum workday saturday, sunday = 0, monday, tuesday, wednesday, thursday, friday;workday today, tomorrow; /变量today和tomorrow的类型为枚举型workday,也即enu

    注意事项

    本文(基于STC89C51单片机的模拟电梯设计精品资料.docx)为本站会员(封****n)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开