51单片机,定时器每20ms进中断,中断里执行100ms软件延时函数,当100ms延时函数执行20
51单片机,定时器每20ms进中断,中断里执行100ms软件延时函数,当100ms延时函数执行20ms后应该再次进中断,那么应该再次执行100ms延时函数还是继续上次没执...
51单片机,定时器每20ms进中断,中断里执行100ms软件延时函数,当100ms延时函数执行20ms后应该再次进中断,那么应该再次执行100ms延时函数还是继续上次没执行的80ms程序? #include<reg51.h> void Delay100ms() { 略; } main() { TMOD=0x01; TH0=(65536-20000)/256; TH0=(65536-20000)%256; ET0=1; EA=1; TR0=1; while(1); } void Time0(void) { TH0=(65536-20000)/256; TH0=(65536-20000)%256; Delay100ms(); }
展开
1个回答
展开全部
首先,你这么做不科学。
不应在中断里进行延时。
回答你的问题,
“定时中断中执行20ms后应该再次进定时中断”,在51中,不是这样的。51内部有记录中断服务级别的标志,每个中断优先级有一个标志,这个标志用户程序是看不到的。进行中断后,对应优先级的中断服务状态标志自动被置位,同级别的中断都不再响应,也就是说,定时中断不会再次进定时中断,执行reti指令后,这个标志自动被复位,同级别的中断才会继续响应。
假设不是51系统,比如ARM,进入中断后,可以手动允许同级别的中断继续响应,这时再次中断后是延时100ms还是80ms,取决于你的延时程序。如果延时程序的变量是建立在栈上的局部变量,每次调用delay,都会一组新的变量,也就是说,延时每次都是100ms。如果是用的静态变量,或者全局变量,则有可能,只延时80ms。
不应在中断里进行延时。
回答你的问题,
“定时中断中执行20ms后应该再次进定时中断”,在51中,不是这样的。51内部有记录中断服务级别的标志,每个中断优先级有一个标志,这个标志用户程序是看不到的。进行中断后,对应优先级的中断服务状态标志自动被置位,同级别的中断都不再响应,也就是说,定时中断不会再次进定时中断,执行reti指令后,这个标志自动被复位,同级别的中断才会继续响应。
假设不是51系统,比如ARM,进入中断后,可以手动允许同级别的中断继续响应,这时再次中断后是延时100ms还是80ms,取决于你的延时程序。如果延时程序的变量是建立在栈上的局部变量,每次调用delay,都会一组新的变量,也就是说,延时每次都是100ms。如果是用的静态变量,或者全局变量,则有可能,只延时80ms。
追问
这样做确实不科学,主要想利用定时器扫描做多任务处理。但是处理任务时浪费的时间必对定时器的准确性造成影响。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询