我的智能安防小车












温湿度显示模块程序

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

uchar   lcd_x,lcd_y,data_byte=0,count;
uint TH_data,TL_data,RH_data,RL_data,CK_data;
uint TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
uchar num;

sbit LCD_RS = P1^5;//并行指令,数据选择信号
//sbit LCD_RW = P1^6;//读写信号
sbit LCD_EN = P1^7;//并行使能信号
sbit io = P3^6;//DHT11总线

uchar code lcd1[]={"℃"};
uchar code lcd2[]={"%RH"};

uchar str1[]={" "};
uchar str2[]={" "};
 

void delay1()//延时10us
{
	unsigned char i;
	for(i=0; i<3; i++);
}

void delay(uint a)
{
	uchar i;
	while(a--)
	{
		for(i=0; i<113; i++);
	}
}

/**********************DHT11模块**********************/
uchar receive_byte()//接收一个字节
{
	uchar i,temp;
	for(i=0;i<8; i++)
	{
		count = 2;
		while((!io) && count++)//等待50us低电平结束,并防止死循环
		temp = 0;
		delay1();
		delay1();
		delay1();
		if (io==1)
		{ 
			temp = 1;
			count = 2;
			while(io && count++);
		}
		else
			temp = 0;
			data_byte<<=1;
			data_byte|=temp;			
	}
	return (data_byte);
}

void read_io()//开始信号,读数据并校验
{
	io = 0;
	delay(18);//主机拉低18ms
	io = 1;//DATA总线由上拉电阻拉高 主机延时20us
	delay1();
	delay1();
	delay1();
	delay1();
	io = 1;//主机设置为输入高电平,判断从机响应信号
	if(!io)
	{	
		count = 2;
		while((!io)&&count++);//判断DHT11发出80us低电平响应信号是否结束
		count = 2;
		while(io && count++);//判断DHT11拉高总线80us高电平是否结束
		RH_temp = receive_byte(); 
		RL_temp = receive_byte(); 
		TH_temp = receive_byte(); 
		TL_temp = receive_byte(); 
		CK_temp = receive_byte();
		io = 1;
		num = (RH_temp + RL_temp + TH_temp + TL_temp);//数据校验

		if(num == CK_temp)
		{
			RH_data = RH_temp;
       		RL_data = RL_temp;
			TH_data = TH_temp; 
       		TL_data = TL_temp;
       		CK_data = CK_temp;	
		}
	}
	//湿度整数部分
	str1[0] = (char)(0x30 + RH_data/10);
	str1[1] = (char)(0x30 + RH_data%10);
	//温度整数部分
	str2[0] = (char)(0x30 + TH_data/10);
	str2[1] = (char)(0x30 + TH_data%10);
}
/**********************E N D**********************/
 

void delay1ms(uint x) 
{ 
uint i,j; 
for(j=0;j<x;j++)  
	for(i=0;i<110;i++); 
}		
/*******************************************************************/
/*                                                                 */
/*写指令数据到LCD                                                  */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
/*                                                                 */
/*******************************************************************/
void write_com(uchar com)
{                          
    LCD_RS = 0;
    //LCD_RW = 0;
    LCD_EN = 0;
    P0 = com;
	delay1ms(5);
    LCD_EN = 1;
	delay1ms(5);
    LCD_EN = 0;  
}
/*******************************************************************/
/*                                                                 */
/*写显示数据到LCD                                                  */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
/*                                                                 */
/*******************************************************************/
void write_data(uchar dat)
{                          
    LCD_RS = 1;
  //  LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
	delay1ms(5);
    LCD_EN = 1;
	delay1ms(5);
    LCD_EN = 0;  
}
/****直接输出数组中的字符串***/
void print(uchar *str)        //LCD显示函数
{
    while(*str!='\0')
	{
		write_data(*str);
		str++;
	}
}

/*******************************************************************/
/*                                                                 */
/*  LCD初始化设定                                                  */
/*                                                                 */
/*******************************************************************/
void lcd_init()
{ 
    write_com(0x30);      //基本指令操作
    write_com(0x0C);      //显示开,关光标
    write_com(0x01);      //清除LCD的显示内容
}

void main()
{
	uchar k,j;
	lcd_init();	
	write_com(0x80+4);
	print(lcd1);
	write_com(0x80+0x40+4);
	print(lcd2);
	while(1)
	{
		read_io();//读取温湿度数据
		//clear_gcrom();
		//湿度
		for(k=0; k<2; k++)
		{
			write_com(0x80);	
			write_data(str1[k]);		
		}
		//clear_gcrom();
		//温度
		for(j=0; j<2; j++)
		{
			write_com(0x80+0x40);	
			write_data(str2[j]);		
		}

		delay(500);
	}		
}

蓝牙模块程序

#include<reg52.h>//声明头文件
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义

sbit deng=P2^0;//定义车灯的控制引脚
sbit z=P2^1;//定义左转向灯的控制引脚
sbit y=P2^2;//定义右转向灯的引脚
sbit BEEP=P2^3;//定义蜂鸣器的引脚

sbit you1=P0^0;//定义控制左边电机的单片机引脚
sbit you2=P0^1;//定义控制左边电机的单片机引脚
sbit zuo1=P0^2;//定义控制右边电机的单片机引脚
sbit zuo2=P0^3;//定义控制右边电机的单片机引脚
uchar a=0;//定义一个变量a,用来读取串口的数据

void delay(uint z)//一个带参数的延时程序
{
	int i,j;//定义两个变量
	for(i=10;i>0;i--)
	for(j=z;j>0;j--);//将参数z赋值给j
}

void init()//初始化子程序
{
	TMOD=0x20;//设置定时器T1为工作方式2
	TH1=0xfd;
	TL1=0xfd;//T1定时器装初值
	TR1=1;//启动定时器T1
	REN=1;//允许串口接收
	SM0=0;
	SM1=1;//设置串口工作方式1
	EA=1;//开总中断
	ES=1;//开串口中断
}

void go()//前进子程序
{
	zuo1=0;
	zuo2=1;//左边轮子正转
	delay(25);//pwm有用值,越大左边方向的轮子越快
	zuo1=1;//关闭左边轮子

	you1=0;
	you2=1;	//右边轮子正转
	delay(24);//pwm有用值,越大右边的轮子越快
	you1=1;//关闭右边轮子

	delay(100);//pwm无用值,越大,小车跑的越慢
	z=1;
	y=1;//关闭转向灯
}

void hui()//小车后退的子程序
{
	zuo1=1;
	zuo2=0;//左边轮子倒转
	delay(25);//pwm有用值,越大左边方向的轮子越快
	zuo2=1;//关闭左边轮子

	you1=1;
	you2=0;	//右边轮子倒转
	delay(24);//pwm有用值,越大右边的轮子越快
	you2=1;//关闭右边轮子

	delay(100);//pwm无用值,越大,小车跑的越慢
	z=1;
	y=1;//关闭转向灯
}

void turnleft()//小车左转弯子程序
{
	zuo1=1;
	zuo2=1;//左边轮子停止转动

	you1=0;
	you2=1;	//右边轮子正转
	delay(24);//pwm有用值,越大右边的轮子越快
	you1=1;//右边轮子停止

	delay(100);//pwm无用值,越大,小车跑的越慢
	z=1;
	y=1;//关闭转向灯
	z=~z;//左转向灯打开
}

void turnright()//小车右转弯子程序
{
	zuo1=0;
	zuo2=1;//左边轮子正转
	delay(25);//pwm有用值,越大左边方向的轮子越快
	zuo1=1;//左边轮子停止

	you1=1;
	you2=1;	//右边轮子停止
	delay(100);//pwm无用值,越大,小车跑的越慢
	z=1;
	y=1;//关闭转向灯
	y=~y;//右转向灯打开
}
void down()//停止子程序
{
	zuo1=1;
	zuo2=1;
	you1=1;
	you2=1;	//左右轮全部停止
	z=1;
	y=1;//关闭转向灯
}

void beep()//蜂鸣器鸣响子程序
{
	BEEP=0;
}

void main()//主程序
{
	init();//调用初始化子程序
	while(1)//死循环
	{
		switch(a)//判断a从串口读取到的数据
		{
			case 0x02://如果是0x1f就前进
			go();
			break;

			case 0x08://如果是0x2f就后退
			hui();
			break;

			case 0x04://如果是0x3f就左转
			turnright();
			break;

			case 0x06://如果是0x4f就右转
				turnleft();
			break;

			case 0x05://如果是0x00就停止
			down();
			break;
				    
			

		}	
	}	
}

void chuan() interrupt 4//串口中断服务程序
{
	RI=0;//软件清除串口响应
	a=SBUF;//读取单片机串口接受的蓝牙模块发送的数据
}

寻光模块程序

#include<reg52.h>//包含必要头文件
sbit you1=P0^0;//定义单片机控制右边电机的引脚
sbit you2=P0^1;//定义单片机控制右边电机的引脚
sbit zuo1=P0^2;//定义单片机控制左边电机的引脚
sbit zuo2=P0^3;//定义单片机控制左边电机的引脚
sbit zxg=P2^4;//定义单片机连接循迹板左边光电管的引脚
sbit yxg=P2^5;//定义单片机连接循迹板右边光电管的引脚
void delay(int z)//pwm中使用的延时函数
{
	int i,j;
	for(i=2;i>0;i--)
	for(j=z;j>0;j--);	
}
void qian()//左右轮协同前进子函数
{
	you1=0;
	you2=1;
	zuo1=0;
	zuo2=1;
	delay(10-5);//pwm调速 此为pwm有效值
	you1=1;
	you2=1;
	zuo1=1;
	zuo2=1;
	delay(5);//pwm调速 此为pwm无效值  则此时pwm=9/10=90%	
}
void hui()//左右轮协同前进子函数
{
	you1=1;
	you2=0;
	zuo1=1;
	zuo2=0;
	delay(10-5);//pwm调速 此为pwm有效值
	you1=1;
	you2=1;
	zuo1=1;
	zuo2=1;
	delay(5);//pwm调速 此为pwm无效值  则此时pwm=9/10=90%	
}
void zuo()//左右轮协同左转子函数
{
	you1=0;
	you2=1;
	zuo1=1;
	zuo2=0;
	delay(10-5);//pwm调速 此为pwm有效值
	you1=1;
	you2=1;
	zuo1=1;
	zuo2=1;
	delay(5);//pwm调速 此为pwm无效值  则此时pwm=9/10=90%	
}
void you()//左右轮协同右转子函数
{
	you1=1;
	you2=0;
	zuo1=0;
	zuo2=1;
	delay(10-5);//pwm调速 此为pwm有效值
	you1=1;
	you2=1;
	zuo1=1;
	zuo2=1;
	delay(5);//pwm调速 此为pwm无效值  则此时pwm=9/10=90%
}
void down()//左右轮都停止转动
{
	you1=1;
	you2=1;
	zuo1=1;
	zuo2=1;
}
void main()//主函数
{
	while(1)//死循环
	{
	hui();
			while(zxg==0)//判断当左边光电管遇到黑线,
		{							//右边和前边的光电管遇到白线时左转
			you();//调用左转函数
		}
		while(yxg==1)//判断当右边光电管遇到黑线,
		{							//左边和前边的光电管遇到白线时右转	
		zuo();//调用右转函数
		}
	
	}
}

避障模块程序

#include<reg52.h>//包含必要头文件
sbit you1=P0^0;//定义单片机控制右边电机的引脚
sbit you2=P0^1;//定义单片机控制右边电机的引脚
sbit zuo1=P0^2;//定义单片机控制左边电机的引脚
sbit zuo2=P0^3;//定义单片机控制左边电机的引脚
sbit z=P1^4;//定义单片机连接循迹板左边光电管的引脚
sbit y=P1^3;//定义单片机连接循迹板右边光电管的引脚
sbit q=P1^5;//定义单片机连接循迹板前边光电管的引脚
void delay(int z)//pwm中使用的延时函数
{
	int i,j;
	for(i=2;i>0;i--)
	for(j=z;j>0;j--);	
}
void qian()//左右轮协同前进子函数
{
	you1=0;
	you2=1;
	zuo1=0;
	zuo2=1;
	delay(10-5);//pwm调速 此为pwm有效值
	you1=1;
	you2=1;
	zuo1=1;
	zuo2=1;
	delay(5);//pwm调速 此为pwm无效值  则此时pwm=9/10=90%	
}
void zuo()//左右轮协同左转子函数
{
	you1=0;
	you2=1;
	zuo1=1;
	zuo2=0;
	delay(10-5);//pwm调速 此为pwm有效值
	you1=1;
	you2=1;
	zuo1=1;
	zuo2=1;
	delay(5);//pwm调速 此为pwm无效值  则此时pwm=9/10=90%	
}
void you()//左右轮协同右转子函数
{
	you1=1;
	you2=0;
	zuo1=0;
	zuo2=1;
	delay(10-5);//pwm调速 此为pwm有效值
	you1=1;
	you2=1;
	zuo1=1;
	zuo2=1;
	delay(5);//pwm调速 此为pwm无效值  则此时pwm=9/10=90%
}
void down()//左右轮都停止转动
{
	you1=1;
	you2=1;
	zuo1=1;
	zuo2=1;
}
void main()//主函数
{
	while(1)//死循环
	{
		qian();//调用前进子函数,使小车光电管不满足以下几个条件时都处于前进状态
		while(z==0)//判断当左边光电管遇到黑线,
		{							//右边和前边的光电管遇到白线时左转
		zuo();//调用左转函数
		}
		while(y==0)//判断当右边光电管遇到黑线,
		{							//左边和前边的光电管遇到白线时右转	
		you();//调用右转函数
		}
		while(q==0)//判断当左边光电管遇到黑线,右边光电管也遇到黑线
		{							//前边的光电管遇到白线时停止
	you();//调用停止函数
		}
		while((y==0)&&(q==0))//判断当左边、右边、前边光电管同时遇到黑线
		{							//即遇到十字路口,小车前进
		you();//调用前进函数
		}
		while((z==0)&&(q==0))//判断当左边、右边、前边光电管同时遇到黑线
		{							//即遇到十字路口,小车前进
	zuo();//调用前进函数
		}
	
	}
}

循迹模块程序

#include<reg52.h>//包含必要头文件
sbit you1=P0^0;//定义单片机控制右边电机的引脚
sbit you2=P0^1;//定义单片机控制右边电机的引脚
sbit zuo1=P0^2;//定义单片机控制左边电机的引脚
sbit zuo2=P0^3;//定义单片机控制左边电机的引脚
sbit z=P1^1;//定义单片机连接循迹板左边光电管的引脚
sbit y=P1^0;//定义单片机连接循迹板右边光电管的引脚
sbit q=P1^2;//定义单片机连接循迹板前边光电管的引脚
void delay(int z)//pwm中使用的延时函数
{
	int i,j;
	for(i=2;i>0;i--)
	for(j=z;j>0;j--);	
}
void qian()//左右轮协同前进子函数
{
	you1=0;
	you2=1;
	zuo1=0;
	zuo2=1;
	delay(10-1);//pwm调速 此为pwm有效值
	you1=1;
	you2=1;'
	zuo1=1;
	zuo2=1;
	delay(1);//pwm调速 此为pwm无效值  则此时pwm=9/10=90%	
}
void zuo()//左右轮协同左转子函数
{
	you1=0;
	you2=1;
	zuo1=1;
	zuo2=0;
	delay(10-1);//pwm调速 此为pwm有效值
	you1=1;
	you2=1;
	zuo1=1;
	zuo2=1;
	delay(1);//pwm调速 此为pwm无效值  则此时pwm=9/10=90%	
}
void you()//左右轮协同右转子函数
{
	you1=1;
	you2=0;
	zuo1=0;
	zuo2=1;
	delay(10-1);//pwm调速 此为pwm有效值
	you1=1;
	you2=1;
	zuo1=1;
	zuo2=1;
	delay(1);//pwm调速 此为pwm无效值  则此时pwm=9/10=90%
}
void down()//左右轮都停止转动
{
	you1=1;
	you2=1;
	zuo1=1;
	zuo2=1;
}
void main()//主函数
{
	while(1)//死循环
	{
		qian();//调用前进子函数,使小车光电管不满足以下几个条件时都处于前进状态
		while((z==0)&&(y==1)&&(q==1))//判断当左边光电管遇到黑线,
		{							//右边和前边的光电管遇到白线时左转
			zuo();//调用左转函数
		}
		while((z==1)&&(y==0)&&(q==1))//判断当右边光电管遇到黑线,
		{							//左边和前边的光电管遇到白线时右转	
			you();//调用右转函数
		}
		while((z==0)&&(y==0)&&(q==1))//判断当左边光电管遇到黑线,右边光电管也遇到黑线
		{							//前边的光电管遇到白线时停止
			down();//调用停止函数
		}
		while((z==0)&&(y==0)&&(q==0))//判断当左边、右边、前边光电管同时遇到黑线
		{							//即遇到十字路口,小车前进
			qian();//调用前进函数
		}
	}
}

1602液晶显示模块

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^0;
sbit rw=P1^1;
sbit lcden=P2^5;
uchar code table0[]="Welcome!";
uchar code table1[]="BY Chi Gui Liang";
uchar code table2[]="distance is:";
uchar num; 
void delay(uint x)
{
	uint a,b;
	for(a=x;a>0;a--)
		for(b=10;b>0;b--); 
}

void delay1(uint x)
{
	uint a,b;
	for(a=x;a>0;a--)
		for(b=100;b>0;b--); 
}

void write_com(uchar com)//写指令,输入:RS=L,RW=L,D0-D7=指令码,E=高脉冲
{
	P0=com;
	rs=0;
	lcden=0;
	delay(10);
	lcden=1;
	delay(10);
	lcden=0;
	
}

void write_date(uchar date)//写数据,输入:RS=H,RW=L,D0-D7=数据,E=高脉冲
{
	P0=date;
	rs=1;
	lcden=0;
	delay(10);
	lcden=1;
	delay(10);
	lcden=0;
	
}

void init()	 //初始化
{
    rw=0;
	write_com(0x38);   //显示模式设置:16×2显示,5×7点阵,8位数据接口
	delay(20);
	write_com(0x0f);   //显示模式设置
	delay(20);
	write_com(0x06);   //显示模式设置:光标右移,字符不移
	delay(20);
	write_com(0x01);   //清屏幕指令,将以前的显示内容清除
	delay(20);	
}

void main()
{
	init();
	write_com(0x80+4);//右移4个空格
	for(num=0;num<8;num++)
	{
	  write_date(table0[num]);
	  delay1(200);
	}
	write_com(0x80+0x40);//换行
	for(num=0;num<16;num++)
	{
	  write_date(table1[num]);
	  delay1(200);
	}
	write_com(1);//清屏
	for(num=0;num<12;num++)
	{
	  write_date(table2[num]);
	  delay1(200);
	}
	while(1);
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值