【问题标题】:8051 c programming, interrupt progblem8051 c编程,中断问题
【发布时间】:2014-02-17 21:30:44
【问题描述】:

我正在编写一个 Intel 8051 (C8051F312) 微控制器。我只想通过使用中断来制作一个闪烁的 LED 程序。它编译,但 LED 不闪烁。任何想法我都会很感激。谢谢!

我的代码是:

#include <C8051F310.H>
#include <stdio.h>

sbit led = P2^7;        //LED connected to D7 of Port2

void timer(void) interrupt 1        //interrupt no. 1 for Timer 0
{
    led=~led;           // toggle LED on interrupt
    TH0=0xFC;             // initial values loaded to timer
    TL0=0x66;
}

void main(void)
{
    TMOD = 0x01;          // mode1 of Timer0
    TH0 = 0xFC;         // initial values loaded to timer
    TL0 = 0x66;
    EA = 1;           // global interrupt enable
    ET0 = 1;          // enables Timer 0 interrupt
    TR0 = 1;              // start timer
    while(1);             // do nothing  
}

【问题讨论】:

  • 首先尝试在程序的主循环中切换 LED。那是正确的端口引脚吗?它是输出吗?电路是否正常?是否启用中断?定时器是否启用?中断是否会触发? LED 是否真的闪烁,但太快而无法看到?观察到的故障模式是什么 - 常亮或常灭?
  • 现在我添加了“CKCON=6;”这一行,现在它已经稳定了
  • 为了进行测试,您可能希望减少定时器中断服务例程 (ISR) 的触发频率,例如每 500 毫秒,这样 LED 的切换就很容易看到。
  • 2 可能 1) 可能在 ISR 中重新启用 ET0 = 1;。 2)也许交换加载顺序TH0 , TL0
  • 是的,我想少做一次,但我不知道怎么做! @MikeJablonski

标签: c interrupt microcontroller interrupt-handling 8051


【解决方案1】:

就像上面的Mike Jablonski 所说,你需要降低你的中断率。您的原始代码在 3.0625MHz / 12 / 922 ~= 277Hz 处中断。 CKCON 添加的一部分禁用了对计时器的缩放(通过设置 T0M),所以现在你在 ~3.3kHz 处中断。你将无法看到这一点。

看到任何东西都假定你有一个功能电路。您没有配置输出引脚。你说你的 LED 灯“现在”亮着,但希望不意味着它不是以前。这没有多大意义,因为您没有更改引脚的作用。

  1. 去掉 CKCON 行以保持 /12 缩放,并在中断时使用 0x00 重新加载 TH0TL0。这会让你以略低于 4Hz 的频率打断,更加明显。

  2. 使该引脚推拉:

    P2MDOUT   = 0x80;
    XBR1      = 0x40;
    
  3. 开始将datasheet 读入您的微信。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-24
    • 2020-08-04
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多