51单片机10s内无操作就执行某一已操作怎么实现?
答案:3 悬赏:50 手机版
解决时间 2021-11-13 18:41
- 提问者网友:两耳就是菩提
- 2021-11-13 13:28
51单片机10s内无操作就执行某一已操作怎么实现?
最佳答案
- 五星知识达人网友:执傲
- 2021-11-13 14:29
定时,当然要用定时器了,就得写一个定时中断子程序,定时多少,计数中断次数,累计到10S就进行一下操作。很简单的事吗。
定时器的程序你应该写过吧,还是照样写吗。只不过是10S到了,就进行下一个操作吗。追问请问在主程序里怎么开定时器啊,直接TR0=1;这样吗?追答定时器的程序都没有写过呀,在百度这里随便就可以找到一大堆的程序,还是看看再说吧。追问我都看过了,但是我看到的都是主程序就是定时程序啊,我不知道要是定时程序作为子程序如何引用追答给你一个例子吧
见下面仿真图,仿真后,按加键,显示4位数。
无按键10秒到,显示0000
#include
#include
sbit S1=P3^2; //定义按键1
sbit S2=P3^3; //定义按键2
unsigned char code Ledtab[]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//共阳数码管段码表
unsigned char LedBuff[4];
unsigned int nx=1234; //显示4位数计数
unsigned char cnt; //中断计数,200次为10秒
void delay()
{
unsigned int j;
for(j=400;j>0;j--);
}
//显示子程序
void display()
{
unsigned char j,ledbit=0x01;
for(j=0;j<4;j++)
{
P2=ledbit;
P0=Ledtab[LedBuff[j]];
ledbit=_crol_(ledbit,1);
delay();
}
}
void main()
{
TMOD=0x01; //用T0定时
TH0 =0x3C; //T0定时50ms,晶振12M
TL0 =0xB0;
EA=1;ET0=1;
TR0 = 1;
while(1)
{
display();
if(S1==0) //按S1键,计数nx加1
{
cnt=0; //有按键,计时10秒清0
nx++;
while(S1==0)display();
}
if(S2==0) //按S2键,计数nx减1
{
cnt=0; //有按键,计时10秒清0
nx--;
while(S2==0)display();
}
if(cnt>=200)//无按键10秒到
{
cnt=0; //重新计时
nx=0; //显示0000
}
LedBuff[0]=nx/1000; //取千位
LedBuff[1]=nx/100%10;//取百位
LedBuff[2]=nx/10%10; //取十位
LedBuff[3]=nx%10; //取个位
}
}
void t0int() interrupt 1
{
TH0 = 0x3C;
TL0 = 0xB0;
cnt++;
}
定时器的程序你应该写过吧,还是照样写吗。只不过是10S到了,就进行下一个操作吗。追问请问在主程序里怎么开定时器啊,直接TR0=1;这样吗?追答定时器的程序都没有写过呀,在百度这里随便就可以找到一大堆的程序,还是看看再说吧。追问我都看过了,但是我看到的都是主程序就是定时程序啊,我不知道要是定时程序作为子程序如何引用追答给你一个例子吧
见下面仿真图,仿真后,按加键,显示4位数。
无按键10秒到,显示0000
#include
#include
sbit S1=P3^2; //定义按键1
sbit S2=P3^3; //定义按键2
unsigned char code Ledtab[]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//共阳数码管段码表
unsigned char LedBuff[4];
unsigned int nx=1234; //显示4位数计数
unsigned char cnt; //中断计数,200次为10秒
void delay()
{
unsigned int j;
for(j=400;j>0;j--);
}
//显示子程序
void display()
{
unsigned char j,ledbit=0x01;
for(j=0;j<4;j++)
{
P2=ledbit;
P0=Ledtab[LedBuff[j]];
ledbit=_crol_(ledbit,1);
delay();
}
}
void main()
{
TMOD=0x01; //用T0定时
TH0 =0x3C; //T0定时50ms,晶振12M
TL0 =0xB0;
EA=1;ET0=1;
TR0 = 1;
while(1)
{
display();
if(S1==0) //按S1键,计数nx加1
{
cnt=0; //有按键,计时10秒清0
nx++;
while(S1==0)display();
}
if(S2==0) //按S2键,计数nx减1
{
cnt=0; //有按键,计时10秒清0
nx--;
while(S2==0)display();
}
if(cnt>=200)//无按键10秒到
{
cnt=0; //重新计时
nx=0; //显示0000
}
LedBuff[0]=nx/1000; //取千位
LedBuff[1]=nx/100%10;//取百位
LedBuff[2]=nx/10%10; //取十位
LedBuff[3]=nx%10; //取个位
}
}
void t0int() interrupt 1
{
TH0 = 0x3C;
TL0 = 0xB0;
cnt++;
}
全部回答
- 1楼网友:往事埋风中
- 2021-11-13 16:12
你好!你最好是要实现什么功能?达到什么控制目的追问采用51单片机,10s内按键无操作数码管就显示0000追答是c语言还是汇编呢追问c语言的,我就是不清楚如何使用定时器计数器,如何开,如何在主程序内引用
- 2楼网友:第幾種人
- 2021-11-13 15:21
定时器计时10,生成变量i。if(i =1)后面加数码管显示0000程序追问请问在主程序里怎么开定时器啊,直接TR0=1;这样吗?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯