标题:
单片机定时器中断0为什么中断中打开的灯一直亮
[打印本页]
作者:
wuxinzhen
时间:
2019-11-9 14:04
标题:
单片机定时器中断0为什么中断中打开的灯一直亮
#include<reg52.h>
sbit p10=P1^0;
int t=0;
void InitTimer0() //初始化函数
{
TMOD=0x01; //设置定时器0工作模式1
TH0=(65536-45872)/256; //计数器装初值
TL0=(65536-45872)%256;
EA=1; //开总中断
ET0=1; //开计数器0中断
TR0=1; //启动定时器0
}
void main()
{
InitTimer0();
while(1);
{
;
}
}
void time0() interrupt 1
{
TH0=(65536-45872)/256; //计数器装初值
TL0=(65536-45872)%256;
t++;
if(t==20)
{
p10=0;
t=0;
}
if(t!=20)
p10=1;
}
作者:
m182892
时间:
2019-11-9 17:17
你试一下,if(t==20){t=0;p10=~p10;}
作者:
csmyldl
时间:
2019-11-9 17:52
因为t==20时灯灭的时间相当短,而t!=20时灯亮的时间相当长而已
作者:
圈圈圆圈
时间:
2019-11-9 18:26
当你的t=20的时候,你又令t=0了,所以又会进入下一个if,具体怎么改可以参考楼上那位的代码
作者:
bh2030693
时间:
2019-11-9 19:02
#include
<reg52.h>
sbit p10 = P1 ^
0
;
code
unsigned
int
kTimeValue =
65536
-
45872
;
//初始化函数
void
InitTimer0
(
void
) {
TMOD =
0x01
;
//设置定时器0工作模式1
TL0 = kTimeValue;
TH0 = kTimeValue >>
8
;
//计数器装初值
ET0 =
1
;
//开计数器0中断
TR0 =
1
;
//启动定时器0
EA =
1
;
//开总中断
}
void
main
(
void
) {
InitTimer0
();
while
(
1
) {
}
}
void
time0
(
void
) interrupt
1
{
static
int
t;
TL0 = kTimeValue;
TH0 = kTimeValue >>
8
;
//计数器装初值
t++;
if
(t >=
20
) {
t =
0
;
p10 = !p10;
}
}
没实际测试,你可以试一下。
P1.0是bit,不能用“~”取反,可以用“!”取反。
如果亮灭时间不同,需要稍稍修改一下:
t++;
if
(t ==
20
) {
p10 =
0
;
}
else
if
(t >=
60
) {
t =
0
;
p10 =
1
;
}
作者:
人间不许有白头
时间:
2019-11-9 20:09
建议还用定时器1,比较好用
作者:
chao123456
时间:
2019-11-12 11:41
把if(t!=20)放主函数里试试
作者:
八月初
时间:
2019-11-21 16:33
试试我这个:
#include<reg52.h>
sbit p10 = P1^0;
unsigned char t = 0;
void InitTimer0() //初始化函数
{
TMOD=0x01; //设置定时器0工作模式1
TH0=(65536-45872)/256; //计数器装初值
TL0=(65536-45872)%256;
EA=1; //开总中断
ET0=1; //开计数器0中断
TR0=1; //启动定时器0
}
void main()
{
InitTimer0();
while(1);
}
void time0() interrupt 1
{
TH0=(65536-45872)/256; //计数器装初值
TL0=(65536-45872)%256;
t++;
if(t == 20)
{
p10 = ~p10;
t=0;
}
} 我测试可以的
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1