求51单片机C语言程序编程思路

有两个按钮和一个输出继电器。按一下按钮1,此时如果不按按钮2,输出继电器吸合三秒后释放。当按一下按钮1,在没达到三秒前连续按按钮2,按下的间隔不超过1秒,继电器一直吸合,当一秒钟内没有按按钮2,继电器释放。(在没按按钮1时,按按钮2继电器不吸合。)

#include <AT89X51.H>
//假定继电器是安装在P3.5,按键分别安装在P3.6, P3.7,时钟频率12MHz
sbit sw1=P3^6;
sbit sw2=P3^7;
sbit relay=P3^5;
 
void SetupTimer0()
{
    TMOD &=    0XF0; //仅保留T1信息
    TMOD |=    0X02; //设置T0:  定时功能,方式2,自动重载8位定时器/计数器
    TH0 = 256-250;//定时每0.25ms中断一次
    TL0 = 256-250;
    TR0 = 1;     //开启定时器
    ET0 = 1;     //定时器0中断打开
}
 
data unsigned char us250;
data unsigned int relay_timer;

void Timer0_ISR() interrupt   1 //定时中断服务程序,为按键消抖服务
{
//如果一个动作过程刚刚开始,则设定继电器延时3000ms,并打开继电器
if (0==relay_timer && 0==sw1) {relay_timer=3000; relay=1;}

    if (++us250>=4) //250us中断一次,每四次得到1ms
    {
     us250=0; 
     if(relay_timer==0) relay=0; //如继电器延时为0,则关继电器
     else --relay_timer;         //否则继电器延时递减
    }
    
//如果当前正处于一个动作过程且有sw2按下,则修改继电器延时为1000ms
if (relay_timer && 0==sw2) relay_timer=1000;
}
 
void main()
{
us250=0;
relay_timer=0;
relay=0;
    SetupTimer0();
    EA = 1;               //全局中断打开
    while(1);             //所有的动作均在中断函数内完成
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-01-21
需要给你完成一份吗
相似回答