大一下的时候做了个蓝牙小车,用到了
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;
}