#include
#include "uart.h"
#include"config.h"
#include "delay.h"
#define uint unsigned int
#define uchar unsigned char
sbit beep=P2^0;//定义喇叭端口
sbit tx=P2^3;//超声波发送
sbit rx=P2^4;//超声波接收
sbit zhendong=P1^1;//震动模块
sbit led=P1^4;//报警指示灯
sbit guangmin=P3^7;//光敏电阻端口
sbit LED1=P1^0; //LED灯端口
sbit relay=P1^7;//继电器输出端口
int t;
long int juli;
u8 code XUNHUAN[]={0x33,0x00}; //循环播放
u8 code start[]={0x7E,0x02,0x01,0xEF}; //播放
u8 code stop[]={0x7E,0x02,0x0E,0xEF}; //停止
void baojing();
void delay(uint z)//延时z ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init_timer0()//初始化定时器0
{
TH0=(65536-5)/256;
TL0=(65536-5)%256;//计时
EA=1;//开总中断
ET0=1;//(enable)允许定时器0工作
}
void timer0() interrupt 1 //定时器0计数过程
{
TH0=(65536-5)/256;
TL0=(65536-5)%256;
t++;
}
void tx_25us(void)//发射25us超声波
{
t=0;//把定时器记的时间清零,方便下一次发送,超声波是不断的发送
TR0=1;//打开定时器0,开始工作
tx=1;//发送方波
while(t<5);//等待发送完毕25us,当t=5时,就是25us了,t=6时,就跳出循环
tx=0;//关闭发送(方波)
TR0=0;//关闭定时器0
t=0;
}
void jieshou()//接收,返回RX高电平时间t
{
t=0;
while(rx==0);//等待接收返回的方波
TR0=1;//启动定时器0开始计数
while(rx==1);//一直接收方波,直到接收完毕
TR0=0;//关闭定时器,此时t=从接收到方波—接收方波完毕
// rx=0;
}
long distance()//计算距离
{
int s;
s=((2*5*t*340.0)/10000.0);//单位厘米
return s;//返回距离
}
void diaoyong(int j)
{
beep=!beep;
while(j--)
{
}
}
void baojing()//蜂鸣器报警
{
if(juli<=10)
beep=0;
else if(juli>10&&juli<50)
diaoyong(1);
else if(juli>=50&&juli<100)
diaoyong(10);
else if(juli>=100&&juli<150)
diaoyong(30);
else if(juli>=150&&juli<200)
diaoyong(50);
else if(juli>=200)
beep=1;
}
void jiance()//led灯自动亮
{
if(guangmin==1) {
relay=0;
LED1=0;
} else {
LED1=1;
relay=1;
}
}
void baojing1()//晚上灯闪烁报警
{
uint i=1;
if(guangmin==1&&juli<=300)
{
led=!led;
while(i--)
{
}
}
}
void baojing2()//距离障碍物一米震动提醒
{
if(juli<=50)
{
zhendong=0;
}
else
{
zhendong=1;
}
}
void main()
{
unsigned char flag = 0; //
TMOD=0x01;//设置定时器0,1工作方式
init_timer0();
Uart1Init();
UART1_SendString(XUNHUAN,2);
delay_ms(200); //加延时可以存取稳定
UART1_SendString(stop,4);
while(1)
{
jiance();
juli=distance();
if(juli <= 50)
{
if(flag == 0)
{
flag = 1;
UART1_SendString(start,4);
}
}
else
{
if(flag)
{
UART1_SendString(stop,4);
flag = 0;
}
}
tx_25us();//放射
jieshou();//接收
distance();
baojing();
baojing1();
baojing2();
}
}
```c
#ifndef __CONFIG_H
#define __CONFIG_H
#define MAIN_Fosc 11059200L //定义主时钟
//sfr AUXR = 0X8E;
//#include "reg52.h"
//sfr AUXR = 0X8E;
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#endif
```c
//延时函数
#include "delay.h"
#include "intrins.h"
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
void delay_ms(u16 ms)
{
u16 i;
for(i=0;iDelay1ms();
}
#ifndef __DELAY_H
#define __DELAY_H
#include "config.h"
void delay_ms(u16 ms);
#endif
#include "uart.h"
#include
#include"config.h"
u16 USART1_RX_STA=0;
xdata u8 USART1_RX_BUF[USART1_MAX_RECV_LEN]; //
void Uart1Init(void) //9600bps@11.05926MHz
{
SCON=0x50;//SM01=01;REN=1
PCON|=0x00;
RCAP2H=0xFF;
RCAP2L=0xDC;//设置波特率为9600
T2CON=0x34;//将定时器2设置为波特率发生器(接收和发送都用Timer2)
// ES=1;
EA=1;
TR2 = 1;
}
/*----------------------------
UART1 发送串口数据
-----------------------------*/
void UART1_SendData(u8 dat)
{
// ES=0; //关串口中断
SBUF=dat;
while(TI!=1); //等待发送成功
TI=0; //清除发送中断标志
// ES=1; //开串口中断
}
/*----------------------------
UART1 发送字符串
-----------------------------*/
void UART1_SendString(unsigned char *s,unsigned int len)
{
unsigned int i=0;
for(i=0;iUART1_SendData(s[i]);//发送当前字符
}
}
/*******************************************************************************
* 函数名 : Uart1
* 描述 : 串口1中断服务入口函数
* 输入 :
* 输出 :
* 返回 :
* 注意 :
******************************/
void Uart1_INTER() interrupt 8
{
if (RI)
{
RI=0;
}
if (TI)
{
TI=0; //清除S2TI位
}
}
#ifndef __UART_H__
#define __UART_H__
extern unsigned int USART1_RX_STA;
void Uart1Init(void);
void UART1_SendData(unsigned char dat);
//void UART1_SendString(char *s);
void UART1_SendString(unsigned char *s,unsigned int len);
#define USART1_MAX_RECV_LEN 50 //
extern xdata unsigned char USART1_RX_BUF[USART1_MAX_RECV_LEN];
extern unsigned int USART1_RX_STA;
#endif
你的意思是例程不能用?建议一个一个模块去调试,然后线接的对不对。