求51单片机C语言程序编程思路
有两个按钮和一个输出继电器。按一下按钮1,此时如果不按按钮2,输出继电器吸合三秒后释放。当按一下按钮1,在没达到三秒前连续按按钮2,按下的间隔不超过1秒,继电器一直吸合,...
有两个按钮和一个输出继电器。按一下按钮1,此时如果不按按钮2,输出继电器吸合三秒后释放。当按一下按钮1,在没达到三秒前连续按按钮2,按下的间隔不超过1秒,继电器一直吸合,当一秒钟内没有按按钮2,继电器释放。(在没按按钮1时,按按钮2继电器不吸合。)
展开
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); //所有的动作均在中断函数内完成
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询