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

📄 main2.c

📁 智能电动小车
💻 C
字号:
#include <REG52.H>
#define BYTE unsigned char  

//输入信号部分
sbit _hw_left=P1^0; //红外探测黑线信号
sbit _hw_mid=P1^1;
sbit _hw_right=P1^2;

sbit _gm0=P1^3;  //光敏探测信号
sbit _gm1=P1^4;
sbit _gm2=P1^5;
sbit _gm3=P1^6;
sbit _gm4=P1^7;
sbit _gm5=P3^6;
sbit _gm6=P3^7;

sbit _tie=P3^2; //金属探测信号

sbit _csbin=P2^0; //超声波探测信号

//输出信号部分
sbit _qzled=P0^0;
sbit _qyled=P0^1;
sbit _hzled=P0^2;
sbit _hyled=P0^3;
sbit _tieled=P0^4;
sbit _juliled=P0^5;
sbit _timeled=P0^6;
sbit _speak=P2^2;

sbit _qz=P2^3;
sbit _qy=P2^4;
sbit _hh=P2^5;
sbit _qq=P2^6;

sbit _k7seg=P2^7;
sbit _csbout=P2^1;

//全局变量
bit  direct=1; //方向默认向前
unsigned char htime=0x00;
unsigned char hdata=0x0a; //初始占空比50%

unsigned char bit0=0x00; //四个数码管显示的位数据
unsigned char bit1=0x00;
unsigned char bit2=0x00;
unsigned char bit3=0x00;

unsigned int tie0=0x0000;
unsigned int tie1=0x0000;
unsigned int tie2=0x0000;
unsigned int tie3=0x0000;
unsigned int tie4=0x0000;
unsigned int tie5=0x0000;
unsigned int tie6=0x0000;
unsigned int tie7=0x0000;

unsigned int juli=0x0000;
unsigned char LL0=0x02;    //每两个计数点的距离
unsigned int cishu=0x0000;
unsigned char miao=0x00;   //总的时间
unsigned int time0=0x0000;

unsigned int const ss0=0x0111; //AB 段的距离
unsigned int const ss1=0xffff; //AC 段的距离	

BYTE const discode0[11]={0x05,0x9f,0x23,0x0b,0x99,0x49,0x41,0x1f,0x01,0x09,0xff};//显示码1

//函数声明
void delay10ms(unsigned char n)//十毫秒延时子程序
{
  unsigned char data0=n;
  #pragma ASM  
        
        
  DEL0: MOV R6,#20
  DEL1: MOV R5,#250
        DJNZ R5,$
        DJNZ R6,DEL1
        DJNZ data0?041,DEL0   //??????????
          
  #pragma ENDASM   
}

void initial(void)
{
   P1=0xff;
   P0=0x7f;
   P2=0xff;
   IE=0x8c;  //T0不中断
   IP=0xe9;  //int0最高,T1次之
   TMOD=0x15;//T0方式1对T1脚计数,T1方式1定时中断
   SCON=0x00;//串行口方式0
   EA=1;
   TH0=0x00;
   TL0=0x00;
   TH1=0xf8; //0xffff-0x07d0;
   TL1=0X2f;
   TR0=1;
   TR1=1;
}
void int_t1(void) interrupt 3//2MS定时中断,程序约执行60us
{
   time0++;
   if(time0>0x01f4)
   {
      miao++;      //总时间加1*2MS
	  time0=0x0000;
   } 
 
   htime++;   
   if(direct==1)
   {
      if(htime<hdata) //hdata不得大于20
      {
         _qq=0;
         _hh=1;
      }
      else
      {
         _qq=1;
         _hh=1;
      }

      if(htime>0x14) htime=0x00;      

   }
   else
   {
     if(htime<hdata) 
      {
         _qq=1;
         _hh=0;
      }
      else
      {
         _qq=1;
         _hh=1;
      }

      if(htime>0x14) htime=0x00;      

   }
   
   TH1=0xf8; //0xffff-0x07d0;
   TL1=0X2f;   
   TR1=1;
}
void display(BYTE data0,BYTE data1,BYTE data2,BYTE data3) //发送显示码子函数
{ 
   _k7seg=1;   
   SBUF=discode0[data0];
   do
   {}  
   while(TI==0);
   TI=0;
   
   SBUF=discode0[data1]; 
   do
   {} 
   while(TI==0);
   TI=0;

   SBUF=discode0[data2]; 
   do
   {} 
   while(TI==0);
   TI=0;
    
   SBUF=discode0[data3]; 
   do
   {} 
   while(TI==0);
   TI=0;

   _k7seg=0;
}
void tobcd(unsigned int xx) //不大于9999的整数去位值函数,大约用160US
{
   unsigned int temp0=0x0000,temp1=0x0000;
   if(xx<0x270f)
   {
      bit3=xx/1000;
	  temp0=xx-1000*bit3;
	  bit2=temp0/100;
	  temp1=temp0-bit2*100;
	  bit1=temp1/10;
	  bit0=temp1-bit1*10;
   }
   else return;
}
void getjuli()
{      
  #pragma ASM  	
	MOV  	cishu,TH0
	MOV  	cishu+01H,TL0
  #pragma ENDASM
  juli=cishu*LL0; //计算路程
}
void main(void)
{
	initial();
	hdata=0x00;
	tobcd(0x04d2);
	display(bit0,bit1,bit2,bit3);
	for(i=0;i<0x08;i++)
	{
		
		delay10ms(0x30);
		_speak=!_speak;
		P0=0x00;
		delay10ms(0x30);
		_speak=!_speak;
			P0=0xff;
	}
	_qzled=0;
	_qyled=0;
	_juliled=0;
	//开始启动,出发
	direct=1;
	hdata=0x0a;
	//
		
	

⌨️ 快捷键说明

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