找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 917|回复: 0
打印 上一主题 下一主题
收起左侧

单片机电梯模拟程序 并联控制步进电机Proteus仿真图

[复制链接]
跳转到指定楼层
楼主
MCU并联控制步进电机(电梯模拟)stc89c51单片机主控
电机转1圈为1楼层,电机运行:... 电机到站:up!  new1:第一个电机对于的楼层 new2:第二个电机对于的楼层
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include "main.h"
  2. #include "Motor.h"
  3. #include "stdio.h"
  4. uint Key_Scan(void);
  5. uint res=0;
  6. void Motor_Muen(void)//菜单界面
  7. {
  8.         LCD_Init();
  9.         LCD_ShowString(1,1,"new1:01");
  10.         LCD_ShowString(1,10,"new2:01");
  11.         LCD_ShowString(2,6,"00");
  12.         LCD_ShowString(2,10,"00");
  13.         LCD_ShowString(2,1,"up!");
  14.         LCD_ShowString(2,14,"up!");
  15. }

  16. //定时器初始化函数
  17. void Timer0Init(void)                //1毫秒@22.1184MHz
  18. {
  19.         TMOD = 0x01;                //设置定时器模式
  20.         TL0 = 0xCD;                //设置定时初始值
  21.         TH0 = 0xF8;                //设置定时初始值
  22.         TF0 = 0;                //清除TF0标志
  23.         ET0=1;
  24. //        TR0 = 1;                //定时器0开始计时
  25.         EA=1;
  26. }

  27. int main(void)        //主函数
  28. {
  29.         uint keynum=0, //按键值
  30.                  enter=0,  //确认
  31.                  Key_timer=0; //按键计时
  32.         buzz1=0;buzz2=0;
  33.         Motor_Muen();
  34.         Timer0Init();
  35.         while(1)
  36.         {
  37.                 LCD_ShowString(2,1,"up!");  
  38.                 LCD_ShowString(2,14,"up!");
  39.                 LCD_ShowNum(2,6,MotorKZ.Motor1_floor,2); //显示选择楼层
  40.                 LCD_ShowNum(2,10,MotorKZ.Motor2_floor,2);//显示选择楼层
  41.                 keynum=Key_Scan();
  42.                 switch(keynum)//按键标志位
  43.                 {
  44.                         case 1:MotorKZ.Motor1_floor++; //楼层加一
  45.                                 break;
  46.                         case 2:MotorKZ.Motor1_floor--;//楼层减一
  47.                                 break;
  48.                         case 3:enter=1;
  49.                                 break;
  50.                         case 4:buzz1=~buzz1;
  51.                                 break;
  52.                         case 5:MotorKZ.Motor2_floor++;//楼层加一
  53.                                 break;
  54.                         case 6:MotorKZ.Motor2_floor--;//楼层减一
  55.                                 break;
  56.                         case 7:enter=2;
  57.                                 break;
  58.                         case 8:buzz2=~buzz2;
  59.                                 break;
  60.                 }
  61.                 if(MotorKZ.Motor2_floor<0||MotorKZ.Motor1_floor<0){
  62.                         MotorKZ.Motor1_floor=0;MotorKZ.Motor2_floor=0;
  63.                 }
  64.                 if(enter==1)//电梯运行
  65.                 {
  66.                         enter=0;
  67.                         Motor1_circle();
  68.                         buzz1=1;Delay(200);buzz1=0;
  69.                 }else if(enter==2)//电梯运行
  70.                 {
  71.                         enter=0;
  72.                         Motor2_circle();
  73.                         buzz2=1;Delay(200);buzz2=0;
  74.                 }else if(enter==0);
  75.                
  76.                 if(keynum==0)
  77.                 {
  78.                         if(Key_timer++>100)//按键时间记录
  79.                         {Key_timer=0;
  80.                                 TR0=1;
  81.                         }
  82.                 }else TR0=0;
  83.                 if(res==0x0f)
  84.                 {res=0;
  85.                         while(MotorKZ.Motor1_new--)//回到初始化楼层
  86.                         {
  87.                                 if(MotorKZ.Motor1_new<2)break;
  88.                                 Motor_REV(1);
  89.                                 LCD_ShowNum(1,6,MotorKZ.Motor1_new,2);
  90.                         }
  91.                         while(MotorKZ.Motor2_new--)//回到初始化楼层
  92.                         {
  93.                                 if(MotorKZ.Motor2_new<2)break;
  94.                                 Motor_REV(0);
  95.                                 LCD_ShowNum(1,15,MotorKZ.Motor2_new,2);
  96.                         }
  97. //                        MotorKZ.Motor2_new=1;  //初始化楼层
  98. //                        MotorKZ.Motor1_new=1;  //初始化楼层
  99.                         LCD_ShowNum(1,6,MotorKZ.Motor1_new,2);
  100.                         LCD_ShowNum(1,15,MotorKZ.Motor2_new,2);
  101.                 }
  102.         }
  103. }

  104. void Timer0(void) interrupt 1
  105. {
  106.         static uint t=0,time=0,min=0;
  107.         
  108.         TL0 = 0xCD;                //设置定时初始值
  109.         TH0 = 0xF8;                //设置定时初始值
  110.         if(t++==599)//毫秒
  111.         {
  112.                 t=0;
  113.                 if(time++==59) //秒
  114.                 {
  115.                         time=0;
  116.                         if(min==999)//分
  117.                         {
  118.                                 min=0;
  119.                         }
  120.                 }
  121.         }
  122.         if(time==10)//设置超时时间time是秒,min是分钟这里设置的是30秒
  123.         {
  124.                 time=0;
  125.                 TR0=0;res=0x0f;
  126.                
  127.         }
  128. }

  129. uint Key_Scan(void)//按键扫描
  130. {
  131.         static uint keyflg=0;
  132.         if((P3&0XFF)!=0XFF)
  133.         {
  134.                 Delay(1);
  135.                 if((P3&0XFF)!=0XFF&&keyflg==0)
  136.                 {
  137.                         keyflg=1;
  138.                         switch(P3&0XFF)
  139.                         {
  140.                                 case 0xfe:return 1;//按键1
  141.                                 case 0xfd:return 2;//按键2
  142.                                 case 0xfb:return 3;//按键3
  143.                                 case 0xf7:return 4;//按键4
  144.                                 case 0xef:return 5;//按键5
  145.                                 case 0xdf:return 6;//按键6
  146.                                 case 0xbf:return 7;//按键7
  147.                                 case 0x7f:return 8;//按键8
  148.                         }
  149.                 }
  150.         }else keyflg=0;
  151.         return 0;
  152. }
复制代码

Keil代码与Proteus8.13仿真下载:
并联控制步进电机(电梯模拟).zip (318.2 KB, 下载次数: 47)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表