⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 noname2.c

📁 measure coin used 89c52,which use two Timers
💻 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 + -