打印

求助keilC51用定时中断问题

[复制链接]
10025|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jumpio|  楼主 | 2024-3-11 12:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在定时中断中用一个全局变量tms来计时,然后在延时子程序中利用tms做延时,程序如下:u8 tms;
void  Delay(u8 ms);
void main(void)
{
        WTST = 0;                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
        EAXSFR();                //扩展SFR(XFR)访问使能
        CKCON = 0;      //提高访问XRAM速度

        GPIO_config();
        Timer_config();
        EA = 1;
       Delay(10);
        while (1);
}
void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR                //进中断时已经清除标志
{
        // TODO: 在此处添加用户代码
        ++tms;
}

void Delay(u8 ms)
{       
       tms=0;
     while(tms<ms);
}

仿真时发现程序死在Delay中,查看tms正常计时,也已超过设定的ms值,但就是无法跳出while(tms<ms)循环。请教该如何解决?


使用特权

评论回复

相关帖子

沙发
ayb_ice| | 2024-3-11 16:40 | 只看该作者
程序好像没有问题

使用特权

评论回复
板凳
神奇号| | 2024-3-12 08:48 | 只看该作者
程序逻辑没看到问题,加个if  break语句试试。

使用特权

评论回复
地板
一叶倾城wwq| | 2024-3-12 09:02 | 只看该作者
++tms;要做边界检查。
tms,ms,定义为volatile

使用特权

评论回复
5
lsc501| | 2024-3-12 11:58 | 只看该作者

求助keilC51用定时中断问题

while()后面加几个nop试试。

使用特权

评论回复
6
tsingkoux81| | 2024-3-13 10:05 | 只看该作者
你这是基础不牢啊,一旦进入main里的while,根本就没机会执行delay了。

使用特权

评论回复
7
coody| | 2024-3-13 11:53 | 只看该作者
本帖最后由 coody 于 2024-3-13 11:55 编辑

tms=0;
while(tms<ms);
你这是要做什么操作呢?定时器启动了吗?定时器中断取反个IO,示波器看看吧。

使用特权

评论回复
8
jumpio|  楼主 | 2024-3-15 10:10 | 只看该作者
tsingkoux81 发表于 2024-3-13 10:05
你这是基础不牢啊,一旦进入main里的while,根本就没机会执行delay了。

delay中有一个while(tms<ms)的循环

使用特权

评论回复
9
jumpio|  楼主 | 2024-3-15 10:13 | 只看该作者

定时器确认已启动,仿真时查看tms已开始计时,只是tms大于ms了还是跳不出while(tyms<ms)

使用特权

评论回复
10
jumpio|  楼主 | 2024-3-15 10:18 | 只看该作者
谢谢各位热心解答. 后来发现需要把delay中的tms=0放到外面就能正常运行了.
void main(void)
{
        WTST = 0;                //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
        EAXSFR();                //扩展SFR(XFR)访问使能
        CKCON = 0;      //提高访问XRAM速度

        GPIO_config();
        Timer_config();
        EA = 1;
       tms=0;
       Delay(10);
        while (1);
}
void Delay(u8 ms)
{      
     while(tms<ms);
}

使用特权

评论回复
11
ayb_ice| | 2024-3-15 11:07 | 只看该作者
jumpio 发表于 2024-3-15 10:18
谢谢各位热心解答. 后来发现需要把delay中的tms=0放到外面就能正常运行了.
void main(void)
{

变量添加volatile声明即可

使用特权

评论回复
12
jumpio|  楼主 | 2024-3-15 11:48 | 只看该作者
ayb_ice 发表于 2024-3-15 11:07
变量添加volatile声明即可

正解,谢谢.之前用ARM好像不用这个声明也可以, c51第一次遇到这个问题

使用特权

评论回复
13
jumpio|  楼主 | 2024-3-15 11:49 | 只看该作者
一叶倾城wwq 发表于 2024-3-12 09:02
++tms;要做边界检查。
tms,ms,定义为volatile

正解,谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

62

帖子

2

粉丝