单片机定时中断程序为什么测试不起来啊

来源:百度知道 编辑:UC知道 时间:2024/05/22 00:03:04
设计一个单片机应用系统,该应用系统控制与P1连续的8个小灯循环闪亮,每个小灯亮的时间为50ms;用定时中断实现
解题思路如下:
采用方式1:计算定时初值:Tp=12/Fose=12/12000000=1us;X=(2xy16-T/Tp)=65536-50000/1=15536=3CB0H
C51程序代码如下:
#include<reg51.h>
unsigned char n;
main( )
{
TMOD=1;
TL0=0xB0;
TH0=0x3C;
TR0=1;
ET0=1;
EA=1;
while(1);
}
int_to( ) interrupt 1
{
TL0=0xB0;
TH0=0x3C;
P1=0x1;
for(n=0;n<8;n++)
{
P1=P1*2;
}
}
程序仿真的时候不循环,不知道程序错在那里

第一:中断响应后应该立即关闭中断允许 然后执行你的中断服务子程序 中断服务完毕再开启中断允许 因为定时有可能短于你的中断服务子程序执行时间
第二:你的循环是中断产生一次就循环扫描一次 这样的逻辑是不正确的
int_to( ) interrupt 1
{
TL0=0xB0;
TH0=0x3C;

P1=P1<<1; //或者P1=P1>1;
if(P1=0X00)
P1 = 0X01;

}
}

程序绝对在循环,因为你有while(1),你看到的现像不是程序循环的问题,而是你的中断程序里有错误,首先P1 = P1*2,你的意思应该是每次左移一位吧,换成<<符号吧,虽然没错,但是不专业。这是小问题。

你的意思是有T0产生延时,然后再每个中断点上改变灯的亮灭, 对吧? 那就把中断里面的循环拿掉,每次中断左移一次就行了。
问题很大,重新写吧