您现在所在的是:

单片机论坛

回帖:11个,阅读:3791 [上一页] [1] [2] [下一页]
800
跌落凡间的猪
文章数:2
年度积分:50
历史总积分:800
注册时间:2009/7/31
发站内信
发表于:2009/7/31 13:36:50
#0楼
目的:写出这个程序的功能,还有工作原理,并请对程序进行改善。



#include "reg52.H"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int

sbit P0_0 = 0x80;
sbit P0_1 = 0x81;
sbit P0_2 = 0x82;
sbit P0_3 = 0x83;
sbit P0_4 = 0x84;
sbit P0_5 = 0x85;
sbit P1_5 = 0x95;
sbit P2_7 = 0xA7;
sbit IntSignal=0xB5;
sfr  WDT_CONTR=0xe1;
sbit CS=0xe9;
uchar Addr;
uint msCount;

uchar SignalTimeOut;
uchar SignalTime;
uint ProcLEDTime;
uchar State_p2;
bit erro=0;
bit StateTime=0;
bit RSState=0;
uint ClockMs,ClockS;
uint TempClockS;
uchar S_State,M_State,E_State;
uchar Move_State;
uchar State;
bit Erro_ri=0;
bit SignalState;
bit rise;
bit ProcStop;


uchar code StateTab[12]={0xbe,0xde,0xee,0xf6,
      0xbd,0xdd,0xed,0xf5,
      0xbb,0xdb,0xeb,0xf3,};

/*__________________________
读取P2口状态
----------------------------*/
void Statecode(uchar State_code)
{
switch (State_code)
{  case 0xbe: State_p2=0; break;
   case 0xde: State_p2=1; break;
   case 0xee: State_p2=2; break;
   case 0xf6: State_p2=3; break;
   case 0xbd: State_p2=4; break;
   case 0xdd: State_p2=5; break;
   case 0xed: State_p2=6; break;
   case 0xf5: State_p2=7; break;
   case 0xbb: State_p2=8; break;
   case 0xdb: State_p2=9; break;
   case 0xeb: State_p2=10; break;
   case 0xf3: State_p2=11; break;
   default: break;
   }
}

void mDelay(uint Dat)
{
uint j;
for (;Dat>0;Dat--)
 {for (j=42;j>0;j--);WDT_CONTR=0x38;}
}

void Delay10m()  //10分钟延时,600秒
{
ClockMs=0;
ClockS=0;
while(ClockS<600) ;  
}

/*——————————————————————————————————
故障状态
------------------------------------*/
void Error()
{
ET0=0;
P2=0xff;
mDelay(12);
P0_0=1;
erro=1;
P0_4=1;
P0_5=0;
while(1)  
{
 P0_3=~P0_3;
 mDelay(500);  
}
}

/*______________________
P2_7
-----------------------*/
void SignalCheck()  
{
if(SignalTimeOut>25) Error(); //20ms内监测
else erro=0;
rise=0;
if(SignalState!=P2_7)  
 {
 SignalState=P2_7;  
 rise=SignalState;
 SignalTimeOut=0;  
 }

if(rise) SignalTime+=1;
if(P0_4&&(SignalTime==100)){P0_4=0;SignalTime=0;}  
if((!P0_4)&&(SignalTime==50)){P0_4=1;SignalTime=0;}
}

/*_________________________________
P0_3
---------------------------------*/
void ProcLED()
{
if(ProcStop) {P0_3=1;return;}  
ProcLEDTime+=1;
if(ProcLEDTime==2000) {P0_3=~P0_3;ProcLEDTime=0;}
}

void Timer0() interrupt 1 using 0    
{

TL0=0x9a;  //  
TH0=0xfe;       //
SignalTimeOut+=1;
msCount+=1;
ClockMs+=1;  
if(ClockMs==1000){ClockMs=0;ClockS+=1;}
SignalCheck();  //检测上升沿
   ProcLED();
WDT_CONTR=0x38;
}

/*________________________________

--------------------------------*/
void StateProc(uchar delay)  
{
uchar i;
if(delay)
 {
 for(i=5;i>0;i--) { msCount=0;while(msCount<60000);} //5分钟延时
 }
else
 {
 msCount=0;
 while(msCount<20000);  //20秒延时
 }

while(!rise);//检上升沿到来
msCount=0;
while(msCount<1);//延1ms
P2=0xff;//置高
   msCount=0;
while(msCount<10);//2008-03-04修10ms

/*while(!rise);//检上升沿到*/

   P2=StateTab[State];//执行
}


void IntProc()
{
if(IntSignal)return;
E_State= P1>>5;
ProcStop=0;
while(!(IntSignal&&(State==M_State)))
{  
 if(IntSignal)
  {
   if(State<M_State)
    {State+=1;StateProc(0);}
  }
 else  
  {
  if(State==E_State) while(!IntSignal);
  else {State-=1;StateProc(0);}
  }
}
ProcStop=1;
}
/*-------------------------------------
等待延时
-------------------------------------*/
void mDelay0(register uchar n)
{
for(n;n>1;n--) WDT_CONTR=0x38;
}

/*-------------------------------
发送地址
------------------------------*/
void SendsAddr()
{  
WDT_CONTR=0x38;
TB8=0;
CS=0;
mDelay0(10);
P0_1=0;
SBUF=Addr;
while(!TI);
TI=0;
mDelay0(15);
SM2=0;
CS=1;
mDelay0(5);
}

/*------------------------------
发送数据
-----------------------------*/
void SendsData()
{  
uchar temp;
WDT_CONTR=0x38;
   TB8=0;
CS=0;
mDelay0(10);
temp=P2;
Statecode(temp);
   if(!erro) SBUF=State_p2;
else SBUF=13;
while(!TI);
TI=0;
mDelay0(15);
SM2=1;
CS=1;
mDelay0(5);
   
}
/*-------------------------------
执行P0口命令
--------------------------------*/
void D_Move()
{
mDelay(1000);
WDT_CONTR=0x38;
if(State>Move_State)
{   ProcStop=0;
 Erro_ri=0;
 do
 {
  State-=1;
  StateProc(0);
 }
 while(State>Move_State);
       ProcStop=1;
 }
else if(State<Move_State)
   {
 Erro_ri=0;
 ProcStop=0;
 do
 {
  State+=1;
  StateProc(0);
 }while(State<Move_State);
 ProcStop=1;
}
 else { Erro_ri=0; StateProc(0); }
 mDelay(1000);

}
/*--------------------------------
串口中断
---------------------------------*/
void Uart() interrupt 4 using 1
{

if(RI==1)
{   uchar temp;
    uchar temp0;
    uchar Sbuftemp;
    RI=0;
 Sbuftemp=SBUF;
 Erro_ri=1;
 mDelay0(15);
 if(SM2==0)
 {    
 
   temp=Sbuftemp&0x0f;
  if(temp>11) { RSState=0; Move_State=11; }
  else
  {   Addr=P1&0xc0;
     temp0=Sbuftemp&0xc0;
     if((temp0==Addr)||(temp0==0x00)) {  RSState=1; Move_State=temp; }
     
   }
  SendsData();  
   
   }
   
 else
 {
 
  Addr=P1&0xc0;
  if(Sbuftemp==Addr) SendsAddr();
  else
  {
   SM2=1;
   P0_1=1;
   CS=1;
   
   }
    }
    }
 else TI=0;
}



void main()
{
 P2=0xff;P0=0xff;P1=0xff;P3=0xff;
mDelay(1000);  //启动延迟时间
   SCON=0x90;
   PCON=0x00;
SM2=1;
   TH0=0xfe;  //  
TL0=0xa2;    //晶振4.194304 MHz  1ms定时
TMOD=0x01;      //
TR0=1;
IP=0x10;
    EA=1;
    ES=1;
 ET0=1;
   Addr=P1&0xc0;  
SignalState=P2_7;
WDT_CONTR=0x38;

S_State=7;  //启动端口
State=S_State;

while(!rise);
P0_0=0;
ProcStop=0;
P2=StateTab[State];
   
do
 {
 Erro_ri=0;
 State+=1;
 StateProc(0);
 }
while(State<11);
ProcStop=1;
   Delay10m();  //10分钟
   /*mDelay(2000);*/
M_State=11-((P1>>3)&0x3);

ProcStop=0;
while(State>M_State)
 {
 Erro_ri=0;
 State-=1;
 StateProc(0);
 }
ProcStop=1;
retu: mDelay(5000);
while(Erro_ri&RSState) D_Move();
ClockMs=0;
ClockS=0;
while(ClockS<14400)        //延时4小时,14400秒
 {
   if(Erro_ri&RSState) goto retu;
 if(!IntSignal)
  {
  mDelay(1000);
  if(!IntSignal)
   {
   TempClockS=ClockS;
   IntProc();    
   ClockS=TempClockS;
   }
  }
 }
Erro_ri=0;
S_State=P1&0x07;
if(State>S_State)
{  
 ProcStop=0;
 do
 {  
  if(Erro_ri&RSState) goto retu;
  State-=1;
  StateProc(1);
 }
 while(State>S_State);
       ProcStop=1;
 }
else if(State<S_State)
   {
 
 ProcStop=0;
 do
 {
     if(Erro_ri&RSState) goto retu;
  State+=1;
  StateProc(1);
 }
 while(State<S_State);
 ProcStop=1;
}
 else {  if(Erro_ri&RSState) goto retu; StateProc(1); }

while(1) if(Erro_ri&RSState) goto retu;        
}
1688
monglong
文章数:370
年度积分:50
历史总积分:1688
注册时间:2004/11/27
发站内信
发表于:2009/7/31 21:15:42
#1楼
变频器程序吧?
17528
ahljj
文章数:3386
年度积分:240
历史总积分:17528
注册时间:2002/3/23
发站内信
发表于:2012/3/23 16:49:08
#2楼
看看。。。。
3641
yueliang150
文章数:389
年度积分:50
历史总积分:3641
注册时间:2003/4/24
发站内信
发表于:2012/3/26 8:16:04
#3楼
围观:的确是高难度程序;非常的难以理解写程序人的“高深写法”;发程序人可要好好写出工作原理来;
表情
单片机、ARM产品开发设计;
小设备、夹具、治具控制器设计开发;数码管、点阵LED电子看板开发;
454
sanziw
文章数:1
年度积分:50
历史总积分:454
注册时间:2016/6/13
发站内信
发表于:2016/6/13 14:39:56
#4楼
有人讲解一下不
7677
hnhyczj
文章数:3755
年度积分:113
历史总积分:7677
注册时间:2011/8/27
发站内信
发表于:2016/6/13 17:37:34
#5楼
为什么发这么难的难我们
4678
anriqing111
文章数:927
年度积分:50
历史总积分:4678
注册时间:2012/10/2
发站内信
发表于:2016/6/13 20:41:31
#6楼
表示看不懂,自学过,半途而废。
357
13470084971
文章数:1
年度积分:50
历史总积分:357
注册时间:2018/8/8
发站内信
发表于:2018/8/8 11:10:20
#7楼
嗯  我就是来看看而已  然后表示看不懂
12456
蛇会大学
文章数:4613
年度积分:782
历史总积分:12456
注册时间:2015/12/14
发站内信
2018论坛分享达人
发表于:2018/9/27 23:12:28
#8楼
void Delay10m()  //10分钟延时,600秒
{
ClockMs=0;
ClockS=0;
while(ClockS<600) ;
}

这个是不是死循环?

其他的程序我全都懂,就是不知道什么意思
4891
努力瑞
文章数:579
年度积分:224
历史总积分:4891
注册时间:2012/7/16
发站内信
发表于:2018/10/7 21:50:21
#9楼
虽然我看不懂,但是我还是进来看看

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

109.2007