|
#include <reg52.h>
#include <string.h>
/************************************位定義************************************/
sbit echo = P2^0; //回聲接收端口
sbit trig = P2^1; //超聲觸發(fā)端口
sbit wei1=P2^4;
sbit wei2=P2^5;
sbit wei3=P2^6;
sbit wei4=P2^7;
/************************************宏定義************************************/
#define dula P0 //段選信號(hào)的鎖存器控制
#define uchar unsigned char
#define uint unsigned int
/********************************定義變量和數(shù)組********************************/
long int distance=0; //距離變量
uchar count;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef,0x71};
unsigned char SendData[32] = {0x00}; //發(fā)送數(shù)據(jù)包
/******************************************************************************/
/* 函數(shù)名稱 : delay */
/* 函數(shù)描述 : 延時(shí)函數(shù) */
/* 輸入?yún)?shù) : 延時(shí)時(shí)間(ms) */
/* 返回值 : 無(wú) */
/******************************************************************************/
void delay(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--) //i=xms即延時(shí)約xms毫秒
for(j=112;j>0;j--);
}
/******************************************************************************/
/* 函數(shù)名稱 : display */
/* 函數(shù)描述 : 數(shù)碼管顯示函數(shù) */
/* 輸入?yún)?shù) : 測(cè)試距離值的十倍 */
/* 返回值 : 無(wú) */
/******************************************************************************/
void display(long int num) //顯示程序
{
uchar qian,bai,shi,ge;
if((num>5000)||(num == 0))
{
qian=15;//距離值上為百位
bai=15;
shi=10;
ge=15;
}
else
{
qian=num/1000;//距離值上為百位
bai=(num/100)%10;//距離值上為十位
shi=(num/10)%10;//距離值上為個(gè)位,并且顯示時(shí)需要加小數(shù)點(diǎn)
ge=num%10;//距離值上為小數(shù)位,并已經(jīng)四舍五入
}
wei1=1; //顯示千位
wei2=0;
wei3=0;
wei4=0;
P0=table[qian];
delay(2);
wei1=0; //顯示百位
wei2=1;
wei3=0;
wei4=0;
P0=table[bai];
delay(2);
wei1=0; //顯示十位
wei2=0;
wei3=1;
wei4=0;
P0=table1[shi];
delay(2);
wei1=0; //顯示個(gè)位
wei2=0;
wei3=0;
wei4=1;
P0=table[ge];
delay(2);
}
/******************************************************************************/
/* 函數(shù)名稱 : Init_timer2 */
/* 函數(shù)描述 : 初始化單片機(jī)函數(shù) */
/* 輸入?yún)?shù) : 無(wú) */
/* 參數(shù)描述 : 無(wú) */
/* 返回值 : 無(wú) */
/******************************************************************************/
void Init_timer0(void)
{
TMOD |= 0x01; //定時(shí)器0初始化,設(shè)置為16位自動(dòng)重裝模式
TL0 = 0x66;
TH0 = 0xfc; //1ms
ET0 = 1; //開(kāi)定時(shí)器2
EA = 1; //總中斷使能
}
/******************************************************************************/
/* 函數(shù)名稱 : Init_Parameter */
/* 函數(shù)描述 : 初始化參數(shù)和IO口函數(shù) */
/* 輸入?yún)?shù) : 無(wú) */
/* 參數(shù)描述 : 無(wú) */
/* 返回值 : 無(wú) */
/******************************************************************************/
void Init_Parameter(void)
{
echo = 0;
trig = 0;
count = 0;
distance = 0;
}
/******************************************************************************/
/* 函數(shù)名稱 : Trig_SuperSonic */
/* 函數(shù)描述 : 發(fā)出聲波函數(shù) */
/* 輸入?yún)?shù) : 無(wú) */
/* 參數(shù)描述 : 無(wú) */
/* 返回值 : 無(wú) */
/******************************************************************************/
void Trig_SuperSonic(void)//出發(fā)聲波
{
trig = 1;
delay(1);
trig = 0;
}
/******************************************************************************/
/* 函數(shù)名稱 : Measure_Distance */
/* 函數(shù)描述 : 計(jì)算距離函數(shù) */
/* 輸入?yún)?shù) : 無(wú) */
/* 參數(shù)描述 : 無(wú) */
/* 返回值 : 無(wú) */
/******************************************************************************/
void Measure_Distance(void)
{
uchar l;
uint h,y;
TR0 = 1;
while(echo)
{
;
}
TR0 = 0;
l = TL0;
h = TH0;
y = (h << 8) + l;
y = y - 0xfc66;//us部分
distance = y + 1000 * count;//計(jì)算總時(shí)間 (us)
TL0 = 0x66;
TH0 = 0xfc;
delay(30);
distance = 0.17 * distance;//
}
/******************************************************************************/
/* 函數(shù)名稱 : init_com */
/* 函數(shù)描述 : 串口初始化函數(shù) */
/* 輸入?yún)?shù) : 無(wú) */
/* 參數(shù)描述 : 無(wú) */
/* 返回值 : 無(wú) */
/******************************************************************************/
void init_com(void)
{
EA=1; //開(kāi)總中斷
ES=1; //允許串口中斷
ET1=1; //允許定時(shí)器T1的中斷
TMOD|=0x20; //定時(shí)器T1,在方式2中斷產(chǎn)生波特率
PCON=0x00; //SMOD=0
SCON=0x50; // 方式1 由定時(shí)器控制
TH1=0xfd; //波特率設(shè)置為9600
TL1=0xfd;
TR1=1; //開(kāi)定時(shí)器T1運(yùn)行控制?
}
/******************************************************************************/
/* 函數(shù)名稱 : PutString */
/* 函數(shù)描述 : 串口發(fā)送函數(shù) */
/* 輸入?yún)?shù) : 數(shù)組 */
/* 參數(shù)描述 : char類型字符串 */
/* 返回值 : 無(wú) */
/******************************************************************************/
void PutString(unsigned char *TXStr)
{
ES=0;
while(*TXStr!=0)
{
SBUF=*TXStr;
while(TI==0);
TI=0;
TXStr++;
}
ES=1;
}
/******************************************************************************/
/* 函數(shù)名稱 : main */
/* 函數(shù)描述 : 主函數(shù) */
/* 輸入?yún)?shù) : 無(wú) */
/* 參數(shù)描述 : 無(wú) */
/* 返回值 : 無(wú) */
/******************************************************************************/
void main(void)
{
uchar a;
init_com();
Init_timer0();
Init_Parameter();
while(1)
{
Trig_SuperSonic(); //觸發(fā)超聲波發(fā)射
while(echo == 0) //等待回聲
{
;
}
Measure_Distance(); //計(jì)算脈寬并轉(zhuǎn)換為距離
for(a=100;a>0;a--)
{
display(distance);
}
//組裝發(fā)送超聲波到上位機(jī)
memset(SendData, 0x00, sizeof(SendData));
memcpy(SendData, "$51,CSB", sizeof("$51,CSB"));
SendData[7] = distance / 1000 + '0';
SendData[8] = distance % 1000 / 100 + '0';
SendData[9] = distance % 100 / 10 + '0';
SendData[10] = '.';
SendData[11] = distance % 10 + '0';
SendData[12] = '#';
SendData[13] = 0x00;
PutString(SendData);
Init_Parameter(); // 參數(shù)重新初始化
}
}
/******************************************************************************/
/* 函數(shù)名稱 : timer0 */
/* 函數(shù)描述 : T0中斷處理函數(shù) */
/* 輸入?yún)?shù) : 無(wú) */
/* 參數(shù)描述 : 無(wú) */
/* 返回值 : 無(wú) */
/******************************************************************************/
void timer0 (void) interrupt 1
{
TF0 = 0;
TL0 = 0x66;
TH0 = 0xfc;
count++;
if(count == 18)//超聲波回聲脈寬最多18ms
{
TR0 =0;
TL0 = 0x66;
TH0 = 0xfc;
count = 0;
}
}
/******************************************************************************/
|
|