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

有两个按钮和一个输出继电器。按一下按钮1,此时如果不按按钮2,输出继电器吸合三秒后释放。当按一下按钮1,在没达到三秒前连续按按钮2,按下的间隔不超过1秒,继电器一直吸合,... 有两个按钮和一个输出继电器。按一下按钮1,此时如果不按按钮2,输出继电器吸合三秒后释放。当按一下按钮1,在没达到三秒前连续按按钮2,按下的间隔不超过1秒,继电器一直吸合,当一秒钟内没有按按钮2,继电器释放。(在没按按钮1时,按按钮2继电器不吸合。) 展开
 我来答
lishimin1972
推荐于2016-02-27 · TA获得超过741个赞
知道小有建树答主
回答量:391
采纳率:0%
帮助的人:449万
展开全部
#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);             //所有的动作均在中断函数内完成
}
查晓筠0i5
2015-01-21 · TA获得超过2752个赞
知道大有可为答主
回答量:2.1万
采纳率:1%
帮助的人:4912万
展开全部
需要给你完成一份吗
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式