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

📄 1213.c

📁 超声波测距
💻 C
字号:
/******************************************************************
* 芯片: PIC16F873A *
* 晶振: 4MHz *
* *
* 使用PICC8.05编译器,MPLAB v7.50调试。 *
* *
******************************************************************/
#include <pic.h>
#define uchar unsigned char
#define uint unsigned int
volatile unsigned char i;
uint m,n,y;
uchar x=0;
/**********************************************************
初始化函数:初始化个端口
**********************************************************/
void ioint()
{
 OPTION = 0xc8;//全局控制寄存器
 INTCON = 0xc0;//中断控制
 TRISC = 0x00;//定义RC端口各脚输入输出
 TRISB = 0xc1;
 TRISA = 0x0f;
 PORTC = 0xff;//端口赋值
 //GIE=1;//全局中断使能位
 //RBIE=1;//RB电平变化中断使能位
 //PEIE=1;//外围模块中断使能位
 
}

/**********************************************************
k*1ms延时函数
**********************************************************/

void delay(uint k)
{
  uint t;
  for(;k!=0;k--)
  for(t=110;t!=0;t--);
}
/**********************************************************
实际数字与共阳极数码管显示需要输出到端口的字符转换程序
**********************************************************/
unsigned char numberplay(uint k )
{   unsigned char nu;
  switch(k)
   {
     case 0x00:nu=0xc0;break;
     case 0x01:nu=0xf9;break;
     case 0x02:nu=0xa4;break;
     case 0x03:nu=0xb0;break;
     case 0x04:nu=0x99;break;
     case 0x05:nu=0x92;break;
     case 0x06:nu=0x82;break;
     case 0x07:nu=0xf8;break;
     case 0x08:nu=0x80;break;
     case 0x09:nu=0x90;break;
  
   }
 return nu;

}
  
/********************************************************
主函数
*********************************************************/
main()
{ 
 ioint();
 while(1)
   {  
      x=0;
      delay(200);
      RB4=1;
      RB5=0;
      delay(3);
     //int i;           //在这定义i不可以
   #asm
    movlw 0x0f
    movwf _i            ;将15赋值给C中定义的变量i
    delay1 bcf _PORTB,4 ;使RB4=0 
           bsf _PORTB,5 ;使RB5=1
           nop
           nop
           nop
           nop
           nop
           nop
           nop
           nop
           nop
           nop
           bsf _PORTB,4 ;RB4=1
           bcf _PORTB,5 ;RB5=0
           nop
           nop
           nop
           nop
           nop
           nop
           nop
           nop
           decfsz _i    ;如i-1=0则跳过下一条指令
    goto delay1
           bcf _PORTB,4 ;RB4=0
           bcf _PORTB,5 ;RB5=0
           nop
    #endasm
while(RB0==1){;}        //给电路反应时间
while(RB0==0&&x<58)     //测从发射到余震结束的时间+误差,以100us为单位
   {
    #asm
           movlw 0x17
           movwf _i     ;将23赋值给C中定义的变量i
    delay2 decfsz _i    ;i-1=0则跳过下一条指令
           goto delay2
    #endasm 
    x=x+1;
   }
while(RB0==1&&x<58)     //测声波从发射+返回的时间+误差,以100us为单位
   {
    #asm
           movlw 0x25
           movwf _i     ;将37赋值给C中定义的变量i
    delay3 decfsz _i    ;i-1=0则跳过下一条指令
           goto delay3
    #endasm 
    x=x+1;
   }
  y=x*34/2;            //计算距离
  m=y/100;
  n=(y/10)%10;
  PORTC = numberplay(m);
  RB2=1;
  delay(16); 
  RB2=0;
  PORTC = numberplay(n);
  RB1=1;
  delay(16); 
  RB1=0;
  PORTC = 0xff;
 
  }
}



/****************************************************************/

⌨️ 快捷键说明

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