/ 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 编辑 ]
此帖出自
小平头技术问答
一周热门 更多>