#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 //段選信號的鎖存器控制
#define uchar unsigned char
#define uint unsigned int
/********************************定義變量和數組********************************/
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ā)送數據包
/******************************************************************************/
/* 函數名稱 : delay */
/* 函數描述 : 延時函數 */
/* 輸入參數 : 延時時間(ms) */
/* 返回值 : 無 */
/******************************************************************************/
void delay(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--) //i=xms即延時約xms毫秒
for(j=112;j>0;j--);
}
/******************************************************************************/
/* 函數名稱 : display */
/* 函數描述 : 數碼管顯示函數 */
/* 輸入參數 : 測試距離值的十倍 */
/* 返回值 : 無 */
/******************************************************************************/
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;//距離值上為個位,并且顯示時需要加小數點
ge=num%10;//距離值上為小數位,并已經四舍五入
}
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; //顯示個位
wei2=0;
wei3=0;
wei4=1;
P0=table[ge];
delay(2);
}
/******************************************************************************/
/* 函數名稱 : Init_timer2 */
/* 函數描述 : 初始化單片機函數 */
/* 輸入參數 : 無 */
/* 參數描述 : 無 */
/* 返回值 : 無 */
/******************************************************************************/
void Init_timer0(void)
{
TMOD |= 0x01; //定時器0初始化,設置為16位自動重裝模式
TL0 = 0x66;
TH0 = 0xfc; //1ms
ET0 = 1; //開定時器2
EA = 1; //總中斷使能
}
/******************************************************************************/
/* 函數名稱 : Init_Parameter */
/* 函數描述 : 初始化參數和IO口函數 */
/* 輸入參數 : 無 */
/* 參數描述 : 無 */
/* 返回值 : 無 */
/******************************************************************************/
void Init_Parameter(void)
{
echo = 0;
trig = 0;
count = 0;
distance = 0;
}
/******************************************************************************/
/* 函數名稱 : Trig_SuperSonic */
/* 函數描述 : 發(fā)出聲波函數 */
/* 輸入參數 : 無 */
/* 參數描述 : 無 */
/* 返回值 : 無 */
/******************************************************************************/
void Trig_SuperSonic(void)//出發(fā)聲波
{
trig = 1;
delay(1);
trig = 0;
}
/******************************************************************************/
/* 函數名稱 : Measure_Distance */
/* 函數描述 : 計算距離函數 */
/* 輸入參數 : 無 */
/* 參數描述 : 無 */
/* 返回值 : 無 */
/******************************************************************************/
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;//計算總時間 (us)
TL0 = 0x66;
TH0 = 0xfc;
delay(30);
distance = 0.17 * distance;//
}
/******************************************************************************/
/* 函數名稱 : init_com */
/* 函數描述 : 串口初始化函數 */
/* 輸入參數 : 無 */
/* 參數描述 : 無 */
/* 返回值 : 無 */
/******************************************************************************/
void init_com(void)
{
EA=1; //開總中斷
ES=1; //允許串口中斷
ET1=1; //允許定時器T1的中斷
TMOD|=0x20; //定時器T1,在方式2中斷產生波特率
PCON=0x00; //SMOD=0
SCON=0x50; // 方式1 由定時器控制
TH1=0xfd; //波特率設置為9600
TL1=0xfd;
TR1=1; //開定時器T1運行控制?
}
/******************************************************************************/
/* 函數名稱 : PutString */
/* 函數描述 : 串口發(fā)送函數 */
/* 輸入參數 : 數組 */
/* 參數描述 : char類型字符串 */
/* 返回值 : 無 */
/******************************************************************************/
void PutString(unsigned char *TXStr)
{
ES=0;
while(*TXStr!=0)
{
SBUF=*TXStr;
while(TI==0);
TI=0;
TXStr++;
}
ES=1;
}
/******************************************************************************/
/* 函數名稱 : main */
/* 函數描述 : 主函數 */
/* 輸入參數 : 無 */
/* 參數描述 : 無 */
/* 返回值 : 無 */
/******************************************************************************/
void main(void)
{
uchar a;
init_com();
Init_timer0();
Init_Parameter();
while(1)
{
Trig_SuperSonic(); //觸發(fā)超聲波發(fā)射
while(echo == 0) //等待回聲
{
;
}
Measure_Distance(); //計算脈寬并轉換為距離
for(a=100;a>0;a--)
{
display(distance);
}
//組裝發(fā)送超聲波到上位機
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(); // 參數重新初始化
}
}
/******************************************************************************/
/* 函數名稱 : timer0 */
/* 函數描述 : T0中斷處理函數 */
/* 輸入參數 : 無 */
/* 參數描述 : 無 */
/* 返回值 : 無 */
/******************************************************************************/
void timer0 (void) interrupt 1
{
TF0 = 0;
TL0 = 0x66;
TH0 = 0xfc;
count++;
if(count == 18)//超聲波回聲脈寬最多18ms
{
TR0 =0;
TL0 = 0x66;
TH0 = 0xfc;
count = 0;
}
}
/******************************************************************************/
|