温湿度显示模块程序
#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);
}