|
#include <reg52.h>
#include <intrins.h>
#include <STDIO.H>
#define uint unsigned int
#define uchar unsigned char
sbit RX=P2^1;
sbit TX=P2^0; //超聲波
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P3^7; //數(shù)碼管位選
sbit rs=P2^4; //1602的數(shù)據(jù)/指令選擇控制線
sbit rw=P2^5; //1602的讀寫控制線
sbit en=P2^6; //1602的使能控制線
sbit buzzer=P2^7; //蜂鳴器
/* 超聲波 */
uchar count; //中斷累加變量
long int distance; //測量所得距離
unsigned char code table[ ]={"0123456789"}; //定義字符數(shù)組顯示數(shù)字
#define GPIO_DIG P0
//--定義全局變量--//
unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼
unsigned char disbuff[4] ={ 0,0,0,0,};
/*------------------------------------------------
延時函數(shù)
------------------------------------------------*/
void delay(uint n)
{
uint x,y;
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
/*------------------------------------------------
延時函數(shù)
------------------------------------------------*/
void delayt(uint x)
{
uchar j;
while(x-- > 0)
{
for(j = 0;j < 125;j++)
{
;
}
}
}
/*------------------------------------------------
定時器0初始化,用于計算響應(yīng)信號時間
------------------------------------------------*/
void init_t0()
{
TMOD=0x01;
TL0=0x66;
TH0=0xfc; //1ms
ET0=1;
EA=1;
}
/*------------------------------------------------
超聲波模塊觸發(fā)信號
------------------------------------------------*/
void trigger()
{
TX=1;
delayt(1);
TX=0;
}
/*------------------------------------------------
超聲波模塊相應(yīng)端口初始化函數(shù)
------------------------------------------------*/
void init_measuring()
{
TX=0;
RX=0;
count=0;
}
/*------------------------------------------------
超聲波模塊距離測試函數(shù)
------------------------------------------------*/
void measuring()
{
uchar l;
uint h,y;
TR0 = 1;
while(RX)
{
;
}
TR0 = 0;
l = TL0;
h = TH0;
y = (h << 8) + l;
y = y - 0xfc66;//us部分
distance = y + 1000 * count;//計算總時間,單位是微秒
TL0 = 0x66;
TH0 = 0xfc;
delayt(30);
distance = 3453* distance / 20000;//原始為:(0.34毫米/us)*時間/2//
}
/********************LCD****************************/
/*------------------------------------------------
1602寫命令函數(shù)
------------------------------------------------*/
void lcd_wcom(uchar com)
{
rs=0; //選擇指令寄存器
rw=0; //選擇寫
P1=com; //把命令字送入P0
delay(5); //延時一小會兒,讓1602準(zhǔn)備接收數(shù)據(jù)
en=1; //使能線電平變化,命令送入1602的8位數(shù)據(jù)口,這點非常重要
en=0;
}
/*------------------------------------------------
1602寫數(shù)據(jù)函數(shù)
------------------------------------------------*/
void lcd_wdat(uchar dat)
{
rs=1; //選擇數(shù)據(jù)寄存器
rw=0; //選擇寫
P1=dat; //把要顯示的數(shù)據(jù)送入P0
delay(5); //延時一會兒,讓1602準(zhǔn)備接收數(shù)據(jù),也是檢測忙信號,這點非常重要
en=1; //使能線電平變化,數(shù)據(jù)送入1602的8位數(shù)據(jù)口
en=0;
}
/*------------------------------------------------
1602初始化函數(shù)
------------------------------------------------*/
void lcd_init()
{
lcd_wcom(0x38); //8位數(shù)據(jù),雙列,5*7字形 ,用到功能設(shè)定指令
lcd_wcom(0x0c); //開啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍,用到顯示開關(guān)控制指令
lcd_wcom(0x06); //顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位,用到了寫入模式設(shè)置指令
lcd_wcom(0x01); //清屏,用到了清屏指令
}
/*------------------------------------------------
1602顯示固定字符函數(shù)
------------------------------------------------*/
void lcd_xianshi()
{
lcd_wcom(0x80+0x40);
lcd_wdat('D');
lcd_wdat('i');
lcd_wdat('s');
lcd_wdat('t');
lcd_wdat('a');
lcd_wdat('n');
lcd_wdat('c');
lcd_wdat('e');
lcd_wdat(':');
lcd_wcom(0x80+0x4c);
lcd_wdat('.');
lcd_wcom(0x80+0x4e);//單位是厘米//
lcd_wdat('c');
lcd_wdat('m');
}
/*------------------------------------------------
超聲波模塊測量結(jié)果LCD顯示函數(shù)
------------------------------------------------*/
void display(uint x)
{
uchar qian,bai,shi,ge;
qian=x/1000;
bai=(x/100)%10;
shi=(x/10)%10;
ge=x%10;
lcd_wcom(0x80+0x49);//單位是厘米//
lcd_wdat(table[qian]);
lcd_wdat(table[bai]);
lcd_wdat(table[shi]);
lcd_wcom(0x80+0x4d);
lcd_wdat(table[ge]);
}
/*------------------------------------------------
LCD主函數(shù)
------------------------------------------------*/
void LCD()
{ //uint i;
lcd_init(); //液晶初始化
init_t0(); //定時器0初始化
init_measuring(); //超聲波相應(yīng)端口初始化
while(1)// for(i=0;i<1;i++)
{ lcd_xianshi(); //液晶顯示特定字符
trigger(); //觸發(fā)超聲波啟動
while(RX==0) //等待回聲
{
;
}
measuring(); //進行距離測量
display(distance); //對測量結(jié)果進行顯示
init_measuring(); //超聲波相應(yīng)端口初始化
delayt(60); //每次測量間隔60ms
}
}
/**********************蜂鳴器*************************************/
/***********蜂鳴器響應(yīng)函數(shù)*********/
void Conut1(uint x)
{
if(x>=42000) //超出測量
{
buzzer=1;
}
else
{
buzzer=1;
delayt(x); //printf("S=%fCM\n",S);
buzzer=0;
delayt(x);
}
}
/*************蜂鳴器主函數(shù)***********/
void Buzzer()
{ //uint i;
init_t0(); //定時器0初始化
init_measuring(); //超聲波相應(yīng)端口初始化
//for(i=0;i<1;i++)
while(1)
{
trigger(); //觸發(fā)超聲波啟動
while(RX==0) //等待回聲
{
;
}
measuring(); //進行距離測量
Conut1(distance); //對測量結(jié)果進行顯示
init_measuring(); //超聲波相應(yīng)端口初始化
delayt(60); //每次測量間隔60ms
}
}
/****************數(shù)碼管******************/
/*******************************************************************************
函 數(shù) 名 : DigDisplay
* 函數(shù)功能 : 使用數(shù)碼管顯示
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void DigDisplay()
{
uchar i;
uint j;
for(i=1;i<4;i++)
{
switch(i) //位選,選擇點亮的數(shù)碼管,
{
case(1):
LSA=0;LSB=1;LSC=1;break;//顯示第1位
case(2):
LSA=1;LSB=0;LSC=1; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
//case(4):
// LSA=1;LSB=1;LSC=1;LSD=0; break;//顯示第3位
}
GPIO_DIG=disbuff[i];//發(fā)送段碼
j=10; //掃描間隔時間設(shè)定
while(j--);
GPIO_DIG=0x00;//消隱
}
}
/*****************數(shù)碼管顯示函數(shù)*******************/
void Conut3(uint x)
{
if(x>=42000) //超出測量范圍顯示“ERR0”
{
disbuff[0]=0x3f; //“-”
disbuff[1]=0x50; //“-”
disbuff[2]=0x50; //“-”
disbuff[3]=0x79; //“-”
}
else
{
disbuff[3]=DIG_CODE[x%10000/1000];
disbuff[2]=DIG_CODE[x%1000/100];
disbuff[1]=DIG_CODE[x%100/10];
disbuff[0]=DIG_CODE[x%10/1];
}
}
/****************數(shù)碼管***********************/
void SMG()
{
//uint i;
init_t0(); //定時器0初始化
init_measuring(); //超聲波相應(yīng)端口初始化
//for(i=0;i<1;i++)
while(1)
{
trigger(); //觸發(fā)超聲波啟動
while(RX==0) //等待回聲
{
;
}
measuring(); //進行距離測量
DigDisplay();
Conut3(distance); //對測量結(jié)果進行顯示
init_measuring(); //超聲波相應(yīng)端口初始化
delayt(60); //每次測量間隔60ms
}
}
/*……………………………………………中斷服務(wù)函數(shù)…………………………*/
void T_0()interrupt 1
{
TF0 = 0;
TL0 = 0x66;
TH0 = 0xfc;
count++;
if(count==18)
{
TR0 =0;
TL0 = 0x66;
TH0 = 0xfc;
count = 0;
}
}
/***********************藍牙********************************/
void UART_Init(void)
{
TMOD &= 0x0f; // 清空定時器1
TMOD |= 0x20; // 定時器1工作于方式2
TH1 = 0xfd; // 為定時器1賦初值
TL1 = 0xfd; // 等價于將波特率設(shè)置為9600
ET1 = 0; // 防止中斷產(chǎn)生不必要的干擾
TR1 = 1; // 啟動定時器1
//PS=1;
SCON |= 0x50; // 串口工作于方式1,允許接收
}
void main(void)
{
uchar X;
UART_Init();
while(1)
{
X=SBUF;
while(!RI);
RI=0;
/* switch(X)
{case 'L':
LCD(); break;
case 'S':
SMG(); break;
case 'B':
Buzzer(); break;
} */
//default:break;
if(X=='L')
LCD();
else if(X=='S')
SMG();
else //if(X=='B')
Buzzer();
//else
// {;}
//}
}
}
|
|