几乎完全一样的两段程序,单片机只能运行一个
正常运行的:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^0;
sbit spk=P2^3;
uchar num;
void main()
{
num=0;
TMOD=0x01; // 工作方式是1
TH0=(65536-45872)/256; //计算初值
TL0=(65536-45872)%256; //计算初值
EA=1; //开总中断
ET0=1; //定时器T0 中断允许
TR0=1; //启动定时器定时的功能
while(1);
}
void T0_time()interrupt 1 //定时器0的中断服务程序
{
TH0=(65536-45872)/256; //重装初值
TL0=(65536-45872)%256;
num++;
if(num==10)
{
num=0; //重新赋值num进入下一次循环
spk=~spk; //蜂鸣器哒哒声
led1=~led1; //定时1s后,改变发光二极管的状态
}
}
把中断函数的语句放在main函数中,单片机不能正常运行。
不能正常运行的程序:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^0;
sbit spk=P2^3;
uchar num;
void main()
{
num=0;
TMOD=0x01; // 工作方式是1
TH0=(65536-45872)/256; //计算初值
TL0=(65536-45872)%256; //计算初值
EA=1; //开总中断
ET0=1; //定时器T0 中断允许
TR0=1; //启动定时器定时的功能
while(1)
{
if(num==10)
{
num=0; //重新赋值num进入下一次循环
spk=~spk; //蜂鸣器哒哒声
led1=~led1; //定时1s后,改变发光二极管的状态
}
}
}
void T0_time()interrupt 1 //定时器0的中断服务程序
{
TH0=(65536-45872)/256; //重装初值
TL0=(65536-45872)%256;
num++;
}
期待在大家的帮助下,解开这个谜团。
朋友们可以试试,确实这样,
第二个你说的有问题程序我看了下没发现什么问题,为了证明没问题,我刚还用keil编译了下,单片机正常运行。
谢谢小编。我终于找到原因了。原来是我在选项中改动了interrupt vectors at address 导致的。保持默认值就行了。另外,我发现有时候,T0中断入口地址不在0x000b,程序也可运行。奇怪了。