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

📄 main.c

📁 测量车的车速和轴距的文件(包括原理图和程序).rar
💻 C
字号:
#include <reg51.h>
#define uchar unsigned char
#define uint  unsigned int
#define juli 1
//------------------- 定义1602液晶控制管脚-------------------------------------------------
sbit RS=P2^0;             
sbit RIW=P2^1;
sbit E=P2^2;
sbit int0=P3^2;  
sbit int1=P3^3;  

uchar i;

uint timecount=0;
uchar biaozhi=0;  //第一个开关
float jishi1=0;
float jishi2=0;
float speed;
float length;

//-------------------------定义数组----------------------------------------------------------
uchar tab[16]="                ";


void delay(uint xms)   //按键扫描延时子程序
{
   uint i,j;
   for(i=xms;i>0;i--)
      for(j=110;j>0;j--);
}
//---------------------1602写指令时序开始------------------------------------------------------
void wi(uchar com)        
{
  uint i=200;
  RS=1;
  RIW=1;
  RS=0;
  RIW=0;
  E=0;
  E=1;
  P0=com;
  while(i--);
  E=0;
}
//---------------------1602写指令时序结束---------------------------------------------------
//---------------------1602写数据时序开始--------------------------------------------------
void wd(uchar dat)       
{
   uint i=200;
   RS=0;
   RIW=1;
   RS=1;
   RIW=0;
   E=0;
   E=1;
   P0=dat;
   while(i--);
   E=0;
}
//---------------------1602写数据时序结束------------------------------------------------
void chushi()            //1602初始化程序
{

   wi(0x01);             //清屏
   wi(0x06);             //设置输入方式  AC自动加1,显示不发生移位
   wi(0x0F);             //显示开关控制 开显示 开光标 闪烁
   wi(0x38);             //功能设置 双行显示 5*8点阵   八位数据
}

void xianshi_speed(void)
{
unsigned long zancun=speed/1000;
  tab[6]=zancun%10+0x30;
  zancun=zancun/10;
  tab[5]=zancun%10+0x30;
  zancun=zancun/10;
  tab[3]='.';
  tab[4]=zancun%10+0x30;
  zancun=zancun/10;
  tab[2]=zancun%10+0x30;
  zancun=zancun/10;
  tab[1]=zancun%10+0x30;
  zancun=zancun/10;
  tab[0]=zancun%10+0x30;
  wi(0x89); 
  for(i=0;i<16;i++)
     {wd(tab[i]);}         //显示数组
}
void xianshi_length(void)
{
  unsigned long zancun=length/100;
  tab[6]=zancun%10+0x30;
  zancun=zancun/10;
  tab[5]=zancun%10+0x30;
  zancun=zancun/10;
  tab[4]='.';
  tab[3]=zancun%10+0x30;
  zancun=zancun/10;
  tab[2]=zancun%10+0x30;
  zancun=zancun/10;
  tab[1]=zancun%10+0x30;
  zancun=zancun/10;
  tab[0]=zancun%10+0x30;
  wi(0xc9); 
  for(i=0;i<16;i++)
     {wd(tab[i]);}         //显示数组
}

void main()
{
    IT0=1;
    EX0=1;

    IT1=1;
    EX1=1;

    PT1=1;

    TMOD=0x11;                 //T0工作为16位计数器(方式1),T1工作方式为16位定时器 
    TH0=0;                     //计数为65536                      
    TL0=0;                     // 
    TH1=0;     //定时器采用定时4ms.  初值为4000 
    TL1=0; 
    //TR1=1;                    //TR1=1,控制开关闭合,计数脉冲进入T1计数器,启动定时 
    //TR0=1;                    //TR0=1,控制开关闭合,计数脉冲进入T1计数器,启动计数 
    ET0=1;                    //定时器0开中断 
    ET1=1;                    //定时器1开中断

    EA=1;


   chushi();             //初始化

   wi(0x80);
   wd('s');
   wd('p');
   wd('d');
   wd('(');
   wd('m');
   wd('/');
   wd('s');
   wd(')');
   wd('=');
   wi(0xc0);
   wd('l');
   wd('e');
   wd('n');
   wd('(');
   wd('c');
   wd('m');
   wd(')');
   wd(' ');
   wd('=');
   while(1)
  {
    speed=41000/jishi1*1000000;
    length=speed*jishi2/1000000;
    if(speed>41000000000&&biaozhi==0)
	{
	  speed=0;
	  length=0;
	  biaozhi=0;
	  EX0=0;
	  EX1=1;
	}
    xianshi_speed();
    
    xianshi_length();
  }

}


void INT0_interrupt() interrupt 0 using 1
{
  //delay(30);
  //int0=1;
  delay(10);
  if(int0==0)
  {
    switch(biaozhi)
    {
     case 1:
	  {
       jishi1=timecount*65536+TH1*256+TL1;
	   EX0=0;
	   EX1=1;
       biaozhi=2;
      }break;
     case 3:   
      {
	  biaozhi=0;
	   EX0=0;
	   EX1=1;
       }break;
	   default :break;
    } 
  }
}

void INT1_interrupt() interrupt 2 using 1
{
  //delay(30);
  //int1=1;
  delay(10);
  if(int1==0)
  {
    if(biaozhi==0)  //开始计数
    {
     biaozhi=1;
     TR1=1;

	 EX1=0;
	 EX0=1;
    }
	else if(biaozhi==2)
	{
	   jishi2=timecount*65536+TH1*256+TL1;
       biaozhi=3;
       TR1=0;          //停止计时
       TH1=0;               //计数初值重装载 
       TL1=0; 
       timecount=0;

	   EX1=0;
	   EX0=1;
	}
  }
}


void t1(void) interrupt 3 using 0       //T1中断服务 
{ 
  TH1=0;               //计数初值重装载 
  TL1=0; 
  timecount++; 
   if(timecount==65535) 
    {
	    timecount=0;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -