51单片机自动控制升旗系统.docx
- 文档编号:7126659
- 上传时间:2023-01-20
- 格式:DOCX
- 页数:14
- 大小:37.44KB
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;t1 for(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; } } } } 电路原理图如下所示:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 自动控制 升旗 系统
![提示](https://static.bdocx.com/images/bang_tan.gif)