梨子552 2024-09-26 14:04 采纳率: 100%
浏览 4
已采纳

为什么我这个段代码串口能给发送但是无法接收,甚至串口中断都进不去 使用的是PIC16F73芯片(PIC16cr73)


#include<pic.h>
#include<stdio.h>
#include <xc.h>
#include"uastTM1650_header.h"
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config CP = OFF         // FLASH Program Memory Code Protection bit (Code protection off)
#pragma config BOREN = OFF      // Brown-out Reset Enable bit (BOR disabled)
#define SDA_TOUCH   RC4 //触摸按键数据 SDA接RC4
#define SCL_TOUCH   RC3 //触摸按键时钟 SCL接RC3
#define INT_TOUCH   RC0 //触发发送数据(INT_TOUCH=0)
#define _XTAL_FREQ 4000000
#include <xc.h>
unsigned char dig1[13] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x40, 0x73, 0x79}; //数码管显示值(不带冒号)
unsigned char dig2[13] = {0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd, 0x87, 0xff, 0xef, 0xc0, 0xf3, 0xf9}; //数码管显示值(带冒号)
//0,   1,   2,   3,   4,   5,   6,   7,   8,   9,   -,   P    E
int ChuMoAnJian; //记录第几个触摸
int TOUCH_data;
int LEDnumb = 0;
int j = 9, k = 1, a = 0, b, c = 2, power = 0, time = 0, time1 = 0, s1, s2,p=0;
int ctr[5];
void speeker1()
{
    PORTB = 0x20; // 0010 0000
    __delay_ms(100);
    PORTB = 0x00;
}
void uart_init() //串口初始化
{
    TXSTA = 0xE7; //  发送状态和传输寄存器配置
    RCSTA = 0b10010001; //接受状态和控制寄存器//1001 0001
    SPBRG = 51; //9600-6(10????)
    RCIE = 1; //接收中断使能
    GIE = 1; //启用所有中断
    PEIE = 1; //
}
void interrupt_init() //中断初始化
{
    OPTION_REG = 0b10000111; //TMR0速率=1:256 WDT速率=1:128
    INTCON = 0b10100000; //启用所有中断,屏蔽外部中断,启用TMR0中断
    TMR0 = 150; //中断计数值
    TMR0IE = 0;
}
void uart_sent(unsigned char q, unsigned char w, unsigned char e, unsigned char r) //串口发送数据
{
    RC5 = 1;
    __delay_us(1);
    TXREG = (q);
    while (TRMT == 0); //TRMT=0则继续传输
    TXREG = (w);
    while (TRMT == 0);
    TXREG = (e);
    while (TRMT == 0);
    TXREG = (r);
    while (TRMT == 0);
    __delay_us(500);
    RC5 = 0;
}
void uart_receive()
{
    if (ctr[0] == 'A')
    {
        uart_sent('A', 'A', 'A', 'A');
        
    }
    if (ctr[1] == 'B')
    {
        uart_sent('B', 'B', 'B', 'B');
        
    }
    if (ctr[2] == 'C')
    {
        uart_sent('C', 'C', 'C', 'C');
        
    }
    if (ctr[3] == 'D')
    {
        uart_sent('D', 'D', 'D', 'D');
        
    }

}

void __interrupt() ZhongDuan()
{
    if (RCIF && RCIE) // 检查接收中断标志
    {   
        ctr[p] = RCREG; // 接收数据
        if (p < 4)
            p++;
        else
        {
            p = 0; // 重置 p
        }
        uart_receive(); // 调用接收处理函数
    }
}


void TOUCH_send_clk()
{
    SCL_TOUCH = 0;
    __delay_us(10);
    SCL_TOUCH = 1;
    __delay_us(10);
}

void TOUCH_Read()
{
    unsigned char i;
    SCL_TOUCH = 1;
    TOUCH_data = 0; //记录按键的位置
    if (RC0 == 0)
    {
        if (SDA_TOUCH == 1)
        {
            __delay_us(50);
            if (SDA_TOUCH == 1)
            {
                TOUCH_send_clk();
                if (SDA_TOUCH == 0)
                {
                    for (i = 0; i < 10; i++)
                    {
                        TOUCH_data = TOUCH_data << 1;
                        TOUCH_send_clk();
                        if (SDA_TOUCH == 1)
                        {
                            TOUCH_data |= 1;
                            ChuMoAnJian = 1 + i;
                        }
                    }
                    TOUCH_send_clk();
                    if (SDA_TOUCH == 0)
                    {
                        ChuMoAnJian = 0;
                        TOUCH_data = 0;
                    }
                    __delay_us(10);
                }
            }
            else
            {
                TOUCH_send_clk();
            }
        }
    }
}





void main(void)
{
    TRISB = 0X00;
    TRISC = 0x11; // 设置输入端口
    PORTC = 0x00;
    PORTB = 0x00;
    uart_init();
    interrupt_init();

    while (1)
    {
        TOUCH_Read(); // 读取触控信息
        uart_receive(); // 定期检查并接收数据

        if (ChuMoAnJian == 2)
        {
            uart_sent('A', 'B', 'C', 'D');
            ChuMoAnJian = 0; // 重置触摸按键
        }
    }
}
  • 写回答

1条回答 默认 最新

  • 软件技术NINI 2024-09-26 14:06
    关注

    串口通信的问题可能由多种原因引起,尤其是当发送和接收部分出现问题时。针对 PIC16F73 (实际上是PIC16CR73) 这款单片机,这里有几个可能的原因:

    1. 硬件连接:检查TX和RX引脚是否正确连接到串行通信线路,并确认地线、电源和信号线之间没有短路或开路。

    2. 波特率设置:确保发送端和接收端的波特率设置一致。如果配置了错误的波特率,数据可能会乱码或丢失。

    3. 中断设置:确认串口中断是否已开启并正确配置。检查中断向量表(Interrupt Vector Table, IVT),确认该中断被正确映射到对应的中断服务程序(ISRs)。

    4. 软件配置:在编写中断处理函数时,检查是否有错误的代码逻辑,比如读取接收缓冲区时未检查状态标志位。

    5. 中断优先级:可能是其他中断抢占了串口中断,需要调整中断优先级或禁止无关中断以保证串口中断的响应。

    6. 收发缓冲溢出:如果接收缓冲区满了,新的数据会覆盖旧的数据,导致接收不到。检查接收缓冲区大小和清空策略。

    7. 软件延迟:在串口通信期间,可能需要适当延时以便接收方可以准备接收新数据,检查这部分代码是否有足够的时间间隔。

    要解决这个问题,你可以按照上述步骤逐个排查。另外,查看相关的数据手册和示例代码会有很大帮助。如果问题依然存在,建议贴出关键代码片段和详细的电路图描述,以便更准确地定位问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 9月27日
  • 创建了问题 9月26日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?