📄 222.c
字号:
#include<intrins.h>
#include<reg51.h>
#include<1602.h>
unsigned char code xiaoche[] = {"xiaoche"};
unsigned char code mm[] = {"mm"};
unsigned char code distance[]={"distance"};
unsigned char code time[]={"time"};
unsigned char zkbz=0 ; /*占空比*/
unsigned char zkby=0 ;
unsigned char t=0; /* 定时器中断计数器 */
unsigned int juli=0; /*距离*/
unsigned char a=0;
unsigned char sl=0; /*时间秒*/
unsigned char sh=0; /*时间秒*/
unsigned char fl=0; /*时间分*/
unsigned char fh=0; /*时间分*/
unsigned int dis=0; /*实际距离*/
bit flag=0; /*标志位*/
sbit gm=P2^3; /*光敏*/
/********************************************************
控制口定义
*********************************************************/
sbit en1 =P1^1; /* L298的Enable A */
sbit s1 =P1^0; /* L298的Input 1 */
sbit s2 =P1^2; /* L298的Input 2 */
sbit en2 =P1^4; /* L298的Enable A */
sbit s3 =P1^3; /* L298的Input 1 */
sbit s4 =P1^5; /* L298的Input 2 */
sbit Guandian0=P2^0;
sbit Guandian1=P2^1;
sbit Guandian2=P2^2;
/*******************************************************
外部中断 计算路程
********************************************************/
void service_int0() interrupt 0
{
EX0=0;
if(flag==0)juli++;
else juli--;
dis=juli*5;
DispOneChar(9,1,dis/10000);
DispOneChar(11,1,dis/1000%10);
DispOneChar(12,1,dis/100%10);
EX0=1;
}
/*************************************************************
定时器0服务程序
*************************************************************/
void timer0() interrupt 1 /* T0中断服务程序 */
{
if(t<zkbz) en1=1; else en1=0; /* 产生电机1的PWM信号 */
if(t<zkby) en2=1; else en2=0;/* 产生电机1的PWM信号 */
t++;
if(t>=100) t=0; /* 1个PWM信号由100次中断产生 */
}
/*************************************************************
定时器1服务程序
*************************************************************/
void timer1() interrupt 3
{
unsigned char cnt;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
cnt++;
if(cnt>=20)
{
cnt=0;
++sl;
if(sl==10)
{
sl=0;
++sh;
if(sh==6)
{
sh=0;
++fl;
if(fl==10)
{
fl=0;
++fh;
}
}
}
}
}
/*************************************************************
循迹程序
*************************************************************/
void xunji(void)
{
switch(a)
{
case 0x02:flag=0;s1=0;s2=1;s3=0;s4=1;zkbz=40;zkby=40;break;
case 0x01:flag=0;s1=0;s2=1;s3=1;s4=0;zkbz=70;zkby=15;break;
case 0x04:flag=0;s1=1;s2=0;s3=0;s4=1;zkbz=15;zkby=70;break;
case 0x03:flag=0;s1=0;s2=1;s3=0;s4=1;zkbz=65;zkby=15;break;
case 0x06:flag=0;s1=0;s2=1;s3=0;s4=1;zkbz=15;zkby=75;break;
case 0x00:flag=1;s1=1;s2=0;s3=1;s4=0;zkbz=30;zkby=30;break;
default:break;
}
Delay5Ms();
}
/**************************************************************
内部资源初始化
*******************************************************************/
void Init(void)
{
TMOD=0x12; /* 设定T0的工作模式为2,设定T0的工作模式为1 */
TH0=0xB6; /* 装入定时器的初值 */
TL0=0xB6;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
IT0=1;
IP=0x03;
EA=1; /* 开总中断 */
ET0=1; /* 定时器0允许中断 */
ET1=1; /* 定时器1允许中断 */
TR1=1; /* 启动定时器1 */
TR0=1; /* 启动定时器0 */
EX0=1; /*开中断0*/
}
void main(void)
{
Init(); /*系统初始化*/
LcdReset(); /*液晶初始化*/
DisplayListChar(0,0,"time",4) ;
DispOneChar(7,0,':');
DisplayListChar(0,1,"distance",8) ;
DispOneChar(10,1,':');
zkbz=40;
zkby=40;
s1=0;s2=1;s3=0;s4=1;
do{ /*循迹*/
a=P2;
a=a&0x07;
xunji();
}while(a!=0x07);
zkbz=40; /*避障*/
zkby=40;
s1=0;s2=1;s3=0;s4=1; //前
delay(20000);
s1=0;s2=1;s3=1;s4=0; //左
delay(65000);
s1=0;s2=1;s3=0;s4=1; //前
delay(60000);
s1=1;s2=0;s3=0;s4=1; //右
delay(50000);
s1=0;s2=1;s3=0;s4=1; //前
delay(60000);
/* s1=1;s2=0;s3=0;s4=1; //右
delay(60000);
s1=0;s2=1;s3=0;s4=1; //前
delay(60000);
s1=0;s2=1;s3=1;s4=0; //左
delay(60000);*/
s1=0;s2=1;s3=0;s4=1; //前
do /*趋光*/
{
a=P2;
a=a&0x07;
if(!gm)
{
zkbz=60;zkby=0;}
else
{zkbz=0;zkby=70;}
delay(10000);
}while(a==0);
s1=s2=s3=s4=0;
s1=0;s2=1;s3=0;s4=1;
delay(20000);
EA=0;
do{s1=s2=s3=s4=0;
DispOneChar(5,0,fh+0x30);
DispOneChar(6,0,fl+0x30);
DispOneChar(8,0,sh+0x30);
DispOneChar(9,0,sl+0x30);}while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -