51单片机自动控制升旗系统.docx
《51单片机自动控制升旗系统.docx》由会员分享,可在线阅读,更多相关《51单片机自动控制升旗系统.docx(14页珍藏版)》请在冰豆网上搜索。
51单片机自动控制升旗系统
/**********************51单片机升旗系统***************************/
/**************步进电机升旗和降旗,蜂鸣器奏国歌,******************/
/***************数码管显示系统时间和高度***************************/
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodeFFW[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//正转的步码
ucharcodeREV[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//反转的步码
ucharth[]={0x0f,0x5d,0xab};//3个定时器值,高8位
uchartl[]={0xa0,0xc0,0xe0};//3个定时器值,低8位
codeucharSZ[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管
unsignedintcodeFreqTab1[]={
64216,64360,64489,64547,64654,64752,64837,
64876,64948,65012,65042,65095,65144,65186,
65206,65242,65274,65289,65135,65340,65361,
};
unsignedintcodeFreqTab[]={//简谱对应的简谱码、T值
65535,64260,64400,64524,64579,64685,64778,64860,
64898,64968,65030,65057,65110,65157,65198,
65217,65252,65283,65297,65323,65346,65367,
};
unsignedcharcodeyyjjxq[]={
8,0x08,0,0x04,5,0x04,
8,0x0c,8,0x04,
8,0x06,8,0x02,5,0x04,6,0x02,7,0x02,
8,0x08,8,0x08,
0,0x04,10,0x04,8,0x04,9,0x02,10,0x02,
//10,0x04,10,0x04,8,0x04,9,0x02,10,0x02,
12,0x08,12,0x08,
10,0x06,10,0x02,8,0x06,10,0x02,
12,0x06,10,0x02,9,0x08,
//12,0x10,
9,0x10,
13,0x08,12,0x08,
9,0x08,10,0x08,
12,0x04,10,0x04,0,0x04,12,0x04,
//12,0x04,10,0x04,10,0x04,12,0x04,
10,0x04,9,0x02,10,0x02,8,0x08,
10,0x08,0,0x08,
//10,0x08,10,0x08,
5,0x06,6,0x04,8,0x04,8,0x04,
10,0x06,10,0x02,12,0x04,12,0x04,
9,0x04,9,0x02,9,0x02,6,0x08,
9,0x0c,5,0x04,
8,0x0c,8,0x04,
10,0x0c,10,0x04,
12,0x10,
8,0x06,10,0x02,12,0x04,12,0x04,
13,0x08,12,0x08,
10,0x06,8,0x02,12,0x08,
10,0x04,0,0x04,8,0x04,0,0x04,
//10,0x04,10,0x04,8,0x04,8,0x04,
5,0x08,8,0x08,
10,0x06,8,0x02,12,0x08,
10,0x04,0,0x04,8,0x04,0,0x04,
//10,0x04,10,0x04,8,0x04,8,0x04,
5,0x08,8,0x08,
5,0x08,8,0x08,
5,0x08,8,0x08,
8,0x08,0,0x08,
//8,0x08,
0xff,0xff,
};
ucharspeed_count=2;
ucharflag=0;
bittimer_flag=0;
bitMOTOR_FFW_FLAG=0;
bitMOTOR_REV_FLAG=0;
sbitK1=P3^0;//正转
sbitK2=P3^1;//反转
sbitK5=P3^4;//停止
sbitled1=P2^0;
sbitled2=P2^1;
sbitled3=P2^2;
sbitled4=P2^3;
sbitled5=P2^4;
sbitled6=P2^5;
sbitbeep=P3^7;
voidsmg_display();
voidK1_stop_state();
voidK2_stop_state();
voidK5_stop_state();
voidmusic();
ucharnum1=0,num2=0,num3=0;
uintt=0,Time=0,Length=0;
uchara=0;
uchartl0,th0;
voiddelay(unsignedchart)//-----延时函数----------//
{
unsignedchart1;
unsignedlongt2;
for(t1=0;t1for(t2=0;t2<770;t2++);
TR0=0;
}
voiddelayms(unsignedintx)
{
unsignedinta,b;
for(a=x;a>0;a--)
for(b=124;b>0;b--);
}
voidDTIME(intn)//延时程序
{
uchari;
for(i=0;i<50*n;i++)
;
}
voidtimer0()interrupt1
{
TR0=0;
beep=~beep;
TL0=tl0;
TH0=th0;
TR0=1;
}
voidtimer1_init()
{
//定时器初始化
TH1=(65536-8000)/256;
TL1=(65536-8000)%256;
ET1=0;
}
/*voidtimer0(void)interrupt1
{
TH0=th[speed_count];
TL0=tl[speed_count];
timer_flag=1;
}
voidup(void)interrupt0//加速
{
speed_count++;
if(speed_count>2)speed_count=2;
}
voiddown(void)interrupt2//减速
{
speed_count--;
if(speed_count<0)speed_count=0;
}*/
voidT1_time()interrupt3//定时器函数
{
TH1=(65536-8000)/256;
TL1=(65536-8000)%256;
num1++;
num2++;
num3++;
smg_display();
}
voidSETP_MOTOR_FFW()//电机正转
{
uchari;
P1=FFW[i];DTIME(5);
i++;
if(i==8)i=0;
}
voidSETP_MOTOR_REV()//电机反转
{
uchari;
P1=REV[i];DTIME(5);
i++;
if(i==8)i=0;
}
voidmain()
{
ucharN=10;
TMOD=0x11;
ET0=1;
EX0=1;
IT0=1;//外部中断0
EX1=1;
IT1=1;//外部中断1
EA=1;
timer1_init();
while
(1)
{
if(K1==0)
{
if(MOTOR_FFW_FLAG==0)
{
flag=1;
TR1=1;
smg_display();
music();
}
}
elseif(K2==0)
{
if(MOTOR_REV_FLAG==0)
{
flag=2;
TR1=1;
smg_display();
}
}
elseif(K5==0)
{
P0=0xfb;
P1=0x03;
}
}
}
voidsmg_display()
{
switch(++t%6)
{
case0:
P2|=0xff;
led1=0;
P0=SZ[Time/10];
break;
case1:
P2|=0xff;
led2=0;
P0=SZ[Time%10];
break;
/*case2:
P2|=0xff;
led3=0;
P0=SZ[Time%100%10];
break;*/
case3:
P2|=0xff;
led4=0;
P0=SZ[Length/100];
break;
case4:
P2|=0xff;
led5=0;
P0=SZ[Length/10%10];
break;
case5:
P2|=0xff;
led6=0;
P0=SZ[Length%100%10];
break;
}
DTIME
(1);
if(t>500)
t=0;
if(flag!
=1&&flag!
=2)
{
Time=0;
}
if(flag==1)
{
if(K5==0)
{
K5_stop_state();
}
ET1=1;
TR1=1;
if(num3==5)
{
num3=0;
SETP_MOTOR_FFW();
}
if(num1==100)
{
num1=0;
Time++;
if(Time==43)
{
a=Length;
MOTOR_FFW_FLAG=1;
MOTOR_REV_FLAG=0;
K1_stop_state();
}
}
if(num2==24)
{
num2=0;
Length++;
}
}
if(flag==2)
{
if(num3==5)
{
num3=0;
SETP_MOTOR_REV();
}
if(num1==100)
{
num1=0;
Time--;
if(Time==0)
{
a=Length;
a++;
MOTOR_FFW_FLAG=0;
MOTOR_REV_FLAG=1;
K2_stop_state();
}
}
if(num2==24)
{
num2=0;
Length--;
}
}
}
voidK1_stop_state()
{
while
(1)
{
P2|=0xff;
led1=0;
P0=SZ[Time/10];
DTIME
(2);
P2|=0xff;
led2=0;
P0=SZ[Time%10];
DTIME
(2);
/*case2:
P2|=0xff;
led3=0;
P0=SZ[Time%100%10];
break;*/
P2|=0xff;
led4=0;
P0=SZ[a/100];
DTIME
(2);
P2|=0xff;
led5=0;
P0=SZ[a/10%10];
DTIME
(2);
P2|=0xff;
led6=0;
P0=SZ[a%100%10];
DTIME
(2);
if(K2==0){flag=2;break;}
}
}
voidK2_stop_state()
{
while
(1)
{
P2|=0xff;
led1=0;
P0=SZ[Time/10];
DTIME
(2);
P2|=0xff;
led2=0;
P0=SZ[Time%10];
DTIME
(2);
/*case2:
P2|=0xff;
led3=0;
P0=SZ[Time%100%10];
break;*/
P2|=0xff;
led4=0;
P0=SZ[a/100];
DTIME
(2);
P2|=0xff;
led5=0;
P0=SZ[a/10%10];
DTIME
(2);
P2|=0xff;
led6=0;
P0=SZ[a%100%10];
DTIME
(2);
if(K1==0){flag=1;break;}
}
}
voidK5_stop_state()
{
P2|=0xff;
led1=0;
P0=SZ[0];
while
(1);
}
voidmusic()
{
unsignedchark;
ET0=1;
while
(1)
{
if(yyjjxq[k]==0xff)
{
beep=1;
TR0=0;
delayms(50);
}
else
{
if(yyjjxq[k]==0x00)
{
TR0=0;
delay(yyjjxq[k+1]);
k+=2;
}
else
{
th0=FreqTab[yyjjxq[k]]/256;
tl0=FreqTab[yyjjxq[k]]%256;
TR0=1;
delay(yyjjxq[k+1]);
k+=2;
}
}
}
}
电路原理图如下所示: