标题:
C语言程序51单片机利用红外检测的寻迹小车
[打印本页]
作者:
陈小晓
时间:
2019-3-2 22:30
标题:
C语言程序51单片机利用红外检测的寻迹小车
/*******dianji.c部分*************************/
#include < reg52.h >
#include " dianji.h"
#define uchar unsigned char
char num=0,shi,fen,i;
int ds,zuo,you,jd=1,kk,ting=0,d;
uchar code minute[]={"分"};
uchar code second[]={"秒"};
void delay(unsigned int xms)
{
unsigned int i,j;
for(j=0;j<xms;j++)
for(i=0;i<80;i++);
}
/*******12232液晶*****************/
void send_command(uchar command_data) //发命令
{
uchar i;
uchar i_data;
i_data=0xf8;
CS=1;
SCLK=0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
i_data=command_data;
i_data&=0xf0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
i_data=command_data;
i_data<<=4;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
CS=0;
delay(10);
}
void send_data(uchar command_data) //发送数据
{
uchar i;
uchar i_data;
i_data=0xfa;
CS=1;
SCLK=0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
i_data=command_data;
i_data&=0xf0;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
i_data=command_data;
i_data<<=4;
for(i=0;i<8;i++)
{
SID=(bit)(i_data&0x80);
SCLK=0;
SCLK=1;
i_data=i_data<<1;
}
CS=0;
delay(10);
}
void LCD_init() //液晶初始化
{
PSB=0;
delay(50);
send_command(0x30); //设置8位数据接口,基本指令模式
send_command(0x02); //清DDRAM
send_command(0x06); //游标及显示右移一位
send_command(0x0c); //整体显示开,游标关,反白光
send_command(0x01); //写入空格清屏幕
send_command(0x89);
while(minute[i]!='\0')
{
send_data(minute[i]);
i=i+1;
}
i=0;
send_command(0x9A);
while(second[i]!='\0')
{
send_data(second[i]);i=i+1;
}
i=0;
}
/**********定时器********************/
void Time0_Initk() //定时器初始化
{
TMOD=0x01;
IE=0x82;
TH0=0xfe;
TL0=0x33;
TR0=1;
}
void Time0_Init() interrupt 1
{
TH0=0xfe;
TL0=0x33;
ds=ds+1;kk++;
if(ds==2000) //一秒时间到
{
ds=0;
xianshi();
}
jd=jd+1;
if(jd<zuo)
{
ENA=1;
}
else
{
ENA=0;
}
if(jd<you)
{
ENB=1;
}
else
{
ENB=0;
}
jd=jd%100; //jd自加次数始终保持为100
}
/***********计时:——分——秒**************/
void xianshi()
{
num=num+1;
if(num==10)
{
num=0;
shi=shi+1;
}
if(shi==6)
{
shi=0;
fen=fen+1;
}
send_command(0x99);
send_data(num+48);
send_command(0x98);
send_data(shi+48);
send_command(0x88);
send_data(fen+48);
}
/*************红外遮挡情况*****************/
void hw()
{
if(hwl==0&&hwr==0) //直走
{
in1= 1;in2= 0;
in3= 0;in4= 1;
zuo =16;you =10;
}
if(hwl==0&&hwr==1) //右拐
{
in1=0;in2=1;
in3=1;in4=0;
zuo =3;you =16;
}
if(hwl==1&&hwr==0) //左拐
{
in1=0;in2=1;
in3=0;in4=1;
// zuo =16;
// you =3;
}
}
/*********小车停下*************/
void stop()
{
if(hwl==1&&hwr==1)
{
in1=0;in2=0;
in3=0;in4=0;
while(ting<5) //停下
{
if(d==0)
{
kk=0;
d=2;
}
if(kk==2000) //一秒
{
ting=ting+1;
send_command(0x80);
send_data(ting+48);
kk=0;
}
if(ting==5)
{
kk=3000;
in1=1;in2=0;
in3=0;in4=1;
zuo=20;
you=19;
delay(200);
}
}
ting=0;d=0;
}
}
复制代码
/**********dianji.h部分*******************/
#include < reg52.h >
#define uchar unsigned char
#define uint unsigned int
sbit in1=P0^0; //左
sbit in2=P0^1;
sbit ENA=P0^2;
sbit in3=P0^5; //右
sbit in4=P0^6;
sbit ENB=P0^7;
sbit CS=P1^0;
sbit SID=P1^1;
sbit SCLK=P1^2;
sbit PSB=P1^3;
sbit hwr=P3^7; //红外
sbit hwl=P3^0;
extern void hw();
extern void LCD_init();
extern void Time0_Initk() ;
extern void xianshi();
extern void stop();
/********main.c主函数部分******************/
#include <reg52.h>
#include " dianji.h"
void main()
{
ENA=0;ENB=0;
Time0_Initk();
LCD_init();
while(1)
{
stop();
hw();
}
}
复制代码
作者:
admin
时间:
2019-3-3 03:30
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1