久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2617|回復: 0
打印 上一主題 下一主題
收起左側

超聲波倒車語音報警

[復制鏈接]
跳轉到指定樓層
樓主

#include "STC12C5A.H"
#include "lcd1602.h"
#include "delay.h"
#include "string.h"
#include "typedef.h"
#include "key.h"
#include "mp3_uart.h"  
#include "24c02.h"

sbit BUZZER = P2^0;   //蜂鳴器
sbit RLED = P1^0;   //紅燈
sbit GLED = P1^1;   //綠燈
sbit TX1=P1^2;
sbit RX1=P1^3;
unsigned char OverFlag=0;
unsigned int  Distance=0;
unsigned int  AlarmDistance=20;
unsigned char AutoFlag=0;

uint  Speed=0;
uint  AlarmSpeed=80;
unsigned char  Page=0;
unsigned int  Pulse=0;  //測速脈沖數
sbit INA=P3^4;
extern unsigned char PlayFlag;
void Timer0_Init(void);  //1毫秒@11.0592MHz
void Timer1_Init(void);     //定時器1初始化
void GetDistance(void);     //超聲波測距
void DistanceCheck(void);   //測距函數
void UART_Init(void);       //串口初始化
void PageInit(void);
void DataLoad(void);
void PageDisplay(void);
void PlayCheck(void)
{
static unsigned char con=0;
static unsigned char T50MS=0;
static unsigned char TINT=0;   
if(KeyVal=='S')
{
  KeyVal=0;
  AutoFlag=(AutoFlag==1)?0:1;
}
if(AutoFlag)
  GLED=0;
else
  GLED=1;
if(AutoFlag)
  con++;

if(con>=80)
{
   con=0;
   MP3_UART_Send_Cmd(0x41,15);  //速度
   if(Speed==0)
   {
     MP3_UART_Send_Cmd(0x41,1);  //速度
   }
   else
   {
    MP3_UART_Send_Cmd(0x41,Speed/10+1);  //速度
    MP3_UART_Send_Cmd(0x41,Speed%10+1);  //速度
   }
/*--------------------------------------------------------*/
    MP3_UART_Send_Cmd(0x41,14);  //距離
    MP3_UART_Send_Cmd(0x41,Distance/100+1);  
    MP3_UART_Send_Cmd(0x41,12);  //點
    MP3_UART_Send_Cmd(0x41,Distance%100/10+1);  
    MP3_UART_Send_Cmd(0x41,Distance%10+1);  
    MP3_UART_Send_Cmd(0x41,13);  
/*----------------------------------------------------------*/
}
/*----------------------------小于50每10里面播報一次------------------------------------------------*/
if((TINT==0)&&(Distance%10==0)&&(Distance<51)&&(Distance>0))
{
    MP3_UART_Send_Cmd(0x41,14);  //距離
    MP3_UART_Send_Cmd(0x41,Distance/100+1);  
    MP3_UART_Send_Cmd(0x41,12);  //點
    MP3_UART_Send_Cmd(0x41,Distance%100/10+1);  
    MP3_UART_Send_Cmd(0x41,Distance%10+1);  
    MP3_UART_Send_Cmd(0x41,13);
    TINT=1;
}
if(TINT>0)
{
  TINT++;
  if(TINT>=30)
   TINT=0;
}
/*------------------------距離太近請停車播報---------------------------------------*/
if((Distance<=10)&&(T50MS==0)&&(Distance>0))
{
  MP3_UART_Send_Cmd(0x41,16);  
  T50MS=1;
}
if(T50MS>0)
{
  T50MS++;
  if(T50MS>=20)
   T50MS=0;
}
if((Distance<AlarmDistance)&&(Distance>0))
{
  BUZZER=0;
  RLED=0;
}
else
{
  BUZZER=1;
  RLED=1;
}
}

void main(void)
{
  Delay_1ms(500);
  LCD_Init();    //LCD顯示初始化
  PageInit();    //頁面顯示初始化
  Timer0_Init();   //計數器0初始化
  Timer1_Init();   //定時器1初始化
  DataLoad();    //報警數據讀出
  UART_Init();     //串口初始化
  MP3_UART_SetVic(23);
  Delay_1ms(200);
  MP3_UART_SetVic(23);
  while(1)
  {
  PageDisplay();    //頁面顯示
  PlayCheck();
  GetDistance();
  Delay_1ms(50);    //延時50毫秒
  }
}

void UART_Server() interrupt 4   //串口接收中斷
{
    unsigned char ch=0;
    EA=0;
if(RI)
    {  
   ch = SBUF;
   if(ch=='S'||ch=='T'||ch=='P')
   PlayFlag=0;  
   RI = 0;
    }
EA=1;
}

void Timer0_ISR(void) interrupt 1   //1毫秒@11.0592MHz
{
static unsigned char sta=0;
static unsigned int  T1MS=0;
static unsigned char KS=0;
TL0 = 0xCD;  //設置定時初值
TH0 = 0xD4;  //設置定時初值
T1MS++;
if(T1MS>=1000)
{
  T1MS=0;
  Speed=Pulse/2;
  Pulse=0;
}
/*--------------------------------------------*/
KS++;
if(KS>=20)
{
  KS=0;
  KEY_Scan();
}
/*---------------------------------------------*/
switch(sta)
{
/*------------------------------------------*/
  case 0:
    {
     if(INA==0)
     sta=1;
   else
     sta=0;
    }break;
/*------------------------------------------*/
  case 1:
    {
     if(INA==0)
   {
     sta=2;
     Pulse++;
   }
   else
     sta=0;
    }break;
/*------------------------------------------*/
  case 2:
    {
     if(INA==0)
     sta=2;
   else
     sta=0;
    }break;
  default:sta=0;break;
}
/*----------------------------------------------*/
}

void Timer0_Init(void)  //1毫秒@11.0592MHz
{
AUXR |= 0x80;  //定時器時鐘1T模式
TMOD &= 0xF0;  //設置定時器模式
TMOD |= 0x01;  //設置定時器模式
TL0 = 0xCD;  //設置定時初值
TH0 = 0xD4;  //設置定時初值
TF0 = 0;  //清除TF0標志
TR0 = 1;  //定時器0開始計時
ET0=1;
EA=1;
}

void UART_Init(void)
{
PCON &= 0x7F;  //波特率不倍速
SCON = 0x50;  //8位數據,可變波特率
AUXR |= 0x04;  //獨立波特率發生器時鐘為Fosc,即1T
BRT = 0xDC;  //設定獨立波特率發生器重裝值
AUXR |= 0x01;  //串口1選擇獨立波特率發生器為波特率發生器
AUXR |= 0x10;  //啟動獨立波特率發生器
ES = 1;
EA=1;
}

void Timer1_Init(void)
{
TMOD = (TMOD&0x0f)| 0x10;   
TL1 = 0x00;  //設定定時初值
TH1 = 0x00;  //設定定時器重裝值
ET1 = 1;  //禁止定時器0中斷
TR1 = 0;  //啟動定時器0
EA=1;
}


void DistanceCheck(void)
{
    unsigned int retry=0;
unsigned int time=0;
float S=0;
    TR1 = 0;
    OverFlag=0;
    TX1 = 1;            
    delay_1us(3);
    TX1 = 0;
    while(!RX1);
    TH1=0;
    TL1=0;
    TR1 = 1;
    retry=0;
    while((RX1==1)&&(OverFlag==0)&&(retry<50000))
    {
      retry++;
   delay_1us(1);  
    }
    TR1 = 0;
/*--------------計算---------------------*/
    time=TH1*256+TL1;
    TH1=0;
    TL1=0;
    if(OverFlag==0)     //沒有溢出
    {
        S=(time*1.7)/100;     //算出來是CM
  if(S>300)
  {
   S=0;
  }
    }
    else
    {
      S=0;
    }
Distance=S;
}

void GetDistance(void)
{
  static unsigned char con=0;
  con++;
  if(con>20)
  {
    con=0;
    DistanceCheck();
  }   
}

void DataLoad(void)
{
U16_Read(&AlarmSpeed,0);
Delay_1ms(50);
U16_Read(&AlarmDistance,10);
}

void PageInit(void)
{
LCD_Clr();
switch(Page)
{
/*---------------------------------------------*/
  case 0:  //速度和距離同時顯示
    {
       LCD_DispStr( 0,"Speed:      cm/s");
   LCD_DispStr(16,"Dis:        cm");
    }break;
/*---------------------------------------------*/
  case 1:   //顯示距離  和設置距離
    {
        LCD_DispStr( 0,"Dis:       cm");
   LCD_DispStr(16,"Set:       cm");  
    }break;
/*---------------------------------------------*/
  case 2: //顯示速度 和設置速度
    {
       LCD_DispStr( 0,"Speed:      cm/s");
   LCD_DispStr(16,"Alarm:      cm/s");
    }break;
/*---------------------------------------------*/
  default:break;
}
}

void PageDisplay(void)
{
/*---------------頁面切換----------------*/
if(KeyVal=='E')
{
  KeyVal=0;
  Page++;
  if(Page>2)
    Page=0;
  PageInit();
}
switch(Page)
{
/*---------------------------------------------*/
  case 0://速度和距離同時顯示
    {
     LCD_DispU16( 6,Speed);
   if(Distance>0)
    LCD_DispU16(22,Distance);
      else
       LCD_DispStr(22,"-----");
    }break;
/*---------------------------------------------*/
  case 1: //顯示距離  和設置距離
    {
   if(Distance>0)
    LCD_DispU16( 6,Distance);
      else
       LCD_DispStr(6,"-----");        
     
         LCD_DispU16(22,AlarmDistance);
   if(KeyVal=='+')
   {
    KeyVal=0;
    AlarmDistance++;
    U16_Save(&AlarmDistance,10);
   }
   if(KeyVal=='-')
   {
    KeyVal=0;
    if(AlarmDistance>2)
    AlarmDistance--;
    U16_Save(&AlarmDistance,10);
   }      
     
    }break;
/*---------------------------------------------*/
  case 2:    //顯示速度 和設置速度
    {
            LCD_DispU16( 6,Speed);
      LCD_DispU16(22,AlarmSpeed);
    if(KeyVal=='+')
    {
     KeyVal=0;
     AlarmSpeed++;
     U16_Save(&AlarmSpeed,0);
    }
    if(KeyVal=='-')
    {
     KeyVal=0;
     if(AlarmSpeed>2)
     AlarmSpeed--;
        U16_Save(&AlarmSpeed,0);
    }  
    }break;
/*---------------------------------------------*/
  default:
    {
     Page=0;
   PageInit();
    }break;
}
}












分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天堂影院av | 一区二区在线看 | 日本天堂视频在线观看 | 日日干日日操 | 超碰在线播 | 狠狠综合久久av一区二区小说 | 91精品久久久久久久 | 成人精品一区二区三区 | 久久69精品久久久久久久电影好 | 亚洲欧美日韩精品久久亚洲区 | 成人性视频在线 | 91视频精选 | 久久国产一区二区三区 | 欧美福利 | 免费成人在线网站 | 99热这里有精品 | 婷婷色婷婷 | 国产一区二区小视频 | 国产精品免费大片 | 国产精品毛片久久久久久久 | 国产伦精品一区二区三毛 | 一区二区免费 | 超碰一区二区 | 日韩一级 | 久久综合久久自在自线精品自 | 午夜影院普通用户体验区 | 中文字幕在线观看av | 久久综合久 | 91观看 | 国产伦精品一区二区三区精品视频 | 一区二区三区国产 | 一区二区影视 | 亚洲电影一区二区三区 | av一级久久 | 完全免费av在线 | 日本成人午夜影院 | 欧美一级免费观看 | 欧美在线a| 毛片免费看 | 久操亚洲| 黄色国产视频 |