单片机
返回首页

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

2018-07-30 来源:eefocus

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


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


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

最新器件
精选电路图
  • 光控音效发生器电路

  • 非常简单的150W功放电路图

  • 一个简单的警笛电路图

  • 基于IC555的可变PWM振荡器电路

  • 分享一个电网倾角计电路

  • 电谐波图形均衡器示意图

    相关电子头条文章