📄 noname2.c
字号:
#include<reg52.h>
#include <noname1.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define senddata_shu 22
#define maichong 6 //脉冲个数
#define shijian 60000 //时间
sbit P3_3=P3^3;
sbit P3_5=P3^5;
sbit P3_2=P3^2;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
uchar flag_int1; //外中断输入的标志位
uchar m_flag;
bit bhead=0;
bit send_flag=0;
/*外中断1的控制T1计数子程序*/
void int1svr(void) interrupt 2
{
TR0=1; //打开定时器T0
TR1=1; //打开计数器T1
ET0=1; //开定时器中断
ET1=1; //开定时器中断
l++;
}
void int0svr(void) interrupt 0
{
EX0=0; //关外部中断0
EX1=1; //开外部中断1
flag0=1;
P1_7=!P1_7;
}
/*T0定时溢出子程序*/
void timer0(void) interrupt 1
{
TH0=0;
TL0=0;
N=N+1;
}
/*T1计数器溢出子程序*/
void timer1(void) interrupt 3
{
TH1=0;
TL1=0;
M=M+1;
}
void send() interrupt 4
{
TI=0;
if(!bhead)
{
SBUF=0x7F;
bhead=1;
while(!TI);
}
else
{
SBUF=senddata[l]; //按顺序发送帧数据
while(!TI);
l++;
if(l==senddata_shu)
{
SBUF=0x7f; //按顺序发送帧数据
while(!TI);
}
else if(l>senddata_shu)
{
TI=0;
}
}
}
/*
void send() interrupt 4
{
TI=0;
// EX1=0;
if(!bhead)
{
SBUF=0x7F;
bhead=1;
while(!TI);
}
else if(l==1)
{
//SBUF=0x55;
SBUF=guangdian>>16;
while(!TI);
}
else if(l==2)
{
SBUF=guangdian>>8;
while(!TI);
}
else if(l==3)
{
SBUF=guangdian;
while(!TI);
}
else if(l==4)
{
SBUF=T0_total>>16;
while(!TI);
}
else if(l==5)
{
SBUF=T0_total>>8;
while(!TI);
}
else if(l==6)
{
SBUF=T0_total;
while(!TI);
}
/* else if(l==6)
{
SBUF=T1_total>>16;
while(!TI);
} */
/* else if(l==7)
{
SBUF=T1_total>>8;
while(!TI);
}
else if(l==8)
{
SBUF=T1_total;
while(!TI);
} */
/* else if(l==10)
{
SBUF=T2_total>>16;
while(!TI);
} */
/* else if(l==9)
{
SBUF=T2_total>>8;
while(!TI);
}
else if(l==10)
{
SBUF=T2_total;
while(!TI);
}
else if(l==11)
{
SBUF=freq>>8;
while(!TI);
}
else if(l==12)
{
SBUF=freq;
while(!TI);
}
else if(l==13)
{
SBUF=k>>8;
while(!TI);
}
else if(l==14)
{
SBUF=k;
while(!TI);
}
else if(l==15)
{
SBUF=T0_total1>>16;
while(!TI);
}
else if(l==16)
{
SBUF=T0_total1>>8;
while(!TI);
}
else if(l==17)
{
SBUF=T0_total1;
while(!TI);
}
else if(l==18)
{
SBUF=T1_total1>>16;
while(!TI);
}
else if(l==19)
{
SBUF=T1_total1>>8;
while(!TI);
}
else if(l==20)
{
SBUF=T1_total1;
while(!TI);
}
else if(l==21)
{
SBUF=0x7f;
while(!TI);
}
else
TI=0;
l++;
} */
void timer1_INT(void)
{
EA=1;
// IT0=1; //下降沿触发
PCON=0X00;
IT1=1;
EX1=0;
TMOD=0x51; //T1为16位计数器,T0为16位定时器
TH0=0;
TL0=0;
TH1=0;
TL1=0;
ES = 0; //关闭串口中断
M=0;
// TR1=0;
// T1=0;
// ET1 = 0; //打开计数器1中断
// ET0=0; //打开计数器0中断
}
void UART_INT(void)
{
EA=1;
// TR1=0;
IT1=1; //下降沿触发
// IT0=1;
TMOD=0x21;
// PCON=0x80; //波特率翻倍
PCON=0x00; //波特率翻倍
SCON =0x50; //串口为工作1方式,波特率可变,允许串行接受
// TH1 = 0xf3; //串口波特率设置,9600
// TL1 = 0xf3;
TH1 = 0xfd; //串口波特率设置,9600
TL1 = 0xfd;
ET1=0;
ES = 1; //打开串口中断
}
void main(void)
{
P1_7=1;
flag0=0;
flag1=0;
flag2=0;
flag3=0;
guangdian=0;
total=0;
// T0_total=0;
// T1_total=0;
M=0;
N=0;
l=0;
flag4=0;
flag5=0;
timer1_INT();
EX1=1; //
while((!flag4) || (!flag5))
{
if((l>=maichong ) && (!flag4))
{
TR0=0;
flag4=1;
}
else if(((M*65536+TH1*256+TL1)>shijian) && (!flag5))
{
TR1=0;
flag5=1;
}
}
EX1=0;
senddata[0]=N;
senddata[1]=TH0;
senddata[2]=TL0;
senddata[3]=M;
senddata[4]=TH1;
senddata[5]=TL1;
// T0_total1=N*65536+TH0*256+TL0;
// T1_total1=M*65536+TH1*256+TL1;
TH0=0;
TL0=0;
TH1=0;
TL1=0;
while(1)
{
INT0=1;
while(!flag0);
/* if(!P3_2 && !flag0)
{
// TR0=1; //打开定时器T0
// TR1=1; //打开计数器T1
EX1=1; //开外部中断1
// ET0=1; //开定时器中断
// ET1=1; //开定时器中断
flag0=1;
P1_7=!P1_7;
} */
if(P3_2 && !flag1 && flag0)
{
senddata[6]=N;
senddata[7]=TH0;
senddata[8]=TL0;
senddata[9]=M;
senddata[10]=TH1;
senddata[11]=TL1;
// guangdian=N*65536+TH0*256+TL0; //读出定时器T0的值
// guangdian=TH0*256+TL0; //读出定时器T0的值
// T2_total=M*65536+TH1*256+TL1;
// T2_total=TH1*256+TL1;
k=l;
flag1=1;
}
if((l>=maichong) && !flag2 && flag0)
{
EX1=0; //关外部中断1
// T0_total=N*65536+TH0*256+TL0; //读出定时器T0的值
senddata[12]=N;
senddata[13]=TH0;
senddata[14]=TL0;
flag2=1;
}
total=M*65536+TH1*256+TL1;
if((total>shijian) && !flag3 && flag0)
{
TR1=0; //关计数器T1
// T1_total=M*65536+TH1*256+TL1;
// T1_total=TH1*256+TL1;
senddata[15]=M;
senddata[16]=TH1;
senddata[17]=TL1;
flag3=1;
}
// flag2=1;
// flag3=1;
if(flag1 && flag2 && flag3)
{
UART_INT(); //初始化串口
senddata[18]=k>>8;
senddata[19]=k;
guangdian=senddata[6]*65536+senddata[7]*256+senddata[8]; //读出定时器T0的值
total=senddata[9]*65536+senddata[10]*256+senddata[11];
freq=total*1.0/guangdian*2000000-150000;
senddata[20]=freq>>8;
senddata[21]=freq;
l=0;
bhead=0;
TR1=1;
TI=1; //开中断,通过串口发送数据去打印
while(l<=senddata_shu); //等待发送数据
TI=0;
ES=0;
TR1=0;
TR0=0;
l=0;
bhead=0;
flag0=0;
flag1=0;
flag2=0;
flag3=0;
guangdian=0;
total=0;
// T0_total=0;
// T1_total=0;
M=0;
N=0;
TF1=0;
timer1_INT(); //初始化定时器
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -