杯水饮月 2024-09-08 20:05 采纳率: 0%
浏览 30

AT89C51串行通信不用SBUF寄存器实现

对于一片AT89C51单片机,不连接P3.0、P3.1引脚(RXD TXD引脚),不用SBUF寄存器,而是将收发接到其他引脚,用定时器和外部中断,写个一串口收发程序,具备波特率设置功能、具备发送16进制数据功能、printf可调用。(这个时候SCON寄存器还需要TI吗?)
——下面是我写的一段代码,接收部分正常,但发送部分不能正常运行,可以的话请帮助修正!

#include<reg51.h>

#define FOSC 11059200
/*原理图配置如下:                 *
 *               P3.2(INT0)-->RXD *
 *               P3.4-->TXD       *
 *    源代码核定检查完成,可进一步优化 */

typedef unsigned int uint;
typedef unsigned char uchar;

sbit PIN_TXD = P3^4;
sbit PIN_RXD = P3^2;
bit tx_ready = 0; // 发送准备标志
bit rx_ready = 0; // 接收准备标志


uint num = 8,a,i;
uint tx_data,c,received_byte;
uchar received_data;

//uchar code prf[] = "Hello, this is an AT89C51 single-chip microcontroller test.\n";


/*延时函数,毫秒级*/
void delay(uint i)
{
  uint j,k; 
  for(j=i;j>0;j--)
    for(k=110;k>0;k--)
    ;
}

/*定时器配置*/
void timer0_init(uint u32_baud)
{
    SCON = 0x50;             // 设置串口模式
    TMOD &= 0XF0;            // 清除定时器0的高位
    TMOD |= 0X02;            //定时器0的模式2
    TH0 = TL0 = 256 - (FOSC/12)/(u32_baud);//借助u32_baud的变化可调节波特率
    TF0 = 0;                //定时器0的溢出标志位
    TR0 = 0;                //初始化先关闭定时器,等要发送数据的时候才打开定时器
    PIN_TXD = 1;           // 初始状态为高
    
}

/* 串口发送 */
void uart_send_byte(uint c) 
{   
    SCON = 0x10; // UART模式1,允许接收
    while (!TI); // 确保缓冲区为空
    TI = 0; // 清除发送中断标志
    
    if(!tx_ready)
    {tx_ready = 1;tx_data = c;PIN_TXD =(bit)0;}
    else
    {
        PIN_TXD =(bit)c; // 将位数放入TXD
    }
    while (!TI); // 等待发送完成
}

// 异步接收函数
uint uart_read_byte(void) 
{
     i = 8;
     received_byte = 0;

    while (PIN_RXD == 0); // 等待开始位
    delay(1); // 稳定等待

    while (i--) {
        received_byte >>= 1; // 右移接收位
        if (PIN_RXD == 1) 
        {
            received_byte |= 0x80; //最高位
        }
        delay(5); // 等待每一位稳定
    }

    return received_byte; // 返回接收到的字节
}

/* 发送字符串 */
void uart_send_string(const uint *str) 
{
    while (*str!='\0') 
    {
        uart_send_byte(*str++); // 逐个发送字符串中的字符
    }
}

void send_char(int value) 
{
    if (value >= 0 && value <= 127) 
    {
        uart_send_byte(value);
    } 
    
}


void main() {
    timer0_init(9600); // 初始化波特率9600
    EA = 1; // 开全局中断
    ET0 = 1; // 使能定时器0中断
             // 发送字符串
     PIN_TXD = 0;
    delay(50);
    while (1) 
    {
      TR0 = 1; // 启动定时器0
      uart_send_byte(0x55); // 测试用例
      delay(50);
    for (a = 0; a < 10; a++) 
    {   
        uint digit = a;
        uart_send_byte(digit);
        while (!rx_ready); // 等待接收完成
       }
 }
}

void timer0_send_isr() interrupt 1 
{
    if (tx_ready) 
    {   
        if(!num)
        {
          uart_send_byte(tx_data & 0x01);
          tx_data >>= 1;
          num--;
        }
        else
        {
            TF0 = 0; // 清除发送中断标志
            TR0 = 0; // 关闭定时器
            tx_data = 0;
            tx_ready = 0;
            num = 8;
        }
        
    }
}

void timer0_recv_send_isr() interrupt 1 
{
      if (!rx_ready) 
        {
          if (!PIN_RXD) 
              {
                received_data = uart_read_byte();
                if (received_data == 0xff) 
                {
                   rx_ready = 0 ;// 错误处理,截止
                  } 
                else 
                 {
                   rx_ready = 1;
                 }
              } 
        }
}
     

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-08 20:07
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    要实现一个AT89C51单片机的串行通信模块,且不需要使用SBUF寄存器,可以采用以下方法:

    首先,定义一些常量用于初始化和配置串行接口。

    #define RX_PIN P3_0  // 设置接收端口为P3.0
    #define TX_PIN P3_1  // 设置发送端口为P3.1
    
    // 初始化串行通信时钟频率
    const uint32_t clock_freq = 16000000; // 16MHz
    

    接下来,创建一个函数用于启动定时器T1并初始化它。

    void initTimerT1(uint32_t freq) {
        TCCR1A = (TCCR1A & ~((1 << WGM12) | (1 << CS12))) | ((freq / clock_freq) << CS12); // 设置定时器工作模式和预分频系数
        TCCR1B = (TCCR1B & ~((1 << WGM12) | (1 << CS12))) | ((freq / clock_freq) << CS12); // 设置定时器工作模式和预分频系数
        TIMSK1 |= (1 << OCIE1A); // 启动定时器溢出触发
    }
    

    然后,编写一个函数来控制串行发送数据。

    void sendData(char *data, size_t len) {
        for(size_t i = 0; i < len; ++i) {
            TMOD1 &= ~(1 << MISO); // 清除MISO引脚输入允许标志位
            TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输出高电平有效
            TCNT1 = (uint16_t)(len - i - 1); // 设置计数器值
            OCR1A = (uint8_t)(len - i); // 设置溢出触发器
            delayMicroseconds(1); // 延迟1微秒
            TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
            TMOD1 &= ~(1 << MCK); // 清除MCK引脚输出允许标志位
            TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输出高电平有效
            TMOD1 &= ~(1 << MCK); // 清除MCK引脚输出允许标志位
            TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输出高电平有效
            delayMicroseconds(1); // 延迟1微秒
            TMOD1 |= (1 << MISO); // 向MISO引脚输出高电平
            TMOD1 &= ~(1 << MCK); // 清除MCK引脚输出允许标志位
            TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输出高电平有效
            TMOD1 &= ~(1 << MCK); // 清除MCK引脚输出允许标志位
            TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输出高电平有效
            delayMicroseconds(1); // 延迟1微秒
        }
    }
    

    现在,我们需要一个函数来控制串行接收数据。

    void receiveData(void) {
        TMOD1 &= ~(1 << MISO); // 清除MISO引脚输入允许标志位
        TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
        while(TI1IF & TI1IFG) { // 等待串行收到的数据到达
            if(TI1IF & TI1IFG) {
                TMOD1 &= ~(1 << MISO); // 清除MISO引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MCK); // 设置MCK引脚作为串行输入高电平有效
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许标志位
                TMOD1 |= (1 << MISO); // 向MISO引脚输出低电平
                TMOD1 &= ~(1 << MCK); // 清除MCK引脚输入允许
    
    评论

报告相同问题?

问题事件

  • 修改了问题 9月8日
  • 修改了问题 9月8日
  • 创建了问题 9月8日

悬赏问题

  • ¥15 为啥画版图在Run DRC会出现Connect Error?可我Calibre的hostname和计算机的hostname已经设置成一样的了。
  • ¥20 网站后台使用极速模式非常的卡
  • ¥20 Keil uVision5创建project没反应
  • ¥15 mmseqs内存报错
  • ¥15 vika文档如何与obsidian同步
  • ¥15 华为手机相册里面的照片能够替换成自己想要的照片吗?
  • ¥15 陆空双模式无人机飞控设置
  • ¥15 sentaurus lithography
  • ¥100 求抖音ck号 或者提ck教程
  • ¥15 关于#linux#的问题:子进程1等待子进程A、B退出后退出(语言-c语言)