【问题标题】:am I missing something in C code? programming 8051 MCUs我在 C 代码中遗漏了什么吗?编程 8051 MCU
【发布时间】:2021-06-14 22:27:47
【问题描述】:

我目前正在学习 C,所以我尝试用编程器对我的 AT89S52 MCU 进行编程。

用sdcc编译成功,上传也成功。但是当我尝试制作闪烁程序时,它并没有达到我的预期。我用闪烁功能制作了自己的头文件。其目的是使 P1.0 上的 LED 以给定的延迟闪烁。但看起来延迟不起作用,打开和关闭 P1.0 真的很快。

这里是 basicIO.h

#include <8052.h>

unsigned int i = 0;
void delay(int dl)
{
    for(i=0;i<=dl;i++) { //repeat 1ms delay x times
        TMOD = 0x01;    // Timer0 mode1
        TH0 = 0xFC;      //initial value for 1ms
        TL0 = 0x66;
        TR0 = 1;      // timer start
        while(TF0==0);  // check overflow condition
        TR0 = 0;     // Stop Timer
        TF0 = 0;    // Clear flag
    }
    
}
void on(void) {
P1_0 = 0x00;
}
void off(void) {
P1_0 = 0xFF;
}
void blink(int valdl) {
    P1_0 = 0x00;
    delay(valdl);
    P1_0 = 0xFF;
}

这里是 srccode.c:

#include <8052.h>
#include "basicIO.h"
void main(void)
{
    off();
    while(1)
    { 
        blink(100);
        blink(100);
    }
}

运行onoffdelay函数没有错误,那么blink是怎么回事?

【问题讨论】:

  • blink 中,您还需要在关闭 LED 后等待,不仅在打开后等待。否则关闭后立即重新打开。
  • 我投票结束这个问题,因为这是一个简单的误解,而不是 C 编程问题。
  • 这不是问题的原因,但头文件不应包含函数实现。它们可能并且经常确实包含函数原型,但实现应该是分开的。

标签: c microcontroller 8051


【解决方案1】:

你有所有的功能,但你的主循环应该是

while(1)
{   on()
    delay(100);
    off();
    delay(100);
}

或使用

void blink(int valdl) 
{
    P1_0 = 0x00;
    delay(valdl);
    P1_0 = 0xFF;
    delay(valdl);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    相关资源
    最近更新 更多