[PIC®/AVR®/dsPIC®产品]

为什么这个程序一直不能使串口工作正常

[复制链接]
1244|5
手机看帖
扫描二维码
随时随地手机跟帖
Wayner|  楼主 | 2017-9-26 17:18 | 显示全部楼层 |阅读模式
//单片机用 PIC18F25K22 I/SO
//晶振用11.0592MHz
#include <htc.h>

typedef unsigned char UCHAR;
typedef unsigned int UINT;
typedef unsigned long ULONG;
//配置字Page351
//CONFIG1H=8b'1111_0010    //bit7:IESO=1,则bit6:FCMEN必须为1,0010 = HS 振荡器(高功耗 >16 MHz)
//CONFIG2L=8b'---0_0110
//CONFIG2H=8b'---0_0110 ??

//CONFIG3H=8b'1-01_0001
//CONFIG4L=8b'10--_-1-1
//CONFIG5L=8b'----_0000
//CONFIG5H=8b'00--_----
//CONFIG6L=8b'----_0000
//CONFIG6H=8b'000-_----
//CONFIG7L=8b'----_0000
//CONFIG7H=8b'-0--_----


__PROG_CONFIG(1,0xf200);
__PROG_CONFIG(2,0x0606);
__PROG_CONFIG(3,0x9100);
__PROG_CONFIG(4,0x0085);
__PROG_CONFIG(5,0x0000);
__PROG_CONFIG(6,0x0000);
__PROG_CONFIG(7,0x0000);

void F25K22init(void);
void USART1_init(void);
void SPI2_init(void);
void SendAChr1(UCHAR dat);
void delayms(UCHAR cy);

void main(void)
{
//UINT ix;
volatile UCHAR ci;

F25K22init();
USART1_init();
SPI2_init();
ci = 0x37;
for(;;)
   {
   
       SendAChr1(ci);
   }
}

void F25K22init(void)
{
ANSELA &= 0xd0;     //PORTA数字功能
ANSELB &= 0xc0;     //PORTB数字功能
ANSELC = 0x03;     //PORTC数字功能

PORTA &= 0xfd;      //RA1=0
LATA &= 0xfd;       //
TRISA &= 0xc0;


PORTB = 0xc1;      //
LATB = 0xc1;
TRISB = 0x24;

PORTC = 0x1f;      //
LATC = 0x1f;
TRISC = 0xc0;
PMD2 = 0x0f;   //CTMUMD CMP2MD CMP1MD ADCMD全禁止

WDTCON = 0x0;  //看门狗定时器控制寄存器,0 = WDT 关闭
CTMUCONH = 0x0;
}

void USART1_init(void)
{
  UCHAR i;
  //      TRISCbits.TRISC6 = 1; // TX1,串口1发送 //
  //      TRISCbits.TRISC7 = 1; // RX1,串口1接收
  SPBRGH1 = 0x1;  // 波特率9600
  SPBRG1 = 0x1f;   //
  
  ANSELC = 0x00;     //PORTC数字功能
  TRISC = 0xc0;
  TXSTA1bits.SYNC = 0;    // SYNC=0 BRGH16=1 BRGH=1 ,FOSC/[4 (n + 1)]
  RCSTA1 = 0x90;      //SPEN:串口使能位=1; CREN:连续接收使能位=1
  //RCSTA1 = RCSTA1|0x80;// 串口使能
  //RCSTA1bits.CREN = 1; // 接收使能
  
  //BAUDCON1bits.BRG16 = 1; //16位异步
  BAUDCON1 = 0x48;    //BRG16 = 1 16位异步,ABDOVF RCIDL DTRXP CKTXP BRG16 — WUE ABDEN
  TXSTA1bits.BRGH = 1;
  
  TXSTA1bits.TX9 = 0;      //8 DATA
  RCSTA1bits.RX9 = 0;
  SSP1CON1bits.SSPEN1 = 0;
  TXSTA1bits.TXEN = 1;  // 发送使能
  
  PMD0 = 0xbf;  //bit 6 UART1MD:UART1 外设模块禁止控制位  

  i = RCREG1;
  PIR1 = 0x0;   //bit5: RC1IF,bit4: TX1IF   
      
  PIE1bits.RC1IE = 0;   // 允许串口1接收使能
  //PIE1   bit5: RC1IE, bit4: TX1IE
  PIE1bits.TX1IE = 0;  
  IPR1 = 0x0;      //RC1IP TX1IP都为0
}

void SPI2_init(void)
{
ANSELB &= 0xc0;     //PORTB数字功能
PORTB = 0xc1;      //
LATB = 0xc1;
TRISB = 0x24;

   //SPI速率 Fosc/16=11059200/16 =691200
SSP2CON1 = 0x1;
SSP2CON2 = 0x0;     //用于IIC
SSP2CON3 = 0x0;
//SSP2STAT = 0x
SSP2STATbits.SMP=0;  //0 = 在数据输出时间的中间采样输入数据
SSP2STATbits.CKE=0;  //0 = 时钟状态从空闲转换到有效时发送
SSP2CON1bits.SSPEN2=1;
PIR3 &= 0x7f;  //bit7 SSP2IF:同步串口中断标志位
PIE3 |= 0x80;  //bit7 SSP2IE:同步串口 2 中断允许位
//PIE3 bit6 BCL2IE:MSSP2 总线冲突中断允许位
//MSSP2MD MSSP1MD — CCP5MD CCP4MD CCP3MD CCP2MD CCP1MD
PMD1 = 0x5f; //bit 7 MSSP2MD:MSSP2 外设模块禁止控制位,0 = 使能模块
}
      

void SendAChr1(UCHAR dat)
{

volatile UCHAR cx;
UINT index;
for (index = 0; index < 1000; index++)//检测发送器是否为空
    {
      if (TXSTA1bits.TRMT == 1)  // 发送移位寄存器状态位 1 = TSR 空  0 = TSR 满
         break;
    }
TXREG1 = dat; //把数据写入缓冲区

PIR1bits.TX1IF=0;                                                //发送中断清零
cx = RCREG1;
delayms(10);  //Dly10us(1);
}

void delayms(UCHAR cy)  //延时函数
{        
  UINT ia;
  UCHAR i;
  for(i=cy; i>0; i--)
    {
     for(ia=0x133; ia>0; ia--)
       { asm("NOP"); asm("NOP");  }
    }   
}
单片机用的是PIC18F25K22 I/SO,晶振用的是11.0592MHz,使用串口1,
波特率9600,串口只发送,现在串口用电脑调试工具只能收到0xff。这程序就是参考网友的啊。我要发0x37,实际只看到0xff,请广大网友帮看看,非常感谢啊
Wayner|  楼主 | 2017-9-26 17:20 | 显示全部楼层
把函数void SendAChr1(UCHAR dat)改成这样也不行

void SendAChr1(UCHAR dat)
{
volatile UCHAR cx;
UINT index;
for (index = 0; index < 1000; index++)//检测发送器是否为空
    {
      if (TXSTA1bits.TRMT == 1)  // 发送移位寄存器状态位 1 = TSR 空  0 = TSR 满
         break;
    }
TXREG1 = dat; //把数据写入缓冲区

delayms(10);  //Dly10us(1);
}

使用特权

评论回复
feelhyq| | 2017-9-27 10:41 | 显示全部楼层
用示波器看看RX 和Tx管脚 的波形  看看波特率是多少

使用特权

评论回复
Wayner|  楼主 | 2017-9-27 20:26 | 显示全部楼层
波特率是正常的

使用特权

评论回复
yklstudent| | 2017-9-28 09:52 | 显示全部楼层
发送正常嘛?硬件电路正常嘛、。?
自己动手一步步排查问题

使用特权

评论回复
chaodada| | 2017-11-28 17:53 | 显示全部楼层
你的子程序是自己写的,还是头文件里的?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

846

帖子

1

粉丝