📄 fadianjikz.c
字号:
#include<reg51.h>
#include<io.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//4m
/*************************************************
全局变量
**************************************************/
bit up = 0;
bit down = 0;
uchar bt = 0; //begin or stop frequency_sample
uchar kp = 0; //采样次数
uint pinlv[5] = {0,0,0,0,0};
uint jieg = 0x1a0a;
/*************************************************
延时函数
**************************************************/
void delay(uchar u)
{
uchar i;
while(u--)
{
for(i=0;i<125;i++)
{
_nop_();
}
}
}
void time(void)
{
EA=1;
TMOD=0x11;
TH0=0x0;
TL0=0x0;
TH1=0xfc;
TL1=0x18; //3ms
// ET0=1; //允许定时器T0中断
// TR0=1; //启动定时器T0
ET1=1; //允许定时器T1中断
TR1=1; //启动定时器T1
IT0=1; //外部中断0下降缘触发
EX0=1; //允许外部0中断
PX0=1; //外部中断0高优先级
}
/**************************************
模拟信号控制
***************************************/
void moni(uchar a)
{
if(((jieg <= 0x17ac)||(outv == 0))&&(a == 3)) //频率高55,电压高230
{
up = 0;
a = 0;
}
if(((jieg >= 0x1b20)||(outv == 1))&&(a == 4)) //频率低48,电压低190
{
down = 0;
a = 0;
}
}
void main(void)
{
uchar a = 0;
P1 = 0xff;
P3 = 0xff;
time();
standard = 0; //基准高
while(1)
{
//---------------------stop-----------------------------
if((up == 1)||(down == 1)) //正在执行上或者下
{
if((sensor0 == 0)||(sensor1 == 0)) //限位传感器
{
delay(10);
if((sensor0 == 0)||(sensor1 == 0))
{
up = 0;
down = 0;
a = 0;
}
}
if(a==1)
{
if(sdu == 1)
{
up = 0;
a = 0;
}
}
if(a==2)
{
if(sdd == 1)
{
down = 0;
a = 0;
}
}
}
moni(a);
//-------------------begin--------------------------------
if(sensor0 == 1) //没有到达上位
{
if((jieg >= 0x1cef)&&(sdu == 1)&&(sdd == 1)) //频率低
// if((jieg >= 0x1988)&&(sdu == 1)&&(sdd == 1)) //频率低
{
up = 1;
down = 0;
standard = 0; //基准高
a = 3;
}
if((sdu == 0)&&(sdd == 1))
{
delay(10);
if((sdu == 0)&&(sdd == 1))
{
up = 1;
a = 1;
}
}
}
if(sensor1 == 1) //没有到达下位
{
if((jieg <= 0x15b3)&&(sdu == 1)&&(sdd == 1)) //频率高
// if((jieg <= 0x1a92)&&(sdu == 1)&&(sdd == 1)) //频率高
{
up = 0;
down = 1;
standard = 1; //基准低
a = 4;
}
if((sdd == 0)&&(sdu == 1))
{
delay(10);
if((sdd == 0)&&(sdu == 1))
{
down = 1;
a = 2;
}
}
}
}
}
/***********************************************
外部中断0
************************************************/
void waibu0(void) interrupt 0
{
uint date,xte;
if(bt == 0)
{
TH0=0x0;
TL0=0x0;
TR0 = 1; //启动记数
}
bt++;
if(bt == 2)
{
TR0 = 0; //关闭记数
EX0 = 0; //不允许外部0中断
pinlv[kp] = TH0*256+TL0;
kp++; //地址移动
bt = 0; //允许再次记数
if(kp >= 5)
{
kp = 0;
if(pinlv[0] > pinlv[1])
{
date = pinlv[0];
xte = pinlv[1];
}
else
{
date = pinlv[1];
xte = pinlv[0];
}
if(date < pinlv[2])
date = pinlv[2];
if(date < pinlv[3])
date = pinlv[3];
if(date < pinlv[4])
date = pinlv[4];
if(xte > pinlv[2])
xte = pinlv[2];
if(xte > pinlv[3])
xte = pinlv[3];
if(xte > pinlv[4])
xte = pinlv[4];
//如果使用4M的晶振,溢出周期是3us,那么在20MS内的脉冲数是6666.7,最低可以测量30Hz,最高可以测量200Hz
jieg = pinlv[0] - xte + pinlv[1] + pinlv[2] + pinlv[3] - date + pinlv[4];
jieg = jieg / 3;
}
else
{
EX0 = 1; //允许外部0中断
}
}
}
/************************************************
定时器1
*************************************************/
void timer1(void) interrupt 3
{
static uchar d = 0;
static uint suo = 0;
// TR1=0; //关闭定时器1
TH1=0xfc;
TL1=0x18; //3ms
if((up == 1)||(down == 1))
{
suo = 0;
if(d == 0)
{
motor_a0 = 0;
motor_a1 = 1;
motor_b0 = 1;
motor_b1 = 1;
}
else if(d == 1)
{
motor_a0 = 0;
motor_a1 = 0;
motor_b0 = 1;
motor_b1 = 1;
}
else if(d == 2)
{
motor_a0 = 1;
motor_a1 = 0;
motor_b0 = 1;
motor_b1 = 1;
}
else if(d == 3)
{
motor_a0 = 1;
motor_a1 = 0;
motor_b0 = 0;
motor_b1 = 1;
}
else if(d == 4)
{
motor_a0 = 1;
motor_a1 = 1;
motor_b0 = 0;
motor_b1 = 1;
}
else if(d == 5)
{
motor_a0 = 1;
motor_a1 = 1;
motor_b0 = 0;
motor_b1 = 0;
}
else if(d == 6)
{
motor_a0 = 1;
motor_a1 = 1;
motor_b0 = 1;
motor_b1 = 0;
}
else if(d == 7)
{
motor_a0 = 0;
motor_a1 = 1;
motor_b0 = 1;
motor_b1 = 0;
}
}
else
{
suo ++;
if((suo>333)&&(d != 0))
{
d = 0;
suo = 0;
}
if(suo>336)
{
motor_a0 = 1;
motor_a1 = 1;
motor_b0 = 1;
motor_b1 = 1;
suo = 0;
}
}
if((up == 1)&&(down == 0))
{
d ++;
if(d >= 8)
d = 0;
}
if((up == 0)&&(down == 1))
{
if(d == 0)
d = 8;
d --;
}
// if((up == 0)&&(down == 0)&&(d != 0))
// if((up == 0)&&(down == 0))
// {
// d = 8;
// }
if(d == 0)
EX0 = 1; //允许外部0中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -