发表于 2014-03-13 19:54 IP属地:未知
我把当初编程时写的源代码公布给大家看看,本来准备写好详细的注释的,后来忙着忙着就耽误了。其实大部分注释都写好了,还剩下少部分,现在也没时间去补充了。
有兴趣就看看,看不懂也别问我,我没有精力去解答的。
以下是全部程序代码:
/*正式程序:
第一次上电自检,小幅度开盖然后闭盖,防止手动安装未到位及其他情形。
按一次按钮打开,再按一次按钮关闭;当打开时如果拔钥匙也将自动关机。
控制导航仪电源,由于特殊性,电源控制和盖子不一定同步。*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sfr WDT_CONTR=0xe1; //启用看门狗
sbit power_gps=P1^5; //导航仪电源,0打开、1关闭
sbit led=P1^6; //光电开关led电源(闭盖检测用),0打开、1关闭
sbit hall=P1^7; //霍尔开关电源(开盖检测用),0打开、1关闭
sbit check_keyoff=P0^5; //读取钥匙电状态,0有电、1无电
sbit check_open=P0^6; //霍尔开关检测口,0收到信号、1没有信号
sbit check_close=P0^7; //光电开关检测口,0收到信号、1没有信号
sbit motor1=P1^0; //motor1、motor2通过L298N控制电机
sbit motor2=P1^1;
sbit key=P2^2; //中控开关按键
uchar flag,flag_open,flag_keyoff,x,y,flag_gpsoff;
//flag:盖子开闭标识;
/*flag_open:开盖程序中判断到位停止用,三种情形下开盖动作停止,
即开到位(霍尔开关收到信号)、开过程中按按键了、开过程中拔钥匙了;*/
//flag_keyoff,x,y:定时器0中判断是否拔钥匙动作;
//flag_gpsoff:反映导航仪电源三种状态,由定时器1判断
uint num_keyoff,num_gpsoff; //判断拔钥匙和导航电源两个定时器里用的计数
void delayms(uint xms) //延时子程序
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void open(uchar z) //控制开盖子程序,参数z为1进入正常的开机程序,非1用于自检
{
motor1=1;motor2=0; //电机开
delayms(750); //延时目的是打开让光电开关能动作的角度
if(z==1) //开机自检就略过此段
{
hall=0;
x=1;y=1;
num_keyoff=0;
TR0=1;
flag_keyoff=0;
flag_open=1;
if(flag_gpsoff==1)
{
power_gps=0;
TR1=1;
}
if(flag_gpsoff==2)
{
power_gps=0;
TR1=0;
num_gpsoff=0;
}
while(flag_open)
{
WDT_CONTR=0x35;
if(check_open==0)
{
flag_open=0;
if(flag_gpsoff==1)
{
power_gps=0;
TR1=1;
}
}
if(key==0)
{
delayms(10);
if(key==0)
{
while(!key);
flag_open=0;
flag_keyoff=1;
}
}
if(flag_keyoff==1)
flag_open=0;
}
hall=1;
flag=1;
}
motor1=1;motor2=1;
}
void close() //控制闭盖子程序
{
uchar num,num1,num2,a,b;
if(flag_gpsoff==2)
{
power_gps=1;
TR1=1;
}
motor1=0;motor2=1;
TR0=0;
led=0;
num=0;num1=0;
while(num<14)
{
num=0;
for(num2=32;num2>0;num2--)
{
num1++;
if(num1==2)
num1=0;
if(num1==1)
{
led=1;
delayms(1);
if(check_close==1)
a=1;
else
a=0;
}
if(num1==0)
{
led=0;
delayms(1);
if(check_close==0)
b=1;
else
b=0;
if(a==b)
num++;
}
}
WDT_CONTR=0x35;
}
delayms(300);
motor1=1;motor2=1;
flag=0;
led=1;
}
void keyscan() //按钮扫描子程序
{
if(key==0)
{
delayms(10);
if(key==0)
{
while(!key);
switch(flag)
{
case 0:
open(1);
break;
case 1:
close();
break;
}
}
}
}
void init() //上电初始化程序,导航盖打开很小角度后再闭合
{
led=1;hall=1;power_gps=1;
TMOD=0x11;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;
ET0=1;
ET1=1;
flag_gpsoff=1;
open(0);
WDT_CONTR=0x35;
delayms(100);
close();
}
未完,下页继续