3297|0

13

帖子

1

TA的资源

一粒金砂(初级)

楼主
 

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

/  IN        OUT
//P3.0 启动      P1.7 前进
//P3.1 启动      P1.5 下降
//P3.2 急停      P1.3 计数器
//P3.3 下降下限1
//P3.4 下降下限2
//P3.5 前进前限
#include
#include
#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 编辑 ]

未命名.jpg (34.1 KB, 下载次数: 0)

要实现功能:双启气缸下压,5秒后自动上升,计数器计数一次,急停按钮在任何情况下有效,

要实现功能:双启气缸下压,5秒后自动上升,计数器计数一次,急停按钮在任何情况下有效,
此帖出自51单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表