yohai26 2023-11-02 20:10 采纳率: 83.3%
浏览 26
已结题

stc单片机求写一段高低电平切换带延时的代码

使用STC8G1K17A单片机。
P3.0和P3.1为输入信号,
P3.2和P3.3为输出信号。
①、初始状态默认:P3.2为高电平,P3.3为低电平。
②、p3.0得到低电平信号:P3.2延时约0.2秒为低电平,再延时约0.2秒为高电平,再约0.3秒为低电平,再约0.5秒p3.2和p3.3都为高电平。
③、P3.1得到低电平信号:依照第②条规律依顺返回直到第①条的初始状态的p3.2高电平,p3.3低电平。
备注说明:延时具体时间还不能完全确定,到时可以让我自由修改时间。

  • 写回答

10条回答 默认 最新

  • 社区专家-Monster-XH 2023-11-02 20:10
    关注

    基于Monster 组和GPT的调写:

    #include <stc8g.h>
    
    // 假设系统时钟为11.0592MHz
    #define FOSC 11059200L
    
    // 简单的微秒级延时函数,需要根据实际时钟频率调整
    void DelayUs(unsigned int us)
    {
        unsigned int i = (FOSC / 1000000) * us / 12;
        while(i--);
    }
    
    // 毫秒级延时函数
    void DelayMs(unsigned int ms)
    {
        while (ms--)
        {
            DelayUs(1000);
        }
    }
    
    void main()
    {
        // 初始化P3.2和P3.3为输出
        P3M0 |= 0x0C; // 设置P3.2和P3.3为推挽输出模式
        P3M1 &= ~0x0C; // 清除P3.2和P3.3的辅助功能
        
        // 初始化P3.0和P3.1为输入
        P3M0 &= ~0x03; // 清除P3.0和P3.1的推挽输出模式
        P3M1 |= 0x03; // 设置P3.0和P3.1为高阻输入模式
    
        // 初始状态
        P3_2 = 1; // P3.2设置为高电平
        P3_3 = 0; // P3.3设置为低电平
    
        while(1)
        {
            // 检测P3.0输入
            if (P3_0 == 0)
            {
                DelayMs(200);
                P3_2 = 0;
                DelayMs(200);
                P3_2 = 1;
                DelayMs(300);
                P3_2 = 0;
                DelayMs(500);
                P3_2 = 1;
                P3_3 = 1; // 此时P3.3也设置为高电平
            }
    
            // 检测P3.1输入
            if (P3_1 == 0)
            {
                DelayMs(500);
                P3_3 = 0; // P3.3回到低电平
                P3_2 = 0;
                DelayMs(300);
                P3_2 = 1;
                DelayMs(200);
                P3_2 = 0;
                DelayMs(200);
                P3_2 = 1; // P3.2回到高电平,完成反向延时逻辑
            }
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(9条)

报告相同问题?

问题事件

  • 系统已结题 11月11日
  • 已采纳回答 11月3日
  • 创建了问题 11月2日