⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dt.c

📁 自编的一个电梯控制程序
💻 C
字号:

//用两片8255,接线不变,1AB口作扫描,C口作BCD输出另一片,C0上,C1下,A1-7,B1-B3十个行程开关
//P2。72。62。5作8255片选,8255X为000,8255Y为100
//P2.0电机封锁P2.1为门的开关P2。3为超重报警,INT0是门开中断。INT1是超重中断。都是下降中断



#include <stdio.h>
#include <reg51.h>
#include<math.h>
#include<Intrins.h> 

#define uchar unsigned char
#define somenop() _nop_();_nop_();_nop_();_nop_();
skey[8]={1,2,4,8,16,32,64,128};//键盘扫描
scan[8]={1,2,4,8,16,32,64,128};
xdata P8255xa _at_ 0x0000;//x片8255口地址,A口行,B列,C上口BCD十位,下口BCD个位
xdata P8255xb _at_ 0x0001;
xdata P8255xc _at_ 0x0002;
xdata P8255xs _at_ 0x0003;
xdata P8255ya _at_ 0x8100;//y片8255口址,A口十个行程开关1-8,B9-10,C口0上,1下,
xdata P8255yb _at_ 0x8101;
xdata P8255yc _at_ 0x8102;
xdata P8255ys _at_ 0x8103;
bdata flagea;//层数0-7

sbit flagea1=flagea^1;
sbit flagea2=flagea^2;
sbit flagea3=flagea^3;
sbit flagea4=flagea^4;
sbit flagea5=flagea^5;
sbit flagea6=flagea^6;
sbit flagea7=flagea^7;
bdata flageb;//层数8-13第67位上下标志位
sbit flageb8=flageb^1;
sbit flageb9=flageb^2;
sbit flageb10=flageb^3;
sbit upf=flageb^6;
sbit downf=flageb^7;
sbit stop=P2^0;//电机封锁
sbit open=P2^1;//门
sbit been=P2^3;//超重报警
data count;

uchar keyboard(void);
void keywork(uchar);
void xckg(uchar);
uchar scaxckg(void);
void delay(uchar);
void TIMER0(void)interrupt 1 using 1//T0中断
{count--;
if(count==0)
{open=0;TR0=0;}
}


void door(void)interrupt 0 using 1//T0中断
{
stop=1;
}

void heavy(void)interrupt 2 using 1//T0中断
{
stop=1;been=1;
}
void main()
{

uchar k;
uchar p;
delay(10);

flagea=0;
flageb=0;
P8255xs=0x92;//P8255xAB口输入,C口输出
P8255xa=0x92;//P8255xAB口输入,C口输出
TMOD=0x02;//
TH0=255;
IT0=1;
IT1=1;

while(1)
{
k=keyboard();//键盘扫描
p=scaxckg();//行程开关
if(k)
keywork(k);//动作

if(p)
xckg(p);//动作

if(upf)
{
P8255ys=0x04;//下关
P8255ys=0x03;//上开
}
if(downf)

{P8255ys=0x04;//下关
P8255ys=0x03;//上开
}


if(open)
TR0=1;//计时关门


}

}





uchar scaxckg()//行程开关
{
uchar k;
k=P8255ya;

switch(k)
  {
   
  case 1:{k=1;break;}
  case 2:{k=2;break;}
  case 4:{k=3;break;}
  case 8:{k=4;break;}
  case 16:{k=5;break;}
  case 32:{k=6;break;}
  case 64:{k=7;break;}
  case 128:{k=8;break;}
  default:break;
}
k=P8255yb;
switch(k)
  {
   
  case 1:{k=9;break;}
  case 2:{k=10;break;}
  default:break;
}
return k;
}







uchar keyboard(void)//键盘
                                                                                                                                                                                                                                                                     {uchar chek=0x07; 
 {
uchar i,j,find,in,key;  
delay(100); 
chek=P8255xa;

if(chek==0XFF)
{
return 0;//CHAR INI,INJ;
}
find=0;
i=0;
while(i<8)
{if(find==1)
break;
P8255xb=skey[i];
somenop();
in=P8255xa;
 j=0;
 while(j<8)
 {
if(scan[j]==in)
 {find=1 ;
 break;}
j++;
 //INJ=J;INI=I;
 }
i++;
}
 if(find==0) {P8255xb=0x00;return 0;}
 else
{
key=i*8+j;  //计算键值
  //底3位送1,高5 位送0
  find=0;
 P8255xb=0X00;
key=key-7;
  
  return key; }
 
}}





void xckg(uchar t)//行程开关动作
{
switch(t)
  {
   
  case 1:{flagea1=0;P8255yc=1;stop=1;open=1;downf=0;break;}//停,开门,一层去下标志
  case 2:{flagea2=0;P8255yc=2;stop=1;open=1;break;}
  case 3:{flagea3=0;P8255yc=3;stop=1;open=1;break;}
  case 4:{flagea4=0;P8255yc=4;stop=1;open=1;break;}
  case 5:{flagea5=0;P8255yc=5;stop=1;open=1;break;}
  case 6:{flagea6=0;P8255yc=6;stop=1;open=1;break;}
  case 7:{flagea7=0;P8255yc=7;stop=1;open=1;break;}
  case 8:{flageb8=0;P8255yc=8;stop=1;open=1;break;}
  case 9:{flageb9=0;P8255yc=9;stop=1;open=1;break;}
  case 10:{flageb10=0;P8255yc=10;stop=1;open=1;break;}
  default:break;
}




if(upf)//向上有键否
{switch(t)
  {
   
  case 1:{if(flagea1)return;}
  case 2:{if(flagea2)return;}
  case 3:{if(flagea3){return;}
  case 4:{if(flagea4)return;}
  case 5:{if(flagea5)return;}//有键反回
  case 6:if(flagea6){return;}
  case 7:{if(flagea7)return;}
  case 8:{if(flageb8)return;}
  case 9:{if(flageb9)return;}
  case 10:{if(flageb10)return;}
  default:{upf=0;downf=1;}//没有就向下
}}
if(downf)//向下有键否
{switch(t)
  {
   
  case 10:{if(flageb10)return;}//有键反回
  case 9:if(flageb9){return;}
  case 8:{if(flageb8)return;}
  case 7:{if(flagea7)return;}
  case 6:{if(flagea6)return;}
  case 5:{if(flagea5)return;}
  case 4:{if(flagea4)return;}
  case 3:{if(flagea3)return;}
  case 2:{if(flagea2)return;}
  case 1:{if(flagea1)return;}
   default:;}
switch(t)
  {
   
  case 1:{if(flagea1)upf=1;downf=0;break;}
  case 2:{if(flagea2)upf=1;downf=0;break;}
  case 3:{if(flagea3)upf=1;downf=0;break;}
  case 4:{if(flagea4)upf=1;downf=0;break;}
  case 5:{if(flagea5)upf=1;downf=0;break;}//无键向上有键否
  case 6:{if(flagea6)upf=1;downf=0;break;}
  case 7:{if(flagea7)upf=1;downf=0;break;}
  case 8:{if(flageb8)upf=1;downf=0;break;}
  case 9:{if(flageb9)upf=1;downf=0;break;}
  case 10:{if(flageb10)upf=1;downf=0;break;}
  default:{;}
}

   
   }





}
}

void keywork(uchar k)//键盘动作
{
switch(k)
  {
   
  case 1:{flagea1=1;break;}
  case 2:{flagea2=1;break;}
  case 3:{flagea3=1;break;}
  case 4:{flagea4=1;break;}
  case 5:{flagea5=1;break;}
  case 6:{flagea6=1;break;}//

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -