单片机数码管显示秒 为什么定时器2不行?
答案:4 悬赏:70
解决时间 2021-02-16 16:04
- 提问者网友:浪子生来ˇ性放荡²↘
- 2021-02-16 06:55
#include
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
uchar value,bai,shi,ge;
uint a;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void init()
{
TMOD=0x02;
EA=1;
ET0=1;
TR0=1;
TH0=6;
TL0=6;
}
void delay(uint z)
{
uint x;
while(z--)
{
for(x=110;x>0;x--);
}
}
void display(uchar bai,uchar shi,uchar ge)
{
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(1);
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(1);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(1);
}
void main()
{
init();
while(1)
{
if(a==3685)
{
a=0;
value++;
if(value==100)
{
value=0;
}
bai=value/100;
shi=value/100%10;
ge=value%10;
}
display(bai,shi,ge);
}
}
void time0() interrupt 1
{
a++;
}
这个是程序 为什么我把定时器工作方式改成1就能工作而自动重装的方式2为什么不行?
定时器0方式2
最佳答案
- 二级知识专家网友:没感情的陌生人
- 2021-02-16 07:32
因为你显示采用的延时方式,占用的时间约为3*2*110=660us。
采用方式2时定时为250us,则a=3685时,可能程序正在延时中,因此没有让程序执行到if(a==3685)语句,等程序执行到该语句时,a的值已经超过了3568了。
而采用工作方式1,定时时间比较长。进入一次定时中断可以执行数次主程序,以保证了每次都可以执行到 if(a==3685)。
全部回答
- 1楼网友:单身小柠`猫♡
- 2021-02-16 10:24
T2需要软件清除中断标志位。
- 2楼网友:社会水太深
- 2021-02-16 09:37
th0=(65536-15536)/256;
tl0=(65536-15536)%256;
这个是由于tl0跟th0都是8位寄存器,组合在一起就是16为寄存器,那么2^16=65536;赋值的时候减去15536,是因为定时器溢出的时候是达到计数65536的时候,那么减去这个数就是相当于你想计数器计数15536个时钟clock后溢出;即从0到15536,共计15536个时钟clock;当达到15536后th已经到了65536溢出了,因为你赋的初值为65536-165536 = 49000;计数器实际工作是从49000开始的,
至于软件延时
void delay(uchar x)
{
int i,j;
for(i=x;i>0l;i--)
for(j=255;j>0;j--);
}
这个是执行一条指令有不同的clock数的,赋值是一个clock,for可能是两个,而且跟单片机的晶振也有关系,是不精确的延时,
- 3楼网友:24K纯糖
- 2021-02-16 08:30
经过分析发现,你的条件设置的太苛刻了:
if(a==3685)
虽然每当250个机器周期,a加一次一,
但是加到3685的时候,未必正好是在执行这条语句的位置上。
可以改成:
if(a>=3685)
就可以了。
我要举报
大家都在看
推荐资讯