?? 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 + -