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

PIC单片机精通_异步串口通讯实例与细节

发布时间:2020-05-28 发布时间:
|

1.前言


PIC16F876a异步串口通信的定义以及寄存器控制,这里不再多谈,前面已经进行过详细的分析。这里注意集中在几个关键点上。


串口中断服务程序应该注意什么?


利用串口助手进行调试应该注意什么?


串口助手接收不到数据的几种可能因素?


2.实例分析


PIC单片机与上位机握手程序如下:



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

/*Author: Chunxu Shen; All Rights Reserved!

/*Tsinghua University   2016-11-19

/*Serial Test Low Speed

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

#include

__CONFIG(0x3ffa);

 

#define BAUD 9600    

#define FOSC 9216000L

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

 

unsigned char Rece_flag ;  //初始化,串口接受标志

 

void main(void)

{

//初始化端口程序

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

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

 

//初始化串口设置

SPBRG = DIVIDER;  //波特率设置

TXSTA = 0x24;  //内部波特率-8bit-允许发送-异步通讯 空-低速模式-发送寄存器满空-无奇偶校验

RCSTA = 0x90;  //串口使能-不接收单字符-允许禁止连续接收

 

//中断设计

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

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

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

RCIF = 0;

 

//等待PC机触发中断

while(1)

{

if('E' == Rece_flag) //对应上位机“结束”按键

{//给PC机反馈信号“END”

TXREG = 'E';

while( TRMT == 0 ) 

continue; //检验发送是否结束

TXREG = 'N';

while(TRMT==0)

continue;

TXREG = 'D';

while(TRMT==0)

continue; 

}

else if( 'S' == Rece_flag )

{

//给PC机反馈信号“OK”

TXREG = 'O';

while(TRMT==0) 

continue;

TXREG = 'K';

while(TRMT==0) 

continue;

else //其他信号不响应

{ ; }

}

}

 

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

void interrupt usart(void)

{

if( RCIF )

{

RCIF = 0;  //软件清零

Rece_flag = RCREG;

}

}

3.经验总结


1.编写中断服务程序时,一定要注意接收中断标志位这个事儿!RCIF这个标志位,硬件不会自动清空。因此,一旦我们编写中断服务程序时,先把RCIF清零!!!


2.利用串口助手进行调试的时候,关注端口号!!!(计算机->管理->设备管理器->端口)确定你选择的端口是与PIC单片机是相连的,否则即使协议很正确,端口号没对上,也白扯。


3.波特率很关键,看好高低速,把初值算对很重要。


4.感想


曾经下过决心,不碰硬件,可是呢,有的时候你不去做就没有人做,这不得不说是一种悲哀!接下来的软件,瞧!看我飞起~~~


关键字:PIC单片机  异步  串口通讯 

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

热门文章 更多
STM32中断向量表的位置.重定向