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

📄 text2.c

📁 单片机超声波测距程序源代码,38KHZ,可以4M
💻 C
字号:
/*-------------------------------------
超声波测距单片C程序
MCU  AT89S52 XAL 12M
2006.8.21   by maozhen
增加EEPROM存储功能,测量过程中键1存,键2读
--------------------------------------*/
#include<AT89X52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define Sda P1_2 /*串行数据*/
#define Scl P1_1  /*串行时钟*/
#define WriteRom P1_5
#define ReadRom  P1_4
data uchar ramnum=0;
extern void transmit(void);
extern void display(void);

//sfr WDTRST  = 0xA6;
//sfr AUXR    = 0X8E;
data uchar testok;
data ulong time;
data uchar dispram[3]={1,1,1};
const unsigned char LED7Code[]={
	0x14,		// 0
    0x77,		// 1
    0x4C,		// 2
	0x45,		// 3
	0x27,		// 4
	0x85,		// 5
	0x84,		// 6
	0x57,		// 7
	0x04,		// 8
	0x05,		// 9
    0x8e,       // F
    0x8C,		// E
    0x12,       // n
    0x64,		// D
                                 };
const uchar dispbit[]={
  0xfe,    //bit1
  0xfb,    //bit2
  0xef,    //bit3
                };

  extern void delay(uint t)
  {
  uint n,j;
   for (n=0;n<t;n++)
   for (j=0; j<10;j++);
   }

/*void supplydog(void)
 {
  EA=0;
  WDTRST=0x1E;
  WDTRST=0xE1;
  EA=1;
 }
*/
extern void mDelay(uint Delay)
{ uint i;
for(;Delay>0;Delay--)
{ for(i=0;i<124;i++)
{;}
  //supplydog();
}
}

/*发送起始条件*/
void Start(void) /*起始条件*/
{
Sda=1;
Scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
Sda=0;
_nop_();
_nop_();
_nop_();
_nop_();
}

void Stop(void) /*停止条件*/
{
Sda=0;
Scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
Sda=1;
_nop_();
_nop_();
_nop_();
_nop_();
}

void Ack(void) /*应答位*/
{
Sda=0;
_nop_();
_nop_();
_nop_();
_nop_();
Scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
Scl=0;
}

void NoAck(void) /*反向应答位*/
{
Sda=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Scl=1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
Scl=0;
}

void Send(uchar Data) /*发送数据子程序,Data为要求发送的数据*/
{
uchar BitCounter=8; /*位数控制*/
uchar temp; /*中间变量控制*/
//supplydog();
do
{
temp=Data;
Scl=0;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ ();
if((temp&0x80)==0x80)/* 如果最高位是1*/
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1; /*RLC*/
Data=temp;
BitCounter--;
}while(BitCounter);
Scl=0;
}

uchar Read(void) /*读一个字节的数据,并返回该字节值*/
{
uchar temp=0;
uchar temp1=0;
uchar BitCounter=8;
Sda=1;
//supplydog();
do{
Scl=0;
_nop_();
_nop_();
_nop_();
_nop_();
Scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
if(Sda)
temp=temp|0x01; /*temp的最低位置1*/
else
temp=temp&0xfe; /*否则temp的最低位清0*/
if(BitCounter-1)
{ temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}while(BitCounter);
return(temp);
}

void WrToROM(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start(); /*发送启动信号*/
Send(0xa0); /*发送SLA+W*/
Ack();
Send(Address+i); /*发送地址*/
Ack();
Send(*(PData+i));
Ack();
Stop();
mDelay(20);
}
}

void RdFromROM(uchar Data[],uchar Address,uchar Num)
{
uchar i;
uchar *PData;
PData=Data;
for(i=0;i<Num;i++)
{
Start();
Send(0xa0);
Ack();
Send(Address+i);
Ack();
Start();
Send(0xa1);
Ack();
*(PData+i)=Read();
Scl=0;
NoAck();
Stop();
}
}

void testkey(void)
{
uchar j,k,temp1[1],temp[30]; 
uint  i1=0,i;
//supplydog();
 if((!WriteRom)|(!ReadRom))
    {
     if (WriteRom==0)
        {mDelay(50);
         if (WriteRom==0)
            {
			 WrToROM(dispram,ramnum,3);   //一次写入三个数据
             ramnum=ramnum+3;
			 }
        }
      else if (ReadRom==0)
       {mDelay(50);
        if (ReadRom==0)
            { 
             
		         for(i=0;i<ramnum;i++)
                   {
				    RdFromROM(temp1,i,1);
				    temp[i]=temp1[0];
                    }
              for(k=0;k<ramnum/3;k++)     //逐个显示记录的数据
               {
			          for(j=0;j<3;j++)
			             {dispram[j]=temp[i1++];}
			          for(i=0;i<5000;i++)
			             {display();}
				}
             }
             dispram[0]=11;              //记录显示结束,“END
             dispram[1]=12;
             dispram[2]=13;       
        for(i=0;i<1000;i++)
           {display();}
	     }
     }
}

/* main  */
void main(void)
 {
 data uint k;
 ramnum=0;
 //supplydog();
// AUXR = 0x08;
 P0 = 0xFF;
 P1 = 0xFD;
 P3 = 0xFF;
 P2 = 0x8e;
TMOD=0x21;    //timer1 mode2,timer0 mode1
RCAP2H=0xff;    //65536-75
RCAP2L=0xb5;
TH2   =0xff;
TL2   =0xB5;
TH0=0x0;
TL0=0x0;
T2MOD=0x02;    //T2作为CLK输出40k
T2CON=0x00;    //no打开TIMER2
P1_3 =1;

while(1)
 {
//supplydog();
EA=0;
RCAP2H=0xff;    //65536-75
RCAP2L=0xb5;
TH2   =0xff;
TL2   =0xB5;
TH0=0x0;
TL0=0x0;
T2MOD=0x02;    //T2作为CLK输出40k
T2CON=0x00;    //no打开TIMER2
TMOD=0x21;
P1_3 =1;
EX0=0;
EA=1;
transmit();
testok=0;
 while (!testok) display();
 if(1==testok)
   {
   time=TH0;
   time=(time<<8)|TL0;
   //supplydog();
   TH0=0;
   TL0=0;
   time*=172;
   time/=10000;
   time+=6;
   dispram[2]=(uchar)(time%10); //个位

   dispram[1]=(uchar)((time/10)%10);//十位

   dispram[0]=(uchar)(time/100);  //百位
   //supplydog();
   } else
   {
   dispram[0]=10;
   dispram[1]=10;
   dispram[2]=10;
   }
  EA=0;
   for (k=0;k<150;k++)
   display();  //500
   testkey();
  EA=1;
  }
 }


 /*超声波接蕆eceive*int)*/
 void receive(void) interrupt 0
 {
 TR2=0;
 TR0=0;
 ET0=0;
 EX0=0;
 testok=1;
 //supplydog();
 }

 /*超时清除程序(内中断T0 YICHU)*/
 void overtime(void) interrupt 1
 {

  testok=0;
   TR2=0;
  EX0=0;
  TR0=0;
  ET0=0;
  testok=2;
  //supplydog();
  }

 void transmit(void)
 {
 	EX0=0;
 	IE0=0;
  //supplydog();
  testok=0;
  TH0=0;
  TL0=0;
  //P1_3 =0;  ////and输入端,抑制发送?
  TR2 =1;  //start timer2
  TR0=1;   //T0开始记述
  delay(1);
  TR2=0;
  
  testok=0;
  P1_0=0;  //接电容的发射脚为0,发射器上两边0
  delay(5);  //delay(1)
  //P1_3 =1;  //
  IE0=0;
  EX0=1;    //开外中断
  ET0=1;    //T0 INT ON
  testok=0;
  //supplydog();
  }


void display(void)
{   int i;
   for( i=0;i<3;i++)
  {
   P2=LED7Code[dispram[i]];
   P0=dispbit[i];
   delay(3);
   //supplydog();
  };
 
}

⌨️ 快捷键说明

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