基于51单片的蓝牙小车项目

大一下的时候做了个蓝牙小车,用到了

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;
} 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值