微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 各位大神麻烦帮小弟看看这个60秒计时为什么十位一直在闪...

各位大神麻烦帮小弟看看这个60秒计时为什么十位一直在闪...

时间:10-02 整理:3721RD 点击:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code S[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar n1,n2,n;
sbit led=P1^0;
delay(uint i)//延时1毫秒
{
uchar t;
while(i--)
{
for(t=0;t<115;t++);
}
}
timer0()//定时器初始化
{
TMOD=0x11;
TH0 = 0xdc;
TL0 = 0x00;
TH1 = 0x4c;
TL1 = 0x00;
EA=1;
ET0=1;
TR0=1;
ET1=1;
TR1=1;
}
led0()//led灯闪烁
{
if(n1==20)
{
n1=0;
led=~led;
}
}
smg()//数码管显示
{
if(n2==20)
{
n2=0;
n++;
if(n==60)//60秒计时
n=0;
P2=0xbf;//个位
P0=S[n/10];
//delay(5);
P2=0x7f;//十位
P0=S[n%10];
delay(5);
}
}
main()
{
timer0();
while(1)
{
led0();
smg();
}
}
void t0() interrupt 1
{
TH0 = 0xdc;
TL0 = 0x00;
n1++;
}
t1() interrupt 3
{
TH1 = 0x4c;
TL1 = 0x00;
n2++;
}

去掉  delay(5);
                 

P2=0xbf;//个位
P0=S[n/10];
//delay(5);
P2=0x7f;//十位
P0=S[n%10];
delay(5);
一楼其实已经说了

小编请教用for语句如何定时

去掉之后十位就不亮了

去掉之后十位就不亮了

什么?

用delay(2)试试啊

试过了,也是一闪一闪的

smg()//数码管显示
{
if(n2==20)
{
n2=0;
n++;
if(n==60)//60秒计时
n=0;
P2=0xbf;//个位
P0=S[n/10];
//delay(5);
P2=0x7f;//十位
P0=S[n%10];
delay(5);
}
}
位选的话不要直接赋值。
定义一个变量a=0x7f;
P2=_crol_(a,1);//个位
P0=S[n/10];
delay(5);
P2=a;//十位
P0=S[n%10];
delay(5);
头文件要加include<intrins.h>

你试试,看还闪烁吗?

还是闪

P2=0xbf;//个位
P0=S[n/10];
//delay(5);
P2=0x7f;//十位
P0=S[n%10];
delay(5);
你确定个位和十位没搞反?照你的程序,应该是个位闪,十位正常才对的,去掉第一个delay(5),也应该是个位不亮

你改成这样吧。另外给2个建议,1、给程序写上点注释,不然看起来很晕。2、除非是顺序结构,不然不要用“==”号,特别是在中断里“++”的情况,容易出问题,要用“>=”
smg()//数码管显示
{
if(n2>=20)
{
n2=0;
n++;
if(n==60)//60秒计时
n=0;
}
P2=0xbf;//个位
P0=S[n/10];
delay(5);//还闪就加大这个延时时间
P2=0x7f;//十位
P0=S[n%10];
delay(5);//还闪就加大这个延时时间
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top