找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1857|回复: 0
收起左侧

电梯模拟单片机源程序

[复制链接]
ID:212004 发表于 2017-6-17 00:34 | 显示全部楼层 |阅读模式
电梯单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar code Table_of_Digits[]=
  6. {0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00,  //0  
  7. 0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00,  //1  
  8. 0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00,  //2  
  9. 0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00,  //3  
  10. 0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00,  //4  
  11. 0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00,  //5
  12. 0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00,  //6  
  13. 0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00,  //7  
  14. 0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00,  //8
  15. };
  16. uchar i=0,t=0,j=0,a=0;                    //i扫t延
  17. char offset=0;
  18. static int Current_floor=0,Pressed_key_up=0,Pressed_key_down=0,b=0,c=0,max=0,min=0;  //Current_floor当前楼层Pressed_key_up(down)上(下)升要求
  19. int flag;
  20. int floor_up[8]={9,9,9,9,9,9,9,9};  
  21. int floor_down[8]={0,0,0,0,0,0,0,0};  //上下降请求存放数组
  22. sbit KEY1=P1^0;       //定义P1口按键
  23. sbit KEY2=P1^1;
  24. sbit KEY3=P1^2;
  25. sbit KEY4=P1^3;
  26. sbit KEY5=P1^4;
  27. sbit KEY6=P1^5;
  28. sbit KEY7=P1^6;
  29. sbit KEY8=P1^7;
  30. sbit LED=P3^7;       //定义LED跟蜂鸣器
  31. sbit SPEAK=P3^6;
  32. void Key_up_comparison();         //把floor_up[]按从小到大排列
  33. void Key_down_comparison();                  //把floor_down[]按从大到小排列
  34. void max_min_comparison();        //比较出floor_up[]的最大值(max)和floor_down[]的最小值(min)

  35. //主函数

  36. void main()
  37. {
  38.   P2=0x80;         //初始化
  39.   LED=0;
  40.   SPEAK=0;
  41.   TMOD=0x01;       //T0方式
  42.   TH0=(-6000)/256;     //6ms定时
  43.   TL0=(-6000)%256;
  44.   IT0=1;
  45.   IE=0x83;
  46.   TR0=1;
  47.   ET0=1;
  48.   Pressed_key_up=floor_up[0];
  49.   while(1)                //循环排列
  50.   {
  51.     Key_up_comparison();
  52.     Key_down_comparison();
  53.     max_min_comparison();
  54.   }
  55. }



  56. void LED_Screen_Display() interrupt 1 //进入中断,显示楼层
  57. {  
  58.   TH0=(-6000)/256;     //6ms
  59.   TL0=(-6000)%256;
  60.   P0=0xff;
  61.   Pressed_key_up=floor_up[0];
  62.   Pressed_key_down=floor_down[0];
  63.    
  64.   if(flag==1)               //上升标志  
  65.   {
  66.     if(Pressed_key_up!=9)          //有上升请求   
  67.     {   
  68.           if(Pressed_key_up>Current_floor)         //点阵平滑上升显示   
  69.       {   
  70.        P0=~Table_of_Digits[Current_floor*8+i];         
  71.         P2=_crol_(P2,1);                           
  72.         if(++i==8)
  73.         {  i=0;   P2=0x80;  }     
  74.         if(++t==250)                //延迟     
  75.             {  t=0;     
  76.               
  77.                 ++Current_floor;}
  78.              }   
  79.            }
  80.             else if(Pressed_key_up<Current_floor);
  81.         
  82.            else if(Pressed_key_up==Current_floor)                       //到达请求楼层   
  83.            {  
  84.              P0=~Table_of_Digits[Current_floor*8+i];   
  85.              P2=_crol_(P2,1);      
  86.              if(++i==8)     
  87.              {i=0; P2=0x80; }   
  88.               LED=~LED;
  89.                   SPEAK=~SPEAK;       //蜂鸣器响,LED闪烁
  90.               if(++t==250)
  91.               {     
  92.                 t=0;     
  93.                 if(Current_floor==Pressed_key_up)     
  94.                 {  Current_floor=Pressed_key_up;     
  95.                   if(Current_floor==max)
  96.                   {  flag=0;  }     
  97.                   floor_up[0]=9;     
  98.                 }   
  99.               }   
  100.           }      
  101.     }     
  102.         else if(Pressed_key_up==9)       //无请求,扫描显示当前楼层
  103.         {     
  104.          P0=~Table_of_Digits[Current_floor*8+i];   
  105.           P2=_crol_(P2,1);
  106.           if(++i==8)      
  107.           {
  108.             i=0;      
  109.                 P2=0x80;
  110.           }     
  111.           if(++t==250)               
  112.       t=0;     
  113.         }  
  114.   }  
  115.    else if(flag==0)               //下降标志
  116.   {
  117.     if(Pressed_key_down!=0)      //有下降请求
  118.     {
  119.       if(Pressed_key_down>Current_floor);
  120.            else if(Pressed_key_down<Current_floor)
  121.          //点阵平滑下降显示
  122.       {
  123.         P0=~Table_of_Digits[Current_floor*8+i];
  124.         P2=_crol_(P2,1);
  125.         if(++i==8)
  126.         {
  127.           i=0;
  128.               P2=0x80;
  129.         }
  130.         if(++t==250)
  131.         {
  132.           t=0;
  133.           if (++offset==8)
  134.           {
  135.             offset = 0;
  136.                     --Current_floor;
  137.           }
  138.          }
  139.       }
  140.       else if(Pressed_key_down==Current_floor)       //到达请求楼层
  141.       {
  142.        P0=~Table_of_Digits[Current_floor*8+i];
  143.         P2=_crol_(P2,1);
  144.         if(++i==8)
  145.         {
  146.                   i=0;
  147.                   P2=0x80;
  148.                 }
  149.         LED=~LED;SPEAK=~SPEAK;     //蜂鸣器响,LED闪烁
  150.         if(++t==250)
  151.         {t=0;
  152.        if(Current_floor==Pressed_key_down)
  153.           {
  154.             Current_floor=Pressed_key_down;
  155.             if(Current_floor==min)
  156.             {flag=1;}
  157.             floor_down[0]=0;
  158.           }
  159.          }
  160.          }
  161.     }

  162.    else if(Pressed_key_down==0)       //无请求,扫描显示当前楼层   
  163. {      
  164. P0=~Table_of_Digits[Current_floor*8+i];     
  165.   P2=_crol_(P2,1);      
  166.   if(++i==8)      
  167.   {      
  168.     i=0;     
  169.         P2=0x80;     
  170.   }     
  171.   if(++t==250)         
  172.   t=0;     
  173. }  
  174.    }
  175.    
  176. void Key_detection() interrupt 0            //按下按键,进入外部中断,将上升请求跟下降请求放入数组,并判断标志flag
  177. {  
  178.   P0=0xff;  
  179.   P2=0x80;  
  180.   i=0;          //防抖  
  181.   if(KEY1==0) j=1;  
  182.   else if(KEY2==0) j=2;      //判断请求  
  183.   else if(KEY3==0) j=3;  
  184.   else if(KEY4==0) j=4;  
  185.   else if(KEY5==0) j=5;
  186.   else if(KEY6==0) j=6;  
  187.   else if(KEY7==0) j=7;  
  188.   else if(KEY8==0) j=8;  
  189.   if(j>Current_floor)       //将上升请求放入数组  
  190.   {  
  191.     if(floor_down[0]==0)  
  192.         flag=1;   
  193.         floor_up[b++]=j;  
  194.         if(b==8)   
  195.         b=0;  
  196.   }  
  197.   else if(j<Current_floor)       //将下降请求放入数组  
  198.   {  
  199.     if(floor_up[0]==9)  
  200.         flag=0;   
  201.         floor_down[c++]=j;  
  202.         if(c==8)
  203.         c=0;  
  204.   }

  205. else if(j==Current_floor);   
  206. }   

  207. void  Key_up_comparison()         //把floor_up[]按从小到大排列
  208. {  
  209.   int a1,a2,a3=0;  
  210.   for(a2=0;a2<7;a2++)  
  211.   {   
  212.     for(a1=0;a1<7;++a1)   
  213.         {   
  214.           if(floor_up[a1]>floor_up[a1+1])   
  215.           {   
  216.             a3=floor_up[a1];   
  217.                 floor_up[a1]=floor_up[a1+1];   
  218.                 floor_up[a1+1]=a3;   
  219.           }   
  220.           if(floor_up[a1]==floor_up[a1+1])   
  221.           floor_up[a1+1]=9;   
  222.         }  
  223.   }
  224. }

  225. void  Key_down_comparison()        //把floor_down[]按从大到小排列
  226. {   
  227.   int a1,a2,a3=0;  
  228.   for(a2=0;a2<7;a2++)  
  229.   {   
  230.     for(a1=0;a1<7;++a1)   
  231.         {   
  232.           if(floor_down[a1]<floor_down[a1+1])   
  233.           {   
  234.             a3=floor_down[a1];   
  235. ……………………

  236. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
电梯.zip (26.37 KB, 下载次数: 5)


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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