我的智能安防小车

来源:互联网 发布:软件企业增值税税率 编辑:程序博客网 时间:2024/04/30 06:33












温湿度显示模块程序

#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar   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++);}elsetemp = 0;data_byte<<=1;data_byte|=temp;}return (data_byte);}void read_io()//开始信号,读数据并校验{io = 0;delay(18);//主机拉低18msio = 1;//DATA总线由上拉电阻拉高 主机延时20usdelay1();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为工作方式2TH1=0xfd;TL1=0xfd;//T1定时器装初值TR1=1;//启动定时器T1REN=1;//允许串口接收SM0=0;SM1=1;//设置串口工作方式1EA=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 intsbit 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 0
原创粉丝点击