http://zhidao.baidu.com/question/548570658.html?push=1&group=1
#include
sbit S1=P0^0;//端口定义
sbit S2=P0^1;//端口定义
sbit S3=P0^2;//端口定义
sbit S4=P0^3;//端口定义
sbit D1=P1^0;//端口定义
sbit D2=P1^1;//端口定义
sbit D3=P1^2;//端口定义
sbit D4=P1^3;//端口定义
/********************定时器初始化子函数**********/
void Timer0_On(void)
{
TMOD= 0x01;//定时器寄存器设置
TH0=1;//设置几时初值
EA=1;//开总中断
ET0=1;//开定时器中断允许
TR0=1;//开定时器0
}
/***********************************************/
int Time_ms=0;//变量初始化
/******************定时中断子函数****************/
void time0 (void) interrupt 1
{
TH0= 0xFC;//定时中断1mS @ 12MHz fosc//重复装计时初值(高位)
TL0= 0x1A;//重复装计时初值(低位)
Time_ms++;//每次中断计时变量加一
}
/************************************************/
/************************主函数******************/
void main(void)
{
long int DY[4]={4000,4000,4000,4000};//数组定义用来存放端口状态
unsigned char i;//用来循环计数用
Timer0_On();//开定时器0
D1=1;D2=1;D3=1;D4=1;//初始化输出端口
while (1)//用于程序执行的大循环
{
if (Time_ms=3000)//判断计时变量是否达到要求的计时
{
Time_ms=0;//循环计时
}
if ((S1==1)&&(DY[0]=4000)) DY[0]=Time_ms;//若输入变为高电平,则记下当前时间
if ((S2==1)&&(DY[1]=4000)) DY[1]=Time_ms;//若输入变为高电平,则记下当前时间
if ((S3==1)&&(DY[2]=4000)) DY[2]=Time_ms;//若输入变为高电平,则记下当前时间
if ((S4==1)&&(DY[3]=4000)) DY[3]=Time_ms;//若输入变为高电平,则记下当前时间
for(i=0;i<4;i++)//遍历四个变量,找出到达上秒的
{
if((DY[i]<=3000)&&(DY[i]==Time_ms+1))//如果Time_ms和DY[i]再次相等,则正好计时三秒,即可把相应的端口变为低电平
//如果DY[i]大于3000说明此端口没有计时
{
switch(i)//判断端口,对相应位置0
{
case 0:D1=0;
case 1:D2=0;
case 2:D3=0;
case 3:D4=0;
}
DY[i]=4000;//在这里计时3秒已经完成,相应的位已经置0 ,最后把端口状态转为无计时
}
}
if (S1==0) D0=1;//在任何时候输入为低电平的时候,输出为高电平
if (S2==0) D1=1;//在任何时候输入为低电平的时候,输出为高电平
if (S3==0) D2=1;//在任何时候输入为低电平的时候,输出为高电平
if (S4==0) D3=1;//在任何时候输入为低电平的时候,输出为高电平
}
}
未编译运行,可能存在错误,但思路没问题。
good luck!
步行者====电子单片机团
1320249827@qq.com
加个延时函数 ,延时函数网上找去, 写个函数传入DY[*]的值,然后判断再延时返回1或0就可以了。
还有if(time_ms >1000)是不是该去掉 不然会计时不准确的哦…
我明明回答了,可恨的百度知道!