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

📄 car.c

📁 小车具有测距防撞计时记速等功能
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <REGX51.H>
unsigned char string[]={"0123456789:.m /sc"};
unsigned char second; //秒
unsigned char min;    //分
unsigned char hour;   //时
unsigned char sec;    //标志位
unsigned int count;   //用于计数,计20次,即1S
unsigned int quan_l;  //车轮转的圈数。根据测量得,车轮每转一圈为0。1米
unsigned int quan_h;  //车轮转的圈数
unsigned char i;      //变量,用于存放一些临时数据
unsigned int k;       //变量,用于存放一些临时数据
static unsigned int c10;  //用于记录1S内车轮所转的圈数
static unsigned int s;    //用于存放速度

sbit rs=P2^5;         //液晶数据,命令
sbit rw=P2^6;         //液晶读写
sbit ep=P2^7;         //液晶使能
sbit quan=P2^0;       //前进
sbit hou=P2^1;        //后退
sbit right=P2^2;      //右转
sbit leght=P2^3;      //左转
sbit sudu1=P1^0;      //速度1
sbit sudu2=P1^1;      //速度2
sbit dang=P3^0;       //检测障碍物

void delay(unsigned int time)      //带参数的延时函数
     {
         unsigned char k;
         while(time--)
            for(k=0;k<220;k++);
     }
bit lcd_bz()                       //液晶测忙函数 
     { 
         bit result;               //设置布尔型的返回值
         rs=0;                     //rs=0指向液晶命令存署器,rs=1指向液晶数据存署器
         rw=1;                     //rw=0写液晶命令,rw=1读液晶命令
         ep=1;                     //液晶使能
         result=(bit)(P0&0x80);    //忙信号从P0。7口输出。等于1为忙,等于0为不忙
         ep=0;
         return result;            //返回布尔型
      }
lcd_word(unsigned char word)       //液晶写命令
     {
         while(lcd_bz());          //测忙
         rs=0;                     //rs=0指向液晶命令存署器
         rw=0;                     //rw=0写液晶命令
         ep=1;                     //液晶使能
         P0=word;                  //命令从P0口写到液晶命令存署器
         ep=0;
     }
lcd_pos(unsigned char pos)         //写数据要在液晶中显示的位置
     {
        lcd_word(pos|0x80);        //写数据要在液晶中显示的位置时要与0相与
     }
lcd_dat(unsigned char dat)         //写要显示的数据
     {
        while(lcd_bz());           //测忙
        rs=1;                      //rs=1指向液晶数据存署器
        rw=0;                      //rw=0写液晶命令
        ep=1;                      //液晶使能
        P0=dat;                    //命令从P0口写到液晶数据存署器  
        ep=0;
      }
lcd_init()
     {
        lcd_word(0x38);            //显示模式设置。设置16X2显示,5X7点阵,8位数据接口
        delay(1);
        lcd_word(0x0c);            //显示及光标设置。显示开,不显示光标
        delay(1);
        lcd_word(0x06);            //设置当写一个字符时,地址指针及光标指针加1
        delay(1);
        lcd_word(0x01);            //显示清屏。地址指针及光标指针清零
        delay(1);
     }
time0() interrupt 1                //T0中断程序,用于计算行程时间
      {
	    TR0=0;                     //关T0。TR0为T0运行,停止位
        TH0=-50000/256;            //重装50MS初值
        TL0=-50000%256;
        count++;                   //计数
        if(count>=23)              //计23次中断为1秒
          {
             count=0;              //计数清零  
             sec=1;                //设标志位
             second++;             //秒加1
             if(second>=60)        
               {
                  second=0;        //秒清零
                  min++;           //分加1
                  if(min>=60)
                     {
                       min=0;      //分清零
                       hour++;     //小时加1
                       if(hour>=24)
                         hour=0;   //小时清零
                     }
               }
             if(sec)
               {
                  s=c10*10;                //速度。C10 x 10为1S内车所走的路程。(C10 X 10)/1S即为速度
				  c10=0;                   //1S内车轮所圈数清零
			      
                  sec=0;                   //清标志位
                  lcd_init();              //液晶初始化
                  lcd_pos(0x03);           //设置液晶第一行显示数据的位置
				  delay(1);
                  i=hour/10;               //小时高位
                  lcd_dat(string[i]);      //显示
             	  delay(1);
                  i=hour%10;               //小时低位
                  lcd_dat(string[i]);
     			  delay(1);                //延时
                  lcd_dat(string[10]);     //显示 :
  				  delay(1);
                  i=min/10;                //分高位
                  lcd_dat(string[i]);
				  delay(1);
                  i=min%10;                //分低位
                  lcd_dat(string[i]);
                  delay(1);
                  lcd_dat(string[10]);     //显示 :
				  delay(1);
                  i=second/10;             //秒高位
                  lcd_dat(string[i]);
				  delay(1);
                  i=second%10;             //秒低位
                  lcd_dat(string[i]);
                  delay(1);

				 lcd_pos(0x40);            //设置液晶第二行数据显示的位置
	             i=quan_h%10;
	             if(i)                      //如果里程高位为0则隐藏
                    lcd_dat(string[i]);
                 else 
	                lcd_dat(string[13]);
	             delay(1);
                 i=quan_l/100;
	             if(quan_h%10==0)           //如果里程高位为0,且次高位为零则隐藏
                   {                           
                      if(i)
                         lcd_dat(string[i]);
                      else 
	                     lcd_dat(string[13]);
		            }
	              else
	                 lcd_dat(string[i]);
	              delay(1); 
	              i=(quan_l%100)/10; 
                  lcd_dat(string[i]);
	              delay(1);
	              lcd_dat(string[11]);   //小数点
	              delay(1);
                  i=quan_l%10;
                  lcd_dat(string[i]);
	              delay(1);
	              lcd_dat(string[12]);  // m
	              delay(1);

				  lcd_pos(0x49);
                  k=s/100;                       //速度高位
                  if(k)                          //如果里程高位为0则隐藏
                     lcd_dat(string[k]);
                  else 
	                 lcd_dat(string[13]);
	              delay(1);
			      k=(s%100)/10;                  //速度次高位
			      if(s/100==0)                   //如果里程高位为0,且次高位为零则隐藏
			        {
				       if(k)                      
                         lcd_dat(string[k]);
                       else 
	                     lcd_dat(string[13]);
				     }
                  else
			        lcd_dat(string[k]);
			      delay(1);
			      k=s%10;                       //速度低位
                  lcd_dat(string[k]);
			      delay(1);
				  lcd_dat(string[16]);  // c
			      delay(1);
			      lcd_dat(string[12]);  // m
			      delay(1);
			      lcd_dat(string[14]);  // /
			      delay(1);
			      lcd_dat(string[15]);  // s
			      delay(1);
               }
          }
         if(second>=30)
            { 
               EA=0;             //30秒到时,关所有中断
            }
		 TR0=1;                  //开T0,TR0为T0运行,停止位
   }

EX_0() interrupt 0              //外中断0中断程序,用于计算车轮圈数
   {
      EX0=0;                    //关外中断0
      quan_l++;                 //车轮低位圈数加1
	  c10++;
	  if(quan_l>=1000)
	    {
		   quan_l=0;            //车轮低位圈数清零
		   quan_h++;            //车轮高位圈数加1
		   if(quan_h>=9)
		      quan_h=0;
		}
	  lcd_pos(0x40);            //设置液晶第二行数据显示的位置
	  i=quan_h%10;
	  if(i)                      //如果里程高位为0则隐藏
         lcd_dat(string[i]);
      else 
	     lcd_dat(string[13]);
	  delay(1);
      i=quan_l/100;
	  if(quan_h%10==0)           //如果里程高位为0,且次高位为零则隐藏
        {                           
         if(i)
           lcd_dat(string[i]);
         else 
	       lcd_dat(string[13]);
		 }
	  else
	       lcd_dat(string[i]);

⌨️ 快捷键说明

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