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.感想
曾经下过决心,不碰硬件,可是呢,有的时候你不去做就没有人做,这不得不说是一种悲哀!接下来的软件,瞧!看我飞起~~~
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮