微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > pic串口重复发送问题

pic串口重复发送问题

时间:10-02 整理:3721RD 点击:
这是我用pic写的串口发送程序,我程序中发送一次0xff 但是示波器检测到 一直重复发送0xff 是哪里出错了
#include<pic.h>
#include<pic16f1829.h>
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0x3B31);
void init();
uint  flag=1;
void main()
{
init();
if(flag)
{
TXREG=0xff;
while(!TRMT);       
flag=0;
}
TXEN=0;   
while(1);
}
void init()
{
  TRISC=0;
  SPBRG=12;    //波特率9600
  BAUDCON=0x08;
  TXSTA=0x24;  //使能串口发送
  RCSTA=0x80;
  TXEN=1;
  SPEN=1;
  RCIF=1;
  //TXIE=0;
  CREN=0;        
  GIE    = 1;     
}

__CONFIG(0x3B31);内容是什么,看门狗有没有关闭?

我现在改了下__CONFIG(WRT_OFF&PLLEN_OFF&STVREN_ON&LVP_ON);   自己配置
while(1)
{
asm("clrwdt");
} 看门狗在发好数据之后关闭了
数据确实不会一直发送了,但还是会出现2,3次复位现象
就比如我要发一长串数据,它会先把数据前面几个重复发几次 然后再发完整的数据

这是我完整程序 我感觉看门狗中间是不是又进行复位了 但是我尝试了 多加几次关闭看门狗 但是没用
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
//__CONFIG(FOSC_INTOSC&WDTE_ON&PWRTE_OFF&MCLRE_OFF&CP_ON&BOREN_ON&CLKOUTEN_OFF&IESO_OFF&FCMEN_OFF);
__CONFIG(WRT_OFF&PLLEN_OFF&STVREN_ON&LVP_ON);   
void init();
void main()
{
init();
TXREG=0xfe;
TXREG=0x5c;
while(!TRMT);
TXREG=0x02;
TXREG=0x1c;
while(!TRMT);
TXREG=0x01;
TXREG=0x03;
while(!TRMT);
TXREG=0x0a;
  TXREG=0x01;
while(!TRMT);
TXREG=0x52;
TXREG=0x38;
while(!TRMT);
TXREG=0x37;
TXREG=0x30;
while(!TRMT);
TXREG=0x30;
TXREG=0x00;
while(!TRMT);
TXREG=0x00;
TXREG=0x00;
while(!TRMT);
TXREG=0x00;
TXREG=0x0c;
while(!TRMT);
TXREG=0x32;
TXREG=0x30;
while(!TRMT);
TXREG=0x31;
TXREG=0x35;
while(!TRMT);
TXREG=0x30;
TXREG=0x38;
while(!TRMT);
TXREG=0x30;
TXREG=0x34;
while(!TRMT);
TXREG=0x30;
TXREG=0x30;
while(!TRMT);
TXREG=0x30;
TXREG=0x30;
while(!TRMT);
TXREG=0x74;
TXREG=0x85;
while(!TRMT);
while(1)
{
asm("clrwdt");
}
}
void init()
{
  TRISC=0x80;
  SPBRG=12;    //波特率9600
  BAUDCON=0x08;
  TXSTA=0x24;  //使能串口发送
  RCSTA=0x90;
  TXEN=1;
  SPEN=1;
  //TXIE=0;
  CREN=0;
  RCIF   = 1;        
  GIE    = 1;   
}

我用的PIC16F877A,配置字是__CONFIG(WDTDIS & BORDIS & LVPDIS); 基本就是这种格式,WDTEN是打开看门狗功能,WDTDIS是关闭,关闭了开门狗功能后,就不需要CLRWDT();清除看门狗了,所以while(1)里面的asm("clrwdt");不用写;而且串口一次发送一个字节,你上面都是每两个字节加一句while(!TRMT); 应该是一个TXREG=?后面就有一句while(!TRMT); 你这个单片机我没用过,不过应该差不多

我在发送数据之前加了个延迟 已经解决了 谢谢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top