📄 song.c
字号:
#include<stdio.h>
#include<reg51.h>
#define POINT_NUM 36
sbit clk=P0^0;
sbit sda=P0^1;
sbit P17=P1^7;
sbit P03=P0^3;
sbit P04=P0^4;
sbit P05=P0^5;
sbit P06=P0^6;
sbit P32=P3^2;
sbit P07=P0^7;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P10=P1^0;
sbit P14=P1^4;
sbit P16=P1^6;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
sbit P37=P3^7;
#define hi 0x3c
#define lo 0xb0
#define hi1 0x01
#define lo1 0x01
unsigned char code ledk[10]={0x3f,0x30,0x5b,0x4f,0x66,0x6D,0x7d,0x07,0x7f,0x6f};
unsigned char dsp[4];
int ms;//测距
unsigned char speedl;///////左轮脉冲
unsigned char speedr;///////右轮脉冲
unsigned char pwm_count;/////总脉宽
int distance[5];////存储铁块距?
unsigned char tie_flag;///检测铁片起始标志
unsigned char stopFlag;//停车标志
unsigned char _5s_count;//几时5秒
unsigned char Second_5;//倒几时
unsigned char count;//铁片计数
unsigned char index;
unsigned char t0_count;//定时器0计数
unsigned char time;
unsigned char show_tie_juli;//显示铁片的距离
unsigned char show_tie_time;//显示铁片的距
unsigned char turn_l_time;
unsigned char turn_r_time;
unsigned char turn_count;
unsigned char zawFlag;
int ms1;//铁片起点的脉冲个数
int ms2;//铁片终点的脉冲个数
unsigned Status;
///////////////////////////////////
void stop_5s();
void display();
void c_sun();
void ceju();
void zaw();
void cheting();
void ButtonAction();
void delay(unsigned int n);
void shift(unsigned char dd);
void t0();
//void hextodec(unsigned char xx);
void black();
////////////////////////////////////////
void main(void)
{
PT1=1;
EA=1;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
TMOD=0x21;
ET0=1;
TH0=hi;
TL0=lo;
TR0=1;
TR1=1;
ET1=1;
ET0=1;
TH1=hi1;
TL1=lo1;
speedl=180;
speedr=180;
P10=P12=1;
tie_flag=0;
stopFlag = 0;
zawFlag = 0;
Second_5 = 5;
count=0;
//P14 =0;
//P03 =0;
Status = 1;
show_tie_juli = 0;
while(1)
{
display();
// ceju();
switch (Status)
{
case 1://AC路段检测
{
black();
// if(time>20)
// stop_5s();
break;
}
case 2://障碍物检测
{
if (P06 ==0)
{
zawFlag=1;
Status=3;
}
break;
}
case 3://检测到障碍物后转玩90度
{
zaw();
break;
}
case 4://寻光源,定方向
{
c_sun();
break;
}
case 5://停车入库
{
cheting();
break;
}
case 6:
{
ButtonAction();
break;
}
}
}
}
///////////////////////////////
////////////////////////////////////延时
void delay (unsigned int n)
{unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++);
}
////////////////////////////////////164串并行
void shift(unsigned char dd)
{static unsigned char d;
unsigned char j=0;
d=dd;while(j<8)
{
if((d&0x80)!=0)
sda=1;
else sda=0;
clk=0;delay(1);clk=1;
d<<=1;j++;}
}
//////////////////////////////////// T0定时计数
void t0() interrupt 1
{ unsigned char char_show;
TH0=hi;TL0=lo;/////50ms
t0_count++;
if(t0_count>=20)
{
time++;
if (time>30)
{
PX0=1;
}
t0_count=0;
if (show_tie_juli == 1)
{
show_tie_time ++;
}
if (show_tie_time >= 3)
{
show_tie_juli= 0;
show_tie_time =0;
dsp[2]= 0;
}
if (show_tie_juli == 0)
{
char_show = (unsigned char)time / 10;
char_show = ledk[char_show];
dsp[1] = char_show;
char_show = time %10;
char_show = ledk[char_show];
dsp[0] = char_show;
}
if(time>=90)
{
stop_5s();
TR0=0;
Status=6;
}
}
///电机停止信号
/////////////////////////
if (Status ==3)
{
turn_count++;
if (turn_count>=20)
{
turn_count=0;
turn_l_time++;
if (turn_l_time >=8)
{
Status =4;
//turn_l_time = 0;
}
}
}
if(Status ==4)
{
turn_count++;
if (turn_count>=20)
{
turn_count=0;
turn_r_time++;
if (turn_r_time >=8)
{
Status =5;
//turn_r_time=0;
}
}
}
///////////////////////////
if (stopFlag == 1)
{
char_show = ledk[Second_5];
dsp[3] = char_show;
_5s_count++;
if(_5s_count<=10)
P17=0;
if(_5s_count>10)
P17=1;
if (_5s_count == 20)
{
Second_5 --;
_5s_count=0;
char_show = ledk[Second_5];
dsp[3] = char_show;
if (Second_5 == 0)
{
stopFlag = 0;
TR1 = 1;
EX0=0;//关外部0中断,不再检测铁片+
Status = 2;
//P04=0;
//P05=0;
speedr=180;
speedl=230;
}
}
}
}
///////////////////////////////////
/*void hextodec(unsigned char xx)
{unsigned char B;
B=xx/10;
dsp[3]=B;
xx=xx%10;
B=xx;
dsp[2]=B;
}*/
///////////////////////////////////检测黑线子涵数
void black()
{
if(P04==1)
{
speedl=2; ///////左轮压黑线
speedr=250;
}
else
{
speedl=250;
//speedr=180;
}
if(P05==1)
{
speedr=2; ///右轮压黑线
speedl =250;
}
else
{
speedr=250; //没压黑线
//speedl=180;
}
if(P04==0&&P05==0)
{
speedl =250;
speedr =250;
}
}
//////////////////////////////
void PWM() interrupt 3
{ if(pwm_count==speedl)
P10=1;
if(pwm_count==speedr)
P12=1;
++pwm_count;
if(pwm_count==255)
{pwm_count=0;
P10=0;
P12=0;}
}
///////////////金属数目检测及显示涵数
void int0() interrupt 0
{
unsigned char i,char_show;
display();
if ( P32 ==1)
return;
ms1=ms;
if (time>30)
{
stop_5s();
stopFlag = 1;
}
tie_flag=1;
count++;
char_show = ledk[count];
dsp[3] = char_show;
P17=0;//声光信息
for (i=0;i<20;i++)
{
display();
}
P17=1;
}
/////////////////////外部1中断检测脉冲数
//void ceju()
void int1() interrupt 2
{
//unsigned char ms0, s1;
// float juli_real;
unsigned char juli_int;
unsigned char tie_juli_start;
unsigned char tie_juli_end;
unsigned char round_int;
unsigned char round_real;
//if(P07==1)
// { ms++;
// P07=0;
// }
ms++;
if(P32==1&&tie_flag==1)
{
show_tie_juli = 1;
ms2=ms;
tie_flag=0;
//ms0=(ms2-ms1)/4;
//s1=(ms2-ms1) * 20/2/4;
//distance[count]=ms*20 / 4 +(ms2-ms1) * 20/2/4;
round_int = ms1 /POINT_NUM;
round_real = ms1 % POINT_NUM;
round_real = round_real *6;
round_real= round_real/10;
tie_juli_start = round_real + round_int * 20;
round_int = ms2 /POINT_NUM;
round_real = ms2 % POINT_NUM;
round_real = round_real *6;
round_real= round_real/10;
tie_juli_end= round_real + round_int * 20;
distance[count]=(tie_juli_start +tie_juli_end) / 2;
juli_int = distance[count]/100;
dsp[2] = ledk[juli_int];
//dsp[2] = dsp[2] | 0x80;
juli_int = distance[count] %100 /10;
dsp[1] = ledk[juli_int];
juli_int = distance[count] %10;
dsp[0] = ledk[juli_int];
//juli_real = (float)(distance[count]/100.0 - juli_int);
}
}
/////////////////////////////////////
void display()
{
unsigned char i;
for ( i= 0;i<4;i++)
{
//dsp[i] = ledk[dsp[i]];
shift(dsp[i]);
switch ( i)
{
case 0:
P2 = 0xfe;delay(25);
break;
case 1:
P2 = 0xfd;delay(25);
break;
case 2:
P2 = 0xfb;delay(25);
break;
case 3:
P2 = 0xf7;delay(25);
break;
}
}
}
///////////////////////////小车停五秒子函数
void stop_5s(void)
{unsigned char s_sec=0,i;
//if(P32==0)
//{
//TH0=hi;TL0=lo;
//stop_count++;
//if(stop_count==20)
//s_sec++;
TR1=0;
P10=1;
P11=1;
P12=1;
P13=1;
//if(s_sec<=5)
//{
if(time<30)
{
P17=0;//停车声光信息
for (i=0;i<20;i++)
{
display();
}
P17=1;
}
//}
//else
//{P10=0;P12=0;}
}
/////////////////////////检测障碍物子函数
void zaw(void)
{
//unsigned char i;
///////////////////////
if(turn_l_time<3)
{
speedl=1;
speedr=254;
}
else
{
speedr=180;
speedl=230;
}
return;
/////////////////////
}
//
////////////////////
void c_sun(void)
{
///////////////////////
if(turn_r_time<5)
{
speedr=5;
speedl=250;
}
else
{ speedr=180;
speedl=230;
}
/*if(P03==1&&P14==1)
{
speedr=180;
speedl=230;
}
else
{
if(P03==1 && P14==0)
{ speedl=1;
speedr=250;
}
if(P14==1 && P03==0)
{
speedr=1;
speedl=250;
}
}*/
return;
///////////////////////
}
/////////////////
void cheting(void)
{ /*unsigned char i;
if(P06==0)
{
TR1=0;
P10=1;
P11=1;
P12=1;
P13=1;
//if(s_sec<=5)
//{
P17=0;//停车声光信息
for (i=0;i<20;i++)
{
display();
}
P17=1;
}*/
//if(P03==1&&P14==1)
{
speedr=180;
speedl=230;
}
//else
{
if(P03==1 && P14==0)
{ speedl=1;
speedr=250;
}
if(P14==1 && P03==0)
{
speedr=1;
speedl=250;
}
}
if(P03==0&&P14==0)
{
TR1=0;
Status=5;
}
if(P04==1&&P05==1)
{
TR1=0;
Status=5;
}
return;
}
void ButtonAction()
{
int juli;
unsigned char char_show ,i;
unsigned char Sw_Press;
P24=0;
P25=0;
P26=0;
P27=0;
if ( P37==0)
{
for (i=0;i<10;i++)
display();
if (P37==0)
{
P2=P2 & 0x0f;
P2=P2 |0xe0;
if(P37==0)
Sw_Press=1;//P24按下
P2=P2 & 0x0f;
P2=P2 |0xd0;
if(P37==0)
Sw_Press=2;//P25按下
P2=P2 & 0x0f;
P2=P2 |0xb0;
if(P37==0)
Sw_Press=3;//P26按下
P2=P2 & 0x0f;
P2=P2 |0x70;
if(P37==0)
Sw_Press=4;//P27按下
}
}
switch(Sw_Press)
{
case 1://P24按下
juli = (ms *20) /POINT_NUM;
char_show = juli /100;
dsp[2]=ledk[char_show];
char_show=(juli % 100)/10;
dsp[1]= ledk[char_show];
char_show=juli%10;
dsp[0]=ledk[char_show];
break;
case 2://P25按?
index++;
distance[index]=(ms*20 / POINT_NUM +ms1 * 20/POINT_NUM) / 2;
juli = distance[index]/100;
dsp[2] = ledk[juli];
//dsp[2] = dsp[2] | 0x80;
juli = distance[index] %100 /10;
dsp[1] = ledk[juli];
juli = distance[index] %10;
dsp[0] = ledk[juli];
dsp[3]=ledk[index+1];
if (index>count)
index=0;
break;
case 3://P26按下
break;
case 4://P27按下
break;
}
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -