📄 text2.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 + -