请高手帮我做一个51单片机程序,C语言,万分感谢
stc89c52,晶振12M,2.12.22.32.4接4个按键开关,3.13.23.33.4对应接4个继电器模块(低电平有效),要求2.1按一下3.1继电器闭合6秒左右...
stc89c52,晶振12M,2.1 2.2 2.3 2.4 接4个按键开关,3.1 3.2 3.3 3.4对应接4个继电器模块(低电平有效),要求2.1按一下3.1继电器闭合6秒左右,然后自动断开,2.2按一下3.2闭合8秒,然后自动断开,2.3按一下3.3闭合2秒,然后自动断开,2.4按一下3.4闭合3秒,然后自动断开,如果在继电器闭合的时间之内按一下任意一个按键,继电器马上断开,再按一下闭合相应的继电器,例如按2.1,继电器3.1闭合,6秒之内按2.2, 继电器3.1马上断开,再按2.2,继电器3.2闭合,8秒后自动断开
展开
展开全部
/*
stc89c52,晶振12M.P2.1,P2.2,P2.3,P2.4接4个按键开关分别控制P3.1,P3.2,P3.3,P3.4的输出(L有效)
P2.1按一下,P3.1输出6S
P2.2按一下,P3.2输出8S
P2.3按一下,P3.3输出2S
P2.4按一下,P3.4输出3S
如果在继电器闭合的时间之内按一下任意一个按键,则输出全部无效,再次按下才实现相应功能
*/
#include<REG52.H>
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#define FOSC 12000000L //晶振频率
#define CLK_MODE 12 //时钟模式,12T模式
#define SYSCLK (FOSC / CLK_MODE) //系统时钟
#define _50MS (SYSCLK / 20) //50ms
u8 Time; //计时器
sbit OUT_6S = P3^1;
sbit OUT_8S = P3^2;
sbit OUT_2S = P3^3;
sbit OUT_3S = P3^4;
void InitTimer0(void)
{
if(! TR0)
{
TMOD &= 0x0f;
TMOD |= 0x01; //T/C0定时器模式1
TL0 = (65536 - _50MS) % 256;
TH0 = (65536 - _50MS) / 256;
TR0 = 1; //打开T/C0
IE |= 0x82; //使能T/C0中断和总中断
}
else
{
TR0 = 0; //T/C0停止
IE &= ~2; //禁止T/C0中断
}
}
void Delay(void)
{
u16 i;
for(i = 5000;i != 0;i --)
;
}
void Time0Isr(void)interrupt 1
{
TL0 = (65536 - _50MS) % 256;
TH0 = (65536 - _50MS) / 256;
if(-- Time == 0)
{
P3 |= 0x1e;
IE &= ~0x02;
TR0 = 0;
}
}
void main(void)
{
u8 i,j;
while(1)
{
i = P2 & 0x1e;
if(i != 0x1e)
{
Delay();
j = P2 & 0x1e;
if(i == j) //两次键值相等,识别为正确按键
{
InitTimer0();
if(TR0)
{
switch(i)
{
case 0x0e:
OUT_3S = 0;Time = 3 *SYSCLK / _50MS;break;
case 0x16:
OUT_2S = 0;Time = 2 *SYSCLK / _50MS;break;
case 0x1a:
OUT_8S = 0;Time = 8 *SYSCLK / _50MS;break;
case 0x1c:
OUT_6S = 0;Time = 6 *SYSCLK / _50MS;break;
}
}
else P3 |= 0x1e;
}
while(i == (P2 & 0x1e))
;
}
}
}
追问
这位高手非常感谢,我按照你的做法一下就成功了,能不能再帮我加几个功能,就是P2..5 P2.6再加两个按键开关,条件是2.5在1秒内连续按两下先3.4闭合3秒再3.2闭合8秒,2.6在1秒内连续按两下3.1闭合6秒
展开全部
#include <reg52.h>
sbit K1=P2^1;
sbit K2=P2^2;
sbit K3=P2^3;
sbit K4=P2^4;
sbit RY1=P3^1;
sbit RY2=P3^2;
sbit RY3=P3^3;
sbit RY4=P3^4;
unsigned int n=0;
unsigned int count=0;
bit flag=0;
void Timer0Init(void) //50毫秒@12.000MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void main()
{
Timer0Init();
EA=1;
ET0=1;
while(1)
{
if((P3&0x1E)!=0x1E&&(P2&0x1E)!=0x1E)
{
flag=0;
P3|=0x1E;
while((P2&0x1E)!=0x1E);
}
else
{
switch(P2&0x1E)
{
case 0x1C:RY1=0;RY2=1;RY3=1;RY4=1;while((P2&0x1E)!=0x1E);flag=1;n=(6*1000/50);count=0;break;
case 0x1A:RY1=1;RY2=0;RY3=1;RY4=1;while((P2&0x1E)!=0x1E);flag=1;n=(8*1000/50);count=0;break;
case 0x16:RY1=1;RY2=1;RY3=0;RY4=1;while((P2&0x1E)!=0x1E);flag=1;n=(2*1000/50);count=0;break;
case 0x0E:RY1=1;RY2=1;RY3=1;RY4=0;while((P2&0x1E)!=0x1E);flag=1;n=(3*1000/50);count=0;break;
default :break;
}
}
}
}
void timer0() interrupt 1
{
TR0=0;
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
if(flag)
{
if(++count<n)
{
;
}
else
{
flag=0;
P3|=0x1E;
}
}
TR0=1;
}
追问
好像少了按键消抖,有时灵有时不灵
追答
#include <reg52.h>
sbit K1=P2^1;
sbit K2=P2^2;
sbit K3=P2^3;
sbit K4=P2^4;
sbit RY1=P3^1;
sbit RY2=P3^2;
sbit RY3=P3^3;
sbit RY4=P3^4;
unsigned int n=0;
unsigned int count=0;
bit flag=0;
void Timer0Init(void) //50毫秒@12.000MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void main()
{
Timer0Init();
EA=1;
ET0=1;
while(1)
{
if((P3&0x1E)!=0x1E)
{
if((P2&0x1E)!=0x1E)
{
flag=0;
P3|=0x1E;
while((P2&0x1E)!=0x1E);
}
}
else
{
switch(P2&0x1E)
{
case 0x1C:RY1=0;RY2=1;RY3=1;RY4=1;while((P2&0x1E)!=0x1E);flag=1;n=(6*1000/50);count=0;break;
case 0x1A:RY1=1;RY2=0;RY3=1;RY4=1;while((P2&0x1E)!=0x1E);flag=1;n=(8*1000/50);count=0;break;
case 0x16:RY1=1;RY2=1;RY3=0;RY4=1;while((P2&0x1E)!=0x1E);flag=1;n=(2*1000/50);count=0;break;
case 0x0E:RY1=1;RY2=1;RY3=1;RY4=0;while((P2&0x1E)!=0x1E);flag=1;n=(3*1000/50);count=0;break;
default :break;
}
}
}
}
void timer0() interrupt 1
{
TR0=0;
TL0 = 0xB0; //设置定时初值
TH0 = 0x3C; //设置定时初值
if(flag)
{
if(++count>=n)
{
flag=0;
P3|=0x1E;
}
}
TR0=1;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
主循环里不停地扫描各按键,任意一个按下后控制相应继电器吸合并启动相应的定时器(未到定时器触发时按下其它按键的话断开继电器并关闭相应的定时器),定时器触发后断开继电器并关闭相应的定时器
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询