单片机的简单问题

来源:百度知道 编辑:UC知道 时间:2024/05/09 09:06:01
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit p00=P0^0;

timer0() interrupt 2
{
uint i=30;
TF0=0;
i--;
if(i==0)
{
i=30;
p00=!p00;
}
TH0=0x10;
TL0=0x00;
}
main()
{
P0=0;
TH0=0x10;
TL0=0x00;
TMOD=0x1;
TR0=1;
ET0=1;
EA=1;
while(1)
{}
}

本来以为这样可以让它一秒钟闪一次。。。
没有想到
一秒n次
请问是哪里错了?
nternal clock:11.061387MHz./内部时钟频率:11.061387M.
External clock:11.061387MHz./外部时钟频率:11.061387M.
....
这个就是频率。。。
我算的一秒大概
用th0=87;
tl0=fe
循环30次
。。。
还有就是我说错了
现象不是一秒亮n下。。。而是根本就没现象
可不可以帮我看看是哪里的问题

把这一句uint i=30; 从中断中拿出去,当成一个全局变量来用就行了,每次进中断都重新赋值30,if(i==0) 这句怎么可能会满足呢?

要注意晶振的频率和定时器计数值的关系,程序中的计数次数与单片机的工作频率是有关的,使用不同的晶振,计时值也不同。

如果根本就没有闪的话,那你得看看是不是计数器的设置不正确,看你的程序,main里边while(1)前边的那部分应该就是初始化的部分了吧,我是用MSP430的,对51不熟,不知你是不是设置错了计数器造成它根本没有工作,所以死循环开始以后由于计数器不正常就没有发生过中断,当然就不可能闪。这方面可能的两个原因一是设置错误,还有一个可能是中断没有开,也就是说计数不产生中断,也会发生这个问题。
另外我不知道p00=!p00;这个写法是不是能做到每次对P0.0取反?这样是位操作么?在MSP430的C里一般都写P1OUT ^= 0x01;也就是对端口的BIT0求反。以上仅供参考。