#include
#include
#include
#define Data 3
#define In 3
#define Out 1
#define Neuron 10
sbit PIN_RXD = P3^0;
sbit PIN_TXD = P3^1;
//接收引脚定义
//发送引脚定义
sbit LED = P0^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char dis[8]={0,0,0,0,0,0,0,0};
int d=0;
unsigned int dist[10] ;
int i=0;
int dt=0;
double di=0,db=0,dbi=0,vb=0,a=0,delta;
double dn[3]={0,0,0};
double t;
//指示当前状态为接收还是发送
//接收结束标志
//发送结束标志
bit RxdOrTxd = 0;
bit RxdEnd = 0;
bit TxdEnd = 0;
unsigned char RxdBuf = 0;
unsigned char TxdBuf = 0;
//接收缓冲器
//发送缓冲器
double
Minin[In]={76,24,144},Maxin[In]={218,78,432},Minout[Out]={0.439},Maxout[Out]={1.417};
double w[Neuron][In]={{-0.232000,-0.185642,-0.1358861},
{-0.681412,-0.717014,-0.660924},
{-0.084507,-0.245672,-0.010917}};
double
v[Out][Neuron]={0.654352,-0.135352,0.105220,0.385471,0.301455,-1.314857,0.409944,-1.1175
85,0.617618,0.979569};
double dat[3];
double tn;
void ConfigUART(unsigned int baud);
void StartTXD(unsigned char dat);
void StartRXD();
double control(double f[]);
//配置波特率为 9600
void main()
{
//开总中断
EA = 1;
ConfigUART(57600);
ENLED = 0;
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
while (1)
{
while (PIN_RXD);
StartRXD();
while (!RxdEnd);
//等待接收引脚出现低电平,即起始位
//启动接收
//等待接收完成
if(d>=0&&d<=2){
if(RxdBuf==0xff){
dis[d]=RxdBuf;
d++;
}
else d=0;
}
else if(d==3||d==4){
dis[d]=RxdBuf;
d++;
}
else if(d>=5&&d<=7){
if(RxdBuf==0x00){
dis[d]=RxdBuf;
d++;
}
else d=0;
}
if(d==8){
d=0;
if(dis[0]==0xff&&dis[1]==0xff&&dis[2]==0xff&&dis[5]==0x00&&dis[6]==0x00&&dis[7]==0x0
dist[i]=(((unsigned int)dis[3])<<8)+(unsigned int)dis[4];
0)
dt+=dist[i];
i++;
}
if(i==60){
db=(double)dt/60;
i=0;
dt=0;
dn[2]=dn[1];dn[1]=dn[0];dn[0]=db;
if(dn[2]>0&&dn[1]>0&&dn[0]>0){
dbi=(dn[2]+dn[1]+dn[0])/3;
vb=(dn[0]-dn[2])*6;
a=(-dn[0]-dn[2]+2*dn[1])*144;
dat[0]=dbi;dat[1]=vb;dat[2]=a;
delta=(vb*vb)+2*a*dbi;
if(delta>=0&&a!=0){
t=(double)(-vb+sqrt(vb*vb+2*a*db))/a;
tn=control(dat);
t=t=150){
t=1;
}
}
}
}
if(t<1){
StartTXD(1); //计算出的 t<1 后,发送 1,控制小车停止
//LED = 0;
while (!TxdEnd);
}
//等待发送完成
StartTXD(0); //计算出的 t>1 后,发送 0,控制小车启动
//LED = 1;
while (!TxdEnd);
//等待发送完成
else{
}
}
}
}
/* 串口配置函数,baud-通信波特率 */
void ConfigUART(unsigned int baud)
{
TMOD &= 0xF0;
TMOD |= 0x02;
TH0 = 256 - (11059200/12)/baud;
//清零 T0 的控制位
//配置 T0 为模式 2
//计算 T0 重载值
}
/* 启动串行接收 */
void StartRXD()
{
//接收启动时的 T0 定时为半个波特率周期
TL0 = 256 - ((256-TH0)>>1);
ET0 = 1;
TR0 = 1;
RxdEnd = 0;
RxdOrTxd = 0;
//使能 T0 中断
//启动 T0
//清零接收结束标志
//设置当前状态为接收
}
/* 启动串行发送,dat-待发送字节数据 */
void StartTXD(unsigned char dat)
{
TxdBuf = dat;
TL0 = TH0;
ET0 = 1;
TR0 = 1;
PIN_TXD = 0;
TxdEnd = 0;
RxdOrTxd = 1;
//待发送数据保存到发送缓冲器
//T0 计数初值为重载值
//使能 T0 中断
//启动 T0
//发送起始位
//清零发送结束标志
//设置当前状态为发送
}
/* T0 中断服务函数,处理串行发送和接收 */
void InterruptTimer0() interrupt 1
{
static unsigned char cnt = 0; //位接收或发送计数
if (RxdOrTxd)
{
//串行发送处理
cnt++;
if (cnt <= 8)
{
//低位在先依次发送 8bit 数据位
PIN_TXD = TxdBuf & 0x01;
TxdBuf >>= 1;
//发送停止位
}
else if (cnt == 9)
{
PIN_TXD = 1;
}
else
{
//发送结束
cnt = 0;
TR0 = 0;
TxdEnd = 1; //置发送结束标志
//复位 bit 计数器
//关闭 T0
}
}
else
{
//串行接收处理
if (cnt == 0)
{
//处理起始位
if (!PIN_RXD) //起始位为 0 时,清零接收缓冲器,准备接收数据位
{
RxdBuf = 0;
cnt++;
}
else
{
}
//起始位不为 0 时,中止接收
TR0 = 0;
//关闭 T0
}
else if (cnt <= 8)
{
//处理 8 位数据位
RxdBuf >>= 1;
if (PIN_RXD)
{
//低位在先,所以将之前接收的位向右移
//接收脚为 1 时,缓冲器最高位置 1,
//而为 0 时不处理即仍保持移位后的 0
RxdBuf |= 0x80;
}
cnt++;
}
else
{
//停止位处理
cnt = 0;
TR0 = 0;
if (PIN_RXD)
{
//复位 bit 计数器
//关闭 T0
//停止位为 1 时,方能认为数据有效
RxdEnd = 1;
//置接收结束标志
}
}
}
}
double control(double f[]){
int k,l;
double sum,y,result[Out],ne[Neuron],tr;
for (k= 0; k< In; k++)
f[k]=(f[k]-Minin[k])/(Maxin[k]-Minin[k]);
for (k= 0; k< Neuron; k++){
y=0;
for (l= 0; l< In; l++)
y+=w[k][l]*f[l];
ne[k]=1/(1+exp(-1*y));
}
for (k= 0;k