要求:
89S51 单片机
四个按键A B C D 分别接到任意四个IO脚和地之间;
如果按一下A键时,过3分钟P2.0输出1;
如果按一下B键时,过10分钟P2.0输出1;
如果按一下C键时,过15分钟P2.0输出1;
如果按一下D键时,过20分钟P2.0输出1;
高分:求20分钟单片机 延时C程序
答案:3 悬赏:30 手机版
解决时间 2021-03-10 02:30
- 提问者网友:我没有何以琛的痴心不悔
- 2021-03-09 02:50
最佳答案
- 五星知识达人网友:拜訪者
- 2021-03-09 03:55
#include
sbit AA=P1^0;
sbit BB=P1^1;
sbit CC=P1^2;
sbit DD=P1^3;
sbit output=P2^0;//电平输出端口
volatile unsigned char complete_flag=1;//4种状态输出完成标志;
unsigned char minute_timer;//定时器定时时间;
void key_delay(unsigned char t)
{
unsigned char i,j;
while(t--)
for(i=10;i>0;i--)
for(j=112;j>0;j--);
}
void timer0_init()
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
ET0=1;
EA=1;
}
void key_scan()
{
if((P1&0x0f)!=0x0f)
{
key_delay(10);
switch(P1&0x0F)
{
case 0x0e:TR0=1;minute_timer=3;break;
case 0x0d:TR0=1;minute_timer=10;break;
case 0x0b:TR0=1;minute_timer=15;break;
case 0x07:TR0=1;minute_timer=20;break;
default:break;
}
}
if(TR0)complete_flag=0;
}
void main()
{
timer0_init();
output=0;
while(1)
{
if(complete_flag)
{
key_scan();
}
}
}
void timer_isovf()interrupt 1
{
static unsigned char second,minute;
static unsigned char mini_second_50ms;//50ms
TH0=0x3c;
TL0=0xb0;
if(++mini_second_50ms>=20)
{
mini_second_50ms=0;
if(++second>=60)
{
second=0;
if(++minute>=minute_timer)
{
minute=0;
TR0=0;
complete_flag=1;
output=1;
}
}
}
}
全部回答
- 1楼网友:怀裏藏嬌
- 2021-03-09 05:53
#include<reg52.h>
sbit p10=p1^0;
sbit p11=p1^1;
sbit p12=p1^2;
sbit p13=p1^3;
unsigned char count=0;
unsigned char half_min=0;
void main()
{
tmod=0x01;
th0=0x3c;
tl0=0xb0;
et0=1;
ea=1;
tr0=1;
while(1);
}
void timer_0() interrupt 1
{
th0=0x3c;
tl0=0xb0;
count++;
if(count>10) //大于10则为500ms
{half_min++;
count=0;
switch(half_min)
{
case 9:p10=0;break; //4分半
case 10:p11=0;break; //5分
case 20:p12=0;break; //10分
case 30:p13=0;tr0=0;break; //15分
default:break;
}
}
}
- 2楼网友:煞尾
- 2021-03-09 05:25
告诉你大概思路
首先肯定要用个定时器
做成一个1秒的定时中断(我习惯用方式2循环4000次)
定义4个变量,将这4个变量先置0,当按键A B C D 按下时,变量置1
到3分钟时判断A的变量是否为1,为1的话P2.0输出1(P2.0先置0),同时将A的变量清掉,重新赋值,等待下一个3分钟再判断
B C D和A的方法一样
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯