×
单片机 > 单片机程序设计 > 详情

PIC单片机精通_串口通讯与串口调试实例

发布时间:2020-06-03 发布时间:
|

1.引子


团队之所以称之为团队,就意味着多个人在一起共事。需要的是谦虚,谦逊,切勿言之偏偏。也要学会尊重,任何一门编程语言都有自己的优势与不足,否则早就有一门语言一统天下啦!!!我由VB入门,利用C、C++、Java、TCL进行过开发,至今不敢妄言哪种语言最好,只知道把事情做好,才是最成功的。

耐心与细心,至关重要。最忌浮于事,遇到问题要仔细分析,千万不可抱怨。作为软件出身的傻大个,竟然“沦落”到进行电子线路测试、故障排除、阻抗匹配,不得不说是配合的环节出现了问题,再此感谢一下我的母校——华中大,还好本科管得严,任务重,电子电力的知识还没有忘记。

今天记载的是独立开发的串口通信程序,没有利用PIC自带的Example,很适合新手,共同进步。

2.串口通信实例与详解


 /********************************************************/

/*Author: Chunxu Shen; All Rights Reserved!

/*Tsinghua University

/*2016-11-14

********************************************************/

#include

__CONFIG(0x3ffa);

 

#define BAUD ???UL      

#define FOSC ???UL //根据实际情况,自己设定

#define DIVIDER ((int)(FOSC/(16UL * BAUD) -1))

 

unsigned int  send1[2] = {0x4f,0x4b}; //'O'=ASCII 0x4f;'K'=ASCII 0x4b; “OK”

unsigned int  send2[5] = {0x45,0x52,0x52,0x4f,0x52}; //'E'=ASCII 0x45;'R'=ASCII 0x52 “ERROR”

unsigned char rece;  //全局变量

unsigned int cnt;    //计数器

 

void main(void)

{

//初始化端口程序

TRISC7 = 1; //RX端口设为输入有效

TRISC6 = 0; //TX端口设为输出有效

//初始化串口设置

SPBRG = DIVIDER;  //波特率设置

TXSTA = 0x04;  //异步通讯-禁止发送数据-高速模式

RCSTA = 0xA0;  //串口使能-接收单字符-禁止连续接受

//中断设计

RCIE = 1;  //允许接收信号触发中断

GIE = 1;   //打开中断总开关

PEIE = 1;  //允许外围设备触发中断

//无限循环,等待PC机触发中断

while(1)

{

......

}

}

 

//接收上位机送发的信号

void interrupt usart(void)

{

if( RCIE )

//RCIE:开放串行中断请求  RCIF:接收中断允许(接收区满or单字符)

{

......

}

}

3.心得感悟


1.“查询”和“中断”哪种方式好?


这个问题就很奇怪了;其实没有绝对的好与不好。就个人而言,我更偏向于中断,思路比较清晰。无论哪种方式,记住核心就好。中断:采用的是通信外围设备触发(也就是PC机发送信号);而查询方式:采用的是接收移位寄存器溢出标志位以及发送移位寄存器清空的标志位。

2.为什么在main函数中设置字符数组mplab一直报错?


这个问题同学问我之后我一直没有答上来,因为我感觉这本身是没有错的。可能是配置的问题。为什么我没有碰到?因为我习惯把字符数组放到程序的预定义处。我也很推崇这种方式,这会大大增强程序的可读性。

3.通信流程该如何设定?


单片机通信模块都很相似:端口方向配置(那个是发送数据?哪个是接收数据?);串口状态配置(打开串口?连续发送?同步/异步?);中断配置(打开接收中断触发事件、开启总中断、开启外围中断触发);最后一个是进行数据处理。

4.TXSTA=0x24;会怎么样?


TXSTA=0010 0100B;异步-高速-允许发送模式

就个人而言,不建议这样写。因为接收信号触发中断,如果此时发送还是允许的,容易陷入一直都发送的死区。所以,我们可以试着这样做:“激发信号”触发中断->允许数据发送->发送数据->关闭数据发送。




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机中断源的扩展方法