基于单片机的定时器设计,根据要求问题是数码管不能显示

mrlu9595 2013-01-04 02:42:00
要求:
1. 单片机控制4个数码管分别显示定时器分钟和秒。
2. 开机时显示 60:00,通过两个按键分别控制分钟和秒的显示,每按键一次,相应的显示减一,从而通过按键实现对预定时间设定的功能。
3. 通过硬件或者软件实现按键操作时的抖动消除。
4. 定时时间设定后开始倒计时,等到显示00:00时,单片机控制喇叭发出嘀0.2秒钟,然后断0.2秒钟的循环提示音。

请帮忙修改下,发我邮箱里:mrlu9595@yeah.net
//上电 显示60 00 按K3后启动倒计时 计数到00 00 蜂鸣器 名叫 hi 200ms low 200ms
#include<reg52.h>
#define U8 unsigned char
#define U16 unsigned int

//io define
sbit beep P3^7;
sbit k1 P3^3;
sbit k2 P3^5;
sbit k3 P3^6;

//register initial
U8 code TBA[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 段码 共阳极数码管0--9显示符 共阴极数码管{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};共阳极 {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}
U8 ge,shi,bai,qian ;
U8 fen, miao;
U8 count,count2;
void init_cpu()
{
//TIME0 INIT
TMOD =0x11;//工作方式1 16位计数器
TH0 =(65535-5000)/255;
TL0= (65535-5000)%255;
TR0 =0;
ET0 =1;
// TIME1 INIT
TH1 =(65535-2000)/255;
TL1= (65535-2000)%255;
TR1 =0;
ET1 =1;
//
EA =1;//开中断
//register init
fen =60;
miao =0;
}
void delay_ms(U8 x)
{
U8 a,b,c;
for(a=2;a>0;a--)
for(b=10;b>0;b--)
for(c=x;c>0;c--);
}
void key_scan()
{
U8 temp;

temp =P3 ;
temp|=0xff;
switch(temp)
{
case 0xf7: //press K1
delay_ms(2);
temp =P3 ;
temp|=0xff;

if(temp==0xf7)
{
fen--;
if(fen == 0)
{
fen =60;
}
while(!K1){display();}
}
break;
case 0xbf: //press K2
delay_ms(2);
temp =P3 ;
temp|=0xff;

if(temp==0xbf)
{
miao--;
if(miao == 0)
{
miao =0;
}
while(!K2){display();}
}
break;
case 0xdf: //press K3
delay_ms(2);
temp =P3 ;
temp|=0xff;

if(temp ==0xdf)
{
TR0 =1;TR1 =0;
beep=0 ; //close buzzer
}
while(!K3){display();}
break;
default:
break;
}
}
void display() //需修改位控端。。。。
{
qian =fen/10;
bai =fen%10;
shi =miao/10;
ge =miao%10;

P0 = TBA[qian];
P2 = 0x00 ;//位控端,相应位使能
delay_ms(10); //若闪烁,延时改小

P0 = TBA[bai];
P2 = 0x00 ;//位控端,相应位使能
delay_ms(10);

P0 = TBA[shi];
P2 = 0x00 ;//位控端,相应位使能
delay_ms(10);

P0 = TBA[ge];
P2 = 0x00 ;//位控端,相应位使能
delay_ms(10);

}
void main()
{
init_cpu();
while(1)
{
key_scan();
display();
}
}
void time0() interrupt 1 //定时50ms
{
TH0 =(65535-5000)/255;
TL0= (65535-5000)%255;
count++;
if(count>=20)//1s
{
count=0;
miao--;
if(miao<=0)
{
miao=59;
fen--;
if(fen<=0)
{
fen=0;
}
if((fen&miao)==0)
{ TR1 =1;TR0=0;}
}
}
}
void time1() interrupt 3 //定时20ms
{
TH1 =(65535-2000)/255;
TL1= (65535-2000)%255;
if(count2++>=10)
{
count2=0;
beep=~beep;
}
}
...全文
153 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
dceacho 2013-01-04
  • 打赏
  • 举报
回复

void display() //需修改位控端。。。。
{
qian =fen/10;
bai =fen%10;
shi =miao/10;
ge =miao%10;

P0 = TBA[qian];
P2 = 0x00 ;//位控端,相应位使能
delay_ms(10); //若闪烁,延时改小

P0 = TBA[bai];
P2 = 0x00 ;//位控端,相应位使能
delay_ms(10);

P0 = TBA[shi];
P2 = 0x00 ;//位控端,相应位使能
delay_ms(10);

P0 = TBA[ge];
P2 = 0x00 ;//位控端,相应位使能
delay_ms(10);

}
没仔细看,不过你的上面这个程序是有问题的,P2=0x00你想LED都显示一样的数字?
mrlu9595 2013-01-04
  • 打赏
  • 举报
回复

27,370

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧