自动升降旗控制程序c
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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,
*
*键盘扫描
*
*********************************************************/
main()
{TMOD=0x01;//T0一方式
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) //按键为1,电机正转运行
{TR0=0; //关掉定时中断
motor_turn();
TR0=1; //启动定时中断
temp=3;
display(n,l);
}
void delay1(int a)//显示延时子函数
{uint i;
for(i=0;i<a;i++);
}
void motor_ffw() //电机正转子程序
{uchar i;
for (i=0; i<8; i++) //一个周期转30度
{P1 = FFW[i]; //取数据
{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;
}
}
}
}
/********************************************************
if((P2&0x0f)!=0x0f)
{delay1(100); //消抖
if((P2&0x0f)!=0x0f)
{ {if(P2==0x0e)
rnum=0;
if(P2==0x0d)
rnum=1;
if(P2==0x0b)
rnum=2;
if(P2==0x07)
rnum=3;
}
P2=0xf0;
if((P2&0xf0)!=0xf0)
m=0;upflag=0;bqupflag=0;
}
else if(temp==12&&upflag==0) //按键为12,电机反转运行
{TR0=0;
g=1425;
l=0;
motor_REV1();
TR0=1;
temp=3;upflag=1;bqupflag=1;
}
else if(temp==4&&bqupflag==1) //按键为4,电机正反转运行到半旗状态
g=1425;
m=0;
motor_REV1();
temp=3;
bqupflag=1;
upflag=1;
TR0=1;
}
}
}
timer0() interrupt 1 using 1 //T0中断服务程序
{TR0=0;
TH0=-10000/256; //重装计数初值
TL0=-10000%256;
TR0=1;
if(temp==3)
count++;
if(avonum>0)
avonum--;//防重读数减一
if((avonum==0)&&(keyflag==0))//达到检测键盘条件且上个按键已处理
{keyscan(); //调用键盘扫描子程序
}
if(count/1000==1)
{count=0;
temp=7;
l=0;
} //10秒到,时间显示清零
display(n,l); //调用显示子程序
}
/*显示子程序*/
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);
void motor_turn()
{for(;t>0;t--)
{motor_ffw(); //匀速
}
}
void motor_REV1()
{for(;t<g;t++)
{motor_REV(); //匀速
}
}
keyscan() //键盘扫描子程序
{char lnum,rnum;
P2=0x0f;
//keyflag=0;
delay(); //调节转速
m++;
if(m%63==0)
n--; //电机每转1cm,显示高度减一
if(m%264==0)
l++; //显示时间加一
}
}
/********************************************************
*
*步进电机运行
*
*********************************************************/
/*
/*延时
/* 11.0592MHz时钟,
/*
/********************************************************/
void delay() //步进电机延时子程序
{uchar k;
uint s;
k = rate;
for(;k>0;k--)
{for(s = 0;s <340;s++);}
delay(); //调节转速
m++;
if(m%63==0)
n++; //电机每转1cm,显示高度加一
if(m%264==0)
l++; //显示时间加一
}
}
void motor_REV() //电机反转子程序
{ uchar i;
for (i=0; i<8; i++) //一个周期转30度
{ P1 = REV[i]; //取数据
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);
}
{TR0=0;
motor_turn();
m=0;
g=475;
motor_REV1();
temp=3;
bqupflag=0;
upfla百度文库=0;
t=475;
TR0=1;
}
else if(temp==10&&bqupflag==0) //按键为10,电机反正转运行到半旗状态
{TR0=0;
motor_turn();
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;
/********************************************************/
程序清单
#include <reg52.h>
#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};
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,
*
*键盘扫描
*
*********************************************************/
main()
{TMOD=0x01;//T0一方式
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) //按键为1,电机正转运行
{TR0=0; //关掉定时中断
motor_turn();
TR0=1; //启动定时中断
temp=3;
display(n,l);
}
void delay1(int a)//显示延时子函数
{uint i;
for(i=0;i<a;i++);
}
void motor_ffw() //电机正转子程序
{uchar i;
for (i=0; i<8; i++) //一个周期转30度
{P1 = FFW[i]; //取数据
{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;
}
}
}
}
/********************************************************
if((P2&0x0f)!=0x0f)
{delay1(100); //消抖
if((P2&0x0f)!=0x0f)
{ {if(P2==0x0e)
rnum=0;
if(P2==0x0d)
rnum=1;
if(P2==0x0b)
rnum=2;
if(P2==0x07)
rnum=3;
}
P2=0xf0;
if((P2&0xf0)!=0xf0)
m=0;upflag=0;bqupflag=0;
}
else if(temp==12&&upflag==0) //按键为12,电机反转运行
{TR0=0;
g=1425;
l=0;
motor_REV1();
TR0=1;
temp=3;upflag=1;bqupflag=1;
}
else if(temp==4&&bqupflag==1) //按键为4,电机正反转运行到半旗状态
g=1425;
m=0;
motor_REV1();
temp=3;
bqupflag=1;
upflag=1;
TR0=1;
}
}
}
timer0() interrupt 1 using 1 //T0中断服务程序
{TR0=0;
TH0=-10000/256; //重装计数初值
TL0=-10000%256;
TR0=1;
if(temp==3)
count++;
if(avonum>0)
avonum--;//防重读数减一
if((avonum==0)&&(keyflag==0))//达到检测键盘条件且上个按键已处理
{keyscan(); //调用键盘扫描子程序
}
if(count/1000==1)
{count=0;
temp=7;
l=0;
} //10秒到,时间显示清零
display(n,l); //调用显示子程序
}
/*显示子程序*/
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);
void motor_turn()
{for(;t>0;t--)
{motor_ffw(); //匀速
}
}
void motor_REV1()
{for(;t<g;t++)
{motor_REV(); //匀速
}
}
keyscan() //键盘扫描子程序
{char lnum,rnum;
P2=0x0f;
//keyflag=0;
delay(); //调节转速
m++;
if(m%63==0)
n--; //电机每转1cm,显示高度减一
if(m%264==0)
l++; //显示时间加一
}
}
/********************************************************
*
*步进电机运行
*
*********************************************************/
/*
/*延时
/* 11.0592MHz时钟,
/*
/********************************************************/
void delay() //步进电机延时子程序
{uchar k;
uint s;
k = rate;
for(;k>0;k--)
{for(s = 0;s <340;s++);}
delay(); //调节转速
m++;
if(m%63==0)
n++; //电机每转1cm,显示高度加一
if(m%264==0)
l++; //显示时间加一
}
}
void motor_REV() //电机反转子程序
{ uchar i;
for (i=0; i<8; i++) //一个周期转30度
{ P1 = REV[i]; //取数据
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);
}
{TR0=0;
motor_turn();
m=0;
g=475;
motor_REV1();
temp=3;
bqupflag=0;
upfla百度文库=0;
t=475;
TR0=1;
}
else if(temp==10&&bqupflag==0) //按键为10,电机反正转运行到半旗状态
{TR0=0;
motor_turn();
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;
/********************************************************/
程序清单
#include <reg52.h>
#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};