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

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硬件编程技术详解)