21ic电子技术开发论坛 单片机与嵌入式系统 Microchip 串口如何单次发送问题
发新帖我要提问
返回列表
打印
[PIC®/AVR®/dsPIC®产品]

串口如何单次发送问题

[复制链接]
1228|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电子_小白|  楼主 | 2015-9-19 16:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是我用pic16f1829写的串口发送 但是它一直重复发送 不知道哪里错了
#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=0x80;
  SPBRG=12;    //波特率9600
  BAUDCON=0x08;
  TXSTA=0x24;  //使能串口发送
  RCSTA=0x80;
  TXEN=1;
  SPEN=1;
  //TXIE=0;
  CREN=0;
  RCIF   = 1;        
  GIE    = 1;     
}
沙发
yklstudent| | 2015-9-20 08:33 | 只看该作者
检测看门狗是否关闭了,没有关闭就关闭;不想关闭就要喂狗,饿了要咬人

使用特权

评论回复
板凳
电子_小白|  楼主 | 2015-9-21 08:28 | 只看该作者
yklstudent 发表于 2015-9-20 08:33
检测看门狗是否关闭了,没有关闭就关闭;不想关闭就要喂狗,饿了要咬人

是在主程序中加上asm("CLRWDT");嘛 好像没用啊

使用特权

评论回复
地板
StevenLau2008| | 2015-9-21 08:59 | 只看该作者
Steven Lau:
Mob:13148736025
QQ:359920019

使用特权

评论回复
5
NE5532| | 2015-9-21 15:17 | 只看该作者
检查是否用了“串口发送寄存器空”中断,应该用“发送完成中断”。

使用特权

评论回复
6
wangtao478552| | 2015-9-21 17:20 | 只看该作者
这个不是太清楚,1829吗,刚好我写过
/*********************************************************************************
*                          UART1初始化函数
*
* 说明: 完成UART1初始化;8bits发送,8bits接收。
*
* 参数: 无;
*
* 返回: 无;
*
* 注意: 有特殊情况在这说明,比如被中断函数调用。
*********************************************************************************/
void  UART1Init(void)
{
    APFCON0bits.RXDTSEL=0;
    APFCON0bits.TXCKSEL=0;
   
   
  ANSELBbits.ANSB7=0;//0数字输入
  TRISBbits.TRISB7=0; //TX
  ANSELBbits.ANSB5=0;//0数字输入
  TRISBbits.TRISB5=1;//RX

  TXSTA = 0B00100100;// |CSRC|TX9|TXEN|SYNC|SENDB|BRGH|TRMT|TX9D|
  RCSTA = 0B10010000;// |SPEN|RX9|SREN|CREN|ADDEN|FERR|OERR|RX9D|

/*************************************************************/
//16位/异步模式波特率
// Desired Baud Rate =  FOSC /(4 ([SPBRGHx:SPBRGx] + 1))
// [SPBRGHx:SPBRGx] = ((FOSC /Desired Baud Rate)/4) - 1           
/*************************************************************/
  
   BAUDCON = 0B00001000;// |ABDOVF|RCIDL|RXDTP|TXCKP|BRG16|?|WUE|ABDEN|
   
   SPBRGH=0;
   SPBRGL=8;//查表得取34时,波特率为114290,误差为-0.79%
   
   PIR1bits.TXIF=0;//清除标志位
   PIR1bits.RCIF=0;

   PIE1bits.RCIE=1;  //使能串口1中断
//   IPR1bits.RC1IP=1;  //中断优先级,1=高优先级
   //开中断
//   RCONbits.IPEN = 1; //开中断优先级
//   INTCONbits.GIEH = 1;
//   INTCONbits.GIEL = 1;
}

/*********************************************************************************
*                          UART1发送字节函数
*
* 说明: UART1发送字节;
*
* 参数: DATA 需发送字节;
*
* 返回: 无;
*
* 注意: 有特殊情况在这说明,比如被中断函数调用。
*********************************************************************************/
void UART1Send_Byte(unsigned char DATA)
{
    TXREG = DATA;
    while(PIR1bits.TXIF==0);//等待发送完成
    PIR1bits.TXIF=0;//清除标志位
    NOP();
}
/*********************************************************************************
*                          UART1发送字函数
*
* 说明: UART1发送字;
*
* 参数: Data 需发送字;
*
* 返回: 无;
*
* 注意: 有特殊情况在这说明,比如被中断函数调用。
*********************************************************************************/
void UART1Send_Word(unsigned int DATA)
{
    unsigned char tempD;
    tempD=0x00ff&(DATA>>8);
    UART1Send_Byte(tempD);
//    Delay_ms(1);

    tempD=DATA & 0x00ff;
    UART1Send_Byte(tempD);
}
/*********************************************************************************
*                          UART1发送多字节函数
*
* 说明: UART1发送多字节;
*
* 参数: *pData 数组首地址,n 字节个数;
*
* 返回: 无;
*
* 注意: 有特殊情况在这说明,比如被中断函数调用。
*********************************************************************************/
void UART1Send_nByte(unsigned char *pData,unsigned int n)
{
    while(n--)
    {
        TXREG = *pData++;
        while(PIR1bits.TXIF==0);//等待发送完成
        PIR1bits.TXIF=0;//清除标志位
//        Delay_ms(1);
    }
}
/*********************************************************************************
*                          UART1发送字符串函数
*
* 说明: UART1发送字符串;
*
* 参数: *pData 字符串地址;
*
* 返回: 无;
*
* 注意: 有特殊情况在这说明,比如被中断函数调用。
*********************************************************************************/
void UART1Send_String(char *pData)
{
  while(*pData!='\0')
   {
    TXREG = *pData++;
    while(PIR1bits.TXIF==0);//等待发送完成
    PIR1bits.TXIF=0;//清除标志位
   }
}

使用特权

评论回复
7
电子_小白|  楼主 | 2015-9-22 16:11 | 只看该作者
谢谢大家的帮忙 我已经解决问题了

使用特权

评论回复
8
zhengxinydc| | 2015-10-17 20:55 | 只看该作者
把解决问题的方法贴出来让大家分享一下好吗?谢谢!

使用特权

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

本版积分规则

3

主题

8

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部