欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
自己寫的簡單倒車雷達程序,超聲波測距藍牙控制LCD顯示或數碼管顯示或距離越近燈頻...
[打印本頁]
作者:
美猴王HLM
時間:
2017-4-20 19:39
標題:
自己寫的簡單倒車雷達程序,超聲波測距藍牙控制LCD顯示或數碼管顯示或距離越近燈頻...
#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; //數碼管位選
sbit rs=P2^4; //1602的數據/指令選擇控制線
sbit rw=P2^5; //1602的讀寫控制線
sbit en=P2^6; //1602的使能控制線
sbit buzzer=P2^7; //蜂鳴器
/* 超聲波 */
uchar count; //中斷累加變量
long int distance; //測量所得距離
unsigned char code table[ ]={"0123456789"}; //定義字符數組顯示數字
#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,};
/*------------------------------------------------
延時函數
------------------------------------------------*/
void delay(uint n)
{
uint x,y;
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
/*------------------------------------------------
延時函數
------------------------------------------------*/
void delayt(uint x)
{
uchar j;
while(x-- > 0)
{
for(j = 0;j < 125;j++)
{
;
}
}
}
/*------------------------------------------------
定時器0初始化,用于計算響應信號時間
------------------------------------------------*/
void init_t0()
{
TMOD=0x01;
TL0=0x66;
TH0=0xfc; //1ms
ET0=1;
EA=1;
}
/*------------------------------------------------
超聲波模塊觸發信號
------------------------------------------------*/
void trigger()
{
TX=1;
delayt(1);
TX=0;
}
/*------------------------------------------------
超聲波模塊相應端口初始化函數
------------------------------------------------*/
void init_measuring()
{
TX=0;
RX=0;
count=0;
}
/*------------------------------------------------
超聲波模塊距離測試函數
------------------------------------------------*/
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寫命令函數
------------------------------------------------*/
void lcd_wcom(uchar com)
{
rs=0; //選擇指令寄存器
rw=0; //選擇寫
P1=com; //把命令字送入P0
delay(5); //延時一小會兒,讓1602準備接收數據
en=1; //使能線電平變化,命令送入1602的8位數據口,這點非常重要
en=0;
}
/*------------------------------------------------
1602寫數據函數
------------------------------------------------*/
void lcd_wdat(uchar dat)
{
rs=1; //選擇數據寄存器
rw=0; //選擇寫
P1=dat; //把要顯示的數據送入P0
delay(5); //延時一會兒,讓1602準備接收數據,也是檢測忙信號,這點非常重要
en=1; //使能線電平變化,數據送入1602的8位數據口
en=0;
}
/*------------------------------------------------
1602初始化函數
------------------------------------------------*/
void lcd_init()
{
lcd_wcom(0x38); //8位數據,雙列,5*7字形 ,用到功能設定指令
lcd_wcom(0x0c); //開啟顯示屏,關光標,光標不閃爍,用到顯示開關控制指令
lcd_wcom(0x06); //顯示地址遞增,即寫一個數據后,顯示位置右移一位,用到了寫入模式設置指令
lcd_wcom(0x01); //清屏,用到了清屏指令
}
/*------------------------------------------------
1602顯示固定字符函數
------------------------------------------------*/
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');
}
/*------------------------------------------------
超聲波模塊測量結果LCD顯示函數
------------------------------------------------*/
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主函數
------------------------------------------------*/
void LCD()
{ //uint i;
lcd_init(); //液晶初始化
init_t0(); //定時器0初始化
init_measuring(); //超聲波相應端口初始化
while(1)// for(i=0;i<1;i++)
{ lcd_xianshi(); //液晶顯示特定字符
trigger(); //觸發超聲波啟動
while(RX==0) //等待回聲
{
;
}
measuring(); //進行距離測量
display(distance); //對測量結果進行顯示
init_measuring(); //超聲波相應端口初始化
delayt(60); //每次測量間隔60ms
}
}
/**********************蜂鳴器*************************************/
/***********蜂鳴器響應函數*********/
void Conut1(uint x)
{
if(x>=42000) //超出測量
{
buzzer=1;
}
else
{
buzzer=1;
delayt(x); //printf("S=%fCM\n",S);
buzzer=0;
delayt(x);
}
}
/*************蜂鳴器主函數***********/
void Buzzer()
{ //uint i;
init_t0(); //定時器0初始化
init_measuring(); //超聲波相應端口初始化
//for(i=0;i<1;i++)
while(1)
{
trigger(); //觸發超聲波啟動
while(RX==0) //等待回聲
{
;
}
measuring(); //進行距離測量
Conut1(distance); //對測量結果進行顯示
init_measuring(); //超聲波相應端口初始化
delayt(60); //每次測量間隔60ms
}
}
/****************數碼管******************/
/*******************************************************************************
函 數 名 : DigDisplay
* 函數功能 : 使用數碼管顯示
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void DigDisplay()
{
uchar i;
uint j;
for(i=1;i<4;i++)
{
switch(i) //位選,選擇點亮的數碼管,
{
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];//發送段碼
j=10; //掃描間隔時間設定
while(j--);
GPIO_DIG=0x00;//消隱
}
}
/*****************數碼管顯示函數*******************/
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];
}
}
/****************數碼管***********************/
void SMG()
{
//uint i;
init_t0(); //定時器0初始化
init_measuring(); //超聲波相應端口初始化
//for(i=0;i<1;i++)
while(1)
{
trigger(); //觸發超聲波啟動
while(RX==0) //等待回聲
{
;
}
measuring(); //進行距離測量
DigDisplay();
Conut3(distance); //對測量結果進行顯示
init_measuring(); //超聲波相應端口初始化
delayt(60); //每次測量間隔60ms
}
}
/*……………………………………………中斷服務函數…………………………*/
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; // 等價于將波特率設置為9600
ET1 = 0; // 防止中斷產生不必要的干擾
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
// {;}
//}
}
}
作者:
美猴王HLM
時間:
2017-4-20 19:40
但是實現不了,求助大神
作者:
美猴王HLM
時間:
2017-4-20 19:42
坐等大神 O(∩_∩)O謝謝
作者:
zkj2003
時間:
2017-4-23 19:32
一起學習。
作者:
siniscn
時間:
2018-10-4 16:49
沒電路圖啊,數碼管用什么驅動的
作者:
過過過兒
時間:
2018-12-1 16:01
你好,那如果是超聲波和pwm調光結合的話,那應該怎么實現超聲波測到一定的距離使pwm調亮調暗
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1