logo资料库

智能小车51单片机神经网络防碰撞程序.docx

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
#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
分享到:
收藏