logo资料库

自动升降旗控制程序c51.doc

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
程序清单 #include #define uchar unsigned char #define uint unsigned int uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; uchar keysbuf,avonum=0,temp; bit keyflag=0,upflag=1,bqupflag=1; uint t=1425,rate=1,m=0,n=0,x,g,l=0,count=0; void display(unsigned int i,k); char code anjian[]={7,8,9,12, 4,5,6,13, 1,2,3,10, 0,14,15,11}; unsigned char dis[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uint a,b,c,d,e,f; /********************************************************/ /* /* 延时 /* 11.0592MHz 时钟, /* /********************************************************/ void delay() {uchar k; uint s; k = rate; for(;k>0;k--) {for(s = 0;s <340;s++);} display(n,l); } void delay1(int a) {uint i; for(i=0;i
l++; } } void motor_REV() { uchar i; for (i=0; i<8; i++) { P1 = REV[i]; delay(); m++; if(m%63==0) n--; if(m%264==0) l++; } //显示时间加一 //电机反转子程序 //一个周期转 30 度 //取数据 //调节转速 //电机每转 1cm,显示高度减一 //显示时间加一 } /******************************************************** * *步进电机运行 * *********************************************************/ void motor_turn() { for(;t>0;t--) {motor_ffw(); //匀速 //匀速 //键盘扫描子程序 //消抖 } } void motor_REV1() {for(;t
rnum=3; } P2=0xf0; if((P2&0xf0)!=0xf0) { if(P2==0xe0) lnum=0; if(P2==0xd0) lnum=1; if(P2==0xb0) lnum=2; if(P2==0x70) lnum=3; keyflag=1; keysbuf=rnum*4+lnum; } } } //T0 一方式 } /******************************************************** * *键盘扫描 * *********************************************************/ main() {TMOD=0x01; TH0=-10000/256; TL0=-10000%256; EA=1; ET0=1; TR0=1; P1=0xf0; while(1) { if(keyflag!=0) {keyflag=0;temp=anjian[keysbuf]; avonum=20;} if(temp==1&&upflag==1) {TR0=0; motor_turn(); TR0=1; temp=3; m=0;upflag=0;bqupflag=0; } //按键为 1,电机正转运行 //有按键否? //关掉定时中断 //启动定时中断 else if(temp==12&&upflag==0) {TR0=0; //按键为 12,电机反转运行
//按键为 4,电机正反转运行到半旗状态 //按键为 10,电机反正转运行到半旗状态 g=1425; l=0; motor_REV1(); TR0=1; temp=3;upflag=1;bqupflag=1; } else if(temp==4&&bqupflag==1) {TR0=0; motor_turn(); m=0; g=475; motor_REV1(); temp=3; bqupflag=0; upflag=0; t=475; TR0=1; } else if(temp==10&&bqupflag==0) {TR0=0; motor_turn(); g=1425; m=0; motor_REV1(); temp=3; bqupflag=1; upflag=1; TR0=1; } } } timer0() interrupt 1 using 1 { TR0=0; TH0=-10000/256; TL0=-10000%256; TR0=1; if(temp==3) count++; if(avonum>0) avonum--; if((avonum==0)&&(keyflag==0)) 理 {keyscan(); } //T0 中断服务程序 //重装计数初值 //防重读数减一 //达到检测键盘条件且上个按键已处 //调用键盘扫描子程序
if(count/1000==1) {count=0; temp=7; l=0; } display(n,l); //10 秒到,时间显示清零 //调用显示子程序 } /*显示子程序*/ void display(unsigned int i,k) { a=i/100; b=i%100/10; c=i%100%10; d=l/10; e=l%10; P0=dis[c]; P1=0xa0; delay1(48); if((b||a)!=0) {P0=dis[b]; P1=0x80; delay1(10);} if(a!=0) {P0=dis[a]; P1=0x60; delay1(10);} P0=dis[e]; P1=0x20; delay1(10); P0=dis[d]; P1=0x00; delay1(10); }
分享到:
收藏