关于用STC12C2052AD实现自动化的问题[图片见附件]求各位大侠帮忙修改下程序+注释

2019-03-24 18:48发布

/  IN        OUT
//P3.0 启动      P1.7 前进
//P3.1 启动      P1.5 下降
//P3.2 急停      P1.3 计数器
//P3.3 下降下限1
//P3.4 下降下限2
//P3.5 前进前限
#include <STC12C2052AD.H>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit STAR1 = P3^0;  //  启动
sbit STAR2 = P3^1;  //  启动
sbit ESTOP = P3^2;  //  急停
sbit DW_LMT1 = P3^3; //  下降下限1
sbit DW_LMT2 = P3^4; //  下降下限2
sbit FWD_LMT = P3^5; //   前进前限
//sbit AD_FLG = P1^6;
bit button,Mau_Mark,AD_Mark;    //定义位变量   
uint j;
uchar i,Value_AD;
void timer0(void) interrupt 1 using 1    //中断
{
TH0 = (65536 - 46080)/256;           //定时器T0的高8位赋初值
TL0 = (65536 - 46080)%256;//(11.0592=46080)--50ms   //定时器T0的低8位赋初值
if(Mau_Mark)
{
  i++;
  if(i >= 30)
  {
   button = 1;
   i = 0;
  }
}
if(AD_Mark)
  j++;
}
void delayms(int x)    //延时函数
{
  uchar i;
  while(x--)
  for(i=0;i<120;i++);
}
uchar Read2052(uchar port)//读取AD数据
{
ADC_DATA = 0x00;//清除原来结果
ADC_CONTR = 0x20;//设置转换速度,420T
ADC_CONTR = 0xe0;//清除ADC_FLAG,ADC_START和低3位
ADC_CONTR |= port;//选择A/D通道 0x00-P10 0x01-P11
delayms(450);  //等输入电压达到稳定
ADC_CONTR |= 0x08;//令ADCS=1启动A/D转换
while((ADC_CONTR & 0x10) == 0x00);
ADC_CONTR &= 0xf7;//清除ADC_START位,关闭A/D转换
if(ADC_DATA > 200)
ADC_DATA = 200;
return ADC_DATA;  // ADC_DATA  A/D 转换结果特殊功能寄存器
}   
void InitADC(void)
{
P1 |= 0x03;
ADC_CONTR |= 0x80;
delayms(300);
P1M0 = 0x03;
//P1M1 = 0x03;//设置P1.0,P1.1为开漏状态
P1M1 = 0x00;  //设置P1.0,P1.1为高阻状态
}
void Two_Manu(void)
{
if((!STAR1)|(!STAR2))
  Mau_Mark = 1;
else
{
  Mau_Mark = 0;
  i = 0;
  button = 0;
}
}
void main(void)
{  
P1 = 0xff;
P3 = 0xff;
TH0 = (65536 - 46080)/256;   //定时器T0的高8位赋初值
    TL0 = (65536 - 46080)%256;   //定时器T0的低8位赋初值
InitADC();
delayms(1200);
EA  = 1;
ET0 = 1;
TR0 = 1;
Value_AD = Read2052(0x00);
while(1)
{
  Loop:
  Two_Manu();   //调用函数
  if(((P3&0x3f) == 0x38) && (button == 0))
  {
   delayms(200);
   if((P3&0x3f) == 0x38)
   {
    P1 &= 0x7f;//前进
    while(FWD_LMT)
    {
     if(ESTOP)
     {
      P1 = 0xff;
      goto Loop;   // 转去执行Loop标记的语句
     }
    }
    P1 &= 0xdf;//下压
    while(DW_LMT1 | DW_LMT2)
    {
     if(ESTOP)
     {
      P1 |= 0x20;
      delayms(5000);
      P1 = 0xff;
      goto Loop;
     }
    }
    j = 0;
    Value_AD = Read2052(0x00);
//    AD_FLG = 0;
    AD_Mark = 1;
   }
  }
  if(j > (4*Value_AD))
  {
   AD_Mark = 0;
//   AD_FLG  = 1;
   j = 0;
   P1 |= 0x20;//上升
   delayms(5000);
   P1 &= 0xf7;//计数
   delayms(1000);
   P1 |= 0x08;
   delayms(5000);
   P1 |= 0x80;
   delayms(18000);//上升延时保护
  }
    }
}

[ 本帖最后由 singleyork 于 2013-4-10 16:07 编辑 ] 此帖出自小平头技术问答
0条回答

一周热门 更多>