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

2019-04-15 11:36发布

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.感想

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