大一下的时候做了个蓝牙小车,用到了
1、STC90C51RD+(主控)
2、L298N(电机驱动模块)
3、HC-06蓝牙模块(串口)
4、DHT11(温湿度传感器)
5、上位机(手机APP用于接受发送数据)
下面把程序源码贴上:
#include "reg52.h" #include "stdio.h" #include "intrins.h" #define uchar unsigned char #define uint unsigned int unsigned char x,flag; sbit in1=P1^0; sbit in2=P1^1; sbit in3=P1^2; sbit in4=P1^3; sbit Data=P3^6; //定义数据线 //---------------数据发送标志位------------------// bit temp; bit temp1; bit temp2; bit dao; //-----------------------------------------------// uchar speed_left=0; //左轮初速度 uchar speed_right=0; //右轮初速度 uchar count=0; //计数变量 uint i; //uchar rec_dat[9]; //用于显示的接收数据数组 ------------------------------------------------------------------------------------ //void DHT11_delay_us(uchar n) //{ // while(--n); //} //void DHT11_delay_ms(uint z) //{ // uint i,j; // for(i=z;i>0;i--) // for(j=110;j>0;j--); //} //------------------------------------------------------------------------------------ //void DHT11_start() //{ // Data=1; // DHT11_delay_us(2); // Data=0; // DHT11_delay_ms(20); //延时18ms以上 // Data=1; // DHT11_delay_us(30); //} //----------------------------------------------------------------------------------- //uchar DHT11_rec_byte() //接收一个字节 //{ // uchar i,dat=0; // for(i=0;i<8;i++) //从高到低依次接受八位数据 // { // while(!Data); //等待50us低电平过去 // DHT11_delay_us(8); //延时60us,如果还为高电平则数据为1,否则为0 // dat<<=1; //以为使正确接受八位数据,数据为0时直接移位 // if(Data==1) //数据为1时,使dat加一来接收数据1 // dat+=1; // while(Data); //等待数据线拉低 // } // return dat; //} //void DHT11_receive() //接收40位的数据 //{ // uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; // DHT11_start(); // if(Data==0) // { // while(Data==0); //等待拉高 // DHT11_delay_us(40); //拉高后延时80us // R_H=DHT11_rec_byte(); //接受湿度高八位 // R_L=DHT11_rec_byte(); //接受湿度低八位 // T_H=DHT11_rec_byte(); //接受温度高八位 // T_L=DHT11_rec_byte(); //接受温度低八位 // revise=DHT11_rec_byte(); //接收校正位 // DHT11_delay_us(25); //结束 // if((R_H+R_L+T_H+T_L)==revise) //校正 // { // RH=R_H; // RL=R_L; // TH=T_H; // TL=T_L; // } // /*数据处理,方便显示*/ // rec_dat[0]='0'+(RH/10); // rec_dat[1]='0'+(RH%10); // rec_dat[2]='R'; // rec_dat[3]='H'; // rec_dat[4]=' '; // rec_dat[5]=' '; // rec_dat[6]='0'+(TH/10); // rec_dat[7]='0'+(TH%10); // rec_dat[8]='C'; // } //} void time0_init(void) { TMOD=0x01; TH0=0xff; TL0=0xa4; TR0=1; ET0=1; EA=1; } void main() { time0_init(); TMOD = 0x20; //定时器为方式1 TH1=0xfd; //给定初值 TL1=0xfd; TR1=1; SM0=0; SM1=1; //设置串口 REN=1; //接受使能 EA=1; //总中断打开 ES=1; //串口中断打开 while(1) { } } void chuankou() interrupt 4 { x=SBUF; //单片机接收数据 if(RI==1) { if(x==1) { temp=1; speed_left=97; speed_right=93; //全速 RI=0; } if(x==2){ temp=1; speed_left=73; speed_right=75; //缓速 RI=0; } if(x==3) { temp=1; speed_left=0; speed_right=0; //停车 RI=0; } if(x==5) { temp2=1; speed_left=80; speed_right=80; //右转 RI=0; } if(x==4) { temp1=1; speed_left=80; speed_right=80; //左转 RI=0; } if(x==7) { dao=1; speed_left=75; speed_right=75; //倒车 RI=0; } } RI=0; } void T0_time() interrupt 1 { TR0=0; TH0=0Xff; TL0=0Xa4; count++; if(count>100) count=0; if(temp){ if(count<speed_left){ in1=1; in2=0; } else{ in1=0; in2=0; } if(count<speed_right){ in3=1; in4=0; } else{ in3=0; in4=0; } temp=0; } if(dao) //倒车 { if(count<speed_left) { in1=0; in2=1; } else { in1=0; in2=0; } if(count<speed_right) { in3=0; in4=1; } else { in3=0; in4=0; } dao=0; //倒车标志位 } if(temp1){ if(count<speed_left){ in1=0; in2=1; } else{ in1=0; in2=0; } if(count<speed_right){ in3=1; in4=0; } else{ in3=0; in4=0; } temp1=0; } if(temp2){ if(count<speed_left){ in1=1; in2=0; } else{ in1=0; in2=0; } if(count<speed_right){ in3=0; in4=1; } else{ in3=0; in4=0; } temp2=0; } TR0=1; }