求高手修改单片机C语言程序:0~59秒计数器;1个独立按键控制,2个数码管显示

求单片机C语言程序:0~59秒计数器;1个独立按键控制,,2个数码管显示,第一次按按键,实现暂停,第二次按按键,实现复位,复位后自动继续走动。仿真图已上,任务完成另加200分
以下是1个数码管实现的类似程序,可用可不用,仅供参考:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit KEY=P3^0;

uchar aa,num,flag;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void delay(uint ms)
{
uchar t;
while(ms--)
for(t=0;t<123;t++);
}
void main()
{
num=0;
aa=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
P2=table[0];
while(1)
{
while(!KEY)
{
delay(10);
if(KEY)
{
flag++;
if(flag==1)
TR0=0;
if(flag==2)
{
P2=0x3f;
flag=0;
}
}
}
if(aa==20)
{
aa=0;
num++;
if(num==10)
num=0;
P2=table[num];
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
仿真图片

第1个回答  推荐于2016-05-25
//注意;P0口要加上拉电阻 。
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit KEY=P1^0;

uchar aa,num,num1,flag;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void delay(uint ms)
{
uchar t;
while(ms--)
for(t=0;t<123;t++);
}
void main()
{
num=0;
aa=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
P0=table[0];
P2=table[0];
while(1)
{
while(!KEY)
{
delay(10);
if(KEY)
{
flag++;
{
if(flag==1)
TR0=0;
if(flag==2)
{
TR0=1;
aa=0;
num=0;
num1=0;
flag=0;
TR0=1;
}
}
}
}
if(aa==20)
{
aa=0;
num++;
if(num==10)
{
num=0;
num1++;
}
if(num1==6)
num1=0;
P0=table[num1];
P2=table[num];
}
}
}

void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}追问

第二次按的时候那个键没有复位作用,还有就是复位后要继续自动走动,我自己搞定吧

追答

不是吧,怎么会这样的?我的都可以。

追问

你能帮帮我吗,因为我们老师把作业题给改掉了,之前我们写的程序都不算,麻烦你帮忙看下咯http://zhidao.baidu.com/question/285553099.html

本回答被提问者采纳
第2个回答  2011-06-21
给你一个方法的。就是在你按第一次之后,你就可以暂停定时器的运行,关掉定时器或者aa不进行自加的。这样的话,你送出去结果都不会有变化的,所以说就可以实现了暂停的效果的。当你再次按下按键的时候,再打开定时器或者对aa开始自加的,这样你在主函数里面就开始自动的更新了。这样你就可以开始运行的。如果是复位的话,你可以将aa清零。然后将输出全部清零的。
第3个回答  2011-06-21
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit KEY=P1^0;

uint aa,num,flag,shi,ge;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

void delay(uint ms)
{
uchar t;
while(ms--)
for(t=0;t<123;t++);
}
void main()
{
num=0;
aa=0;
flag=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
P0=table[0];
P2=table[0];
while(1)
{
if(KEY==0)
{
delay(10);
if(KEY==0)
{
while(!KEY);
switch(++flag)
{
case 1:
TR0=0;
break;
case 2:
num=0;
flag=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa=0;
TR0=1;
P0=table[0];
P2=table[0];
}
}
}

}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==20)
{
aa=0;
num++;
if(num==60)
num=0;
ge=num%10;
shi=num/10;
P0=table[shi];
P2=table[ge];
}
}

为了防止连续判定按键已按下,所以选择以按键弹起为操作有效,还有P0要加上拉电阻。
第4个回答  2011-06-21
没图啊!
相似回答