PIC单片机同步异步通信的应用

合集下载

PIC单片机原理及应用

PIC单片机原理及应用

PIC 系列单片机代表着单片机发展的新动向
7 2021/4/20
PIC 单片机的特色
❖ 指令单字节化
数据总线和指令总线分离,ROM和RAM寻址空间互相独立, 宽度不同。 确保数据安全性、提高运行速度和实现全部指令单字节化。
MCS-51系列ROM和RAM都是8位,指令长度1~3字节,长短不一!
PIC12C50X/PIC16C5X 系列单片机的指令字节为12位; PIC16C6X/7X / 8X 系列单片机的指令字节为14位; PIC17CXX 系列单片机的指令字节为16位;
PIC 系列单片机代表着单片机发展的新动向
14 2021/4/20
PIC 单片机的特色
❖ I2 和 SPI 串行总线端口
I2(Inter IC Bus)和 SPI( Seril Peripheral Interface)是在 芯片之间实现同步串行数据传输的技术。方便灵活的扩展 外围器件,大大简化单片机应用系统的结构,极易形成产 品电路的模块化结构。 大屏幕彩电中都引入了I2技术。
26 2021/4/20
PIC12F629/675系统结构与工作原理
❖ PIC12F629/675简化结构框图
T1G T1CKI T0CKI
Flash程序 存储器 1K * 14
程序计数器PC 8级堆栈13位
RAM 寄存器 64*8
GP0/AN0/CIN+
指令寄存器 内部
4MHz 振荡器
指令译码 与控制
PIC单片机原理及应用
2005.12
1 2021/4/20
内容提要
单片机概述 PIC单片机的特色 PIC单片机的程序设计
2 2021/4/20
单片机概述

PIC_单片机软件异步串行口实现的C语言参源程序

PIC_单片机软件异步串行口实现的C语言参源程序

#i nclude <pic.h> //PIC单片机通用头文件,实际型号为16F84__CONFIG(XT | PROTECT | PWRTEN | WDTEN);//程序中设定配置信息//===========================//定义软件UART发送/接收引脚//===========================#define RX_PIN RB0 //串行接收脚#define TX_PIN RB1 //串行发送脚//===========================//定义软件UART状态机控制字//===========================#define RS_IDLE 0 //空闲#define RS_DATA_BIT 1 //数据位#define RS_STOP_BIT 2 //停止位#define RS_STOP_END 3 //停止位结束//===========================//定义软件UART采样频率//===========================#define OSC_FREQ 4000 //单片机工作频率(单位:KHz)#define BAUDRATE 1200 //通讯波特率#define TMR0PRE 2 //TMR0预分频比1:2#define TMR0CONST 117 //256 - OSC_FREQ*1000/TMR0PRE/4/(BAUDRATE*3)//===================================================================//定义函数类型void UART_Out(void);void UART_In(void);//===================================================================//定义位变量bit rsTxBusy; //串行发送忙标志//定义串行发送的数据结构struct {unsigned char state; //发送状态机控制单元unsigned char sliceCount; //波特率控制unsigned char shiftBuff; //字节数据发送移位寄存器unsigned char shiftCount; //字节数据发送移位计数器} rsTx;//定义串行接收的数据结构struct {unsigned char state; //接收状态机控制单元unsigned char sliceCount; //波特率(采样点)控制unsigned char shiftBuff; //字节数据接收移位寄存器unsigned char shiftCount; //字节数据接收移位计数器unsigned char dataBuff[8]; //接收数据FIFO缓冲队列unsigned char putPtr, getPtr;//FIFO队列存放/读取指针} rsRx;//用于串行发送的变量定义unsigned char outBuff[10]; //发送队列unsigned char outPtr, //发送队列指针outTotal, //发送的字节总数chkSum; //发送的校验码//===================================================================== //主程序//===================================================================== void main(void){PORTA = 0;PORTB = 0;TRISB = 0b01; //输入输出定义OPTION = 0b10000000; //TMR0选择内部指令周期计数//TMR0预分频 1:2rsRx.state = RS_IDLE; //初始化接收状态rsTxBusy = 0; //发送空闲INTCON = 0b00100000; //T0IE使能GIE = 1; //打开中断while(1) { //程序主循环asm("clrwdt"); //清看门狗UART_In(); //接收串行数据UART_Out(); //发送串行数据}}//=====================================================================//查询在接收FIFO队列中是否有新数据到//然后解读数据//===================================================================== void UART_In(void){unsigned char data1;if (rsRx.putPtr==rsRx.getPtr)return; //如果读取和存放的指针相同,则队列为空data1 = rsRx.dataBuff[rsRx.getPtr]; //读取1个数据字节rsRx.getPtr++; //调整读取指针到下一位置rsRx.getPtr &= 0x07; //考虑环形队列回绕//此处为数据解读分析,略}//===================================================================== //软件UART发送数据//数据在outBuff中,outTotal为总字节数//===================================================================== void UART_Out(void){if (rsTxBusy==1)return; //正处于移位发送忙//可以发送新数据if (outTotal) { //如果有字节要发送rsTx.shiftBuff = outBuff[outPtr++]; //取字节到发送移位寄存器rsTxBusy = 1; //置发送忙标志,启动发送outTotal--; //字节计数器减1}}//=================================================================== //中断服务程序//=================================================================== void interrupt isr(void){//利用TMR0 定时中断实现全双工软件UARTif (T0IE && T0IF) {T0IF = 0; //清TMR0中断标志//实现串行接收 RX 状态机控制switch (rsRx.state) { //判当前接收状态case RS_IDLE://当前状态为"空闲", 唯一要做的就是判"起始位"出现if (RX_PIN==0) { //如果接收到低电平rsRx.sliceCount = 4; //准备4*Ts时间间隔rsRx.shiftCount = 8; //总共接收8位数据位//改变此数值可以实现任意位数的数据接收rsRx.state = RS_DATA_BIT; //切换到数据位接收状态}break;case RS_DATA_BIT://当前状态为"数据接收"if (--rsRx.sliceCount==0) { //等采样时间到rsRx.shiftBuff >>= 1; //接收移位寄存器右移1位if (RX_PIN) rsRx.shiftBuff|=0x80; //保存最新收到的数据位 rsRx.sliceCount = 3; //下次采样间隔为3*Tsif (--rsRx.shiftCount==0) { //已经收到8位数据位?//保存数据字节到FIFO缓冲队列rsRx.dataBuff[rsRx.putPtr] = rsRx.shiftBuff;//队列存放指针调整,最多8个字节缓冲rsRx.putPtr = (rsRx.putPtr+1) & 0x07;//转去下个状态,判停止位rsRx.state = RS_STOP_BIT;}}break;case RS_STOP_BIT://当前状态为停止位判别(此程序没有判别)if (--rsRx.sliceCount==0) { //等采样时间到//此处可以判RX_PIN是否为1rsRx.state = RS_IDLE; //复位接收过程}break;default://异常处理rsRx.state = RS_IDLE; //复位接收过程}//实现串行发送 TX 状态机控制switch (rsTx.state) { //判当前发送状态case RS_IDLE: //发送起始位if (rsTxBusy) { //如果发送启动TX_PIN = 0; //发出起始位低电平rsTx.sliceCount = 3; //持续时间3*TsrsTx.shiftCount = 8; //数据位数为8位rsTx.state = RS_DATA_BIT; //转去下一状态} else TX_PIN = 1; //如果没有数据发送则保证数据线为空闲 break;case RS_DATA_BIT: //发送8位数据位if (--rsTx.sliceCount==0) { //码元宽度定时到if (rsTx.shiftBuff & 0x01)//看数据位是0还是1TX_PIN = 1; //发送1elseTX_PIN = 0; //发送0rsTx.shiftBuff >>= 1; //准备下次数据位发送rsTx.sliceCount = 3; //数据位宽度为3*Tsif (--rsTx.shiftCount==0) {//8位数据位发送结束,转去发送停止位rsTx.state = RS_STOP_BIT;}}break;case RS_STOP_BIT: //发送1位停止位if (--rsTx.sliceCount==0) { //等数据位发送结束TX_PIN = 1; //发送停止位高电平rsTx.sliceCount = 9; //持续宽度9*Ts//额外考虑字节连续发送的时间间隔rsTx.state = RS_STOP_END; //转停止位宽度延时}break;case RS_STOP_END: //等待停止位时间宽度结束if (--rsTx.sliceCount==0) { //如果停止位结束时间到rsTxBusy = 0; //一个字节发送过程结束,清发送忙标志rsTx.state = RS_IDLE; //复位发送过程}break;default://异常处理rsTx.state = RS_IDLE; //复位发送过程}TMR0 += TMR0CONST; //重载TMR0,实现下次定时中断}}。

PIC单片机模拟异步串行通讯UART源程序

PIC单片机模拟异步串行通讯UART源程序

PIC单片机模拟异步串行通讯UART源程序用TMR0实现定时查询。

任何带中断的PIC上都可以实现。

可用此法扩展多个串口。

1.;|--------------------------------------------------------------|2.;| Implement duplex USART base on normal I/O pin |3.;| Using TIMER0 interrupt for bit timing |4.;| Tested on PIC16F83 running at 4MHz |5.;| Written by Paul Zhang, Microchip Tech Inc |6.;| 6 Aug, 2000 |7.;| All rights reserved |8.;|--------------------------------------------------------------|9.10.errorlevel -302 ;no bank warning11.errorlevel -301 ;no default file warning12.13.list p=16F83 ;define processor14.#include <p16F83.inc> ;15.16.__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _ XT_OSC17.;code protect = OFF18.;watchdog = OFF19.;power-up delay timer = ON20.;oscillator mode = XT21.22.;===============================23.;define RAM variables24.cblock 0x0c ;GPR start from 0x0c25.w_temp ;W context saving during interrupt26.status_temp ;STATUS context saving during inte rrupt27.pclath_temp ;PCLATH context saving during int errupt28.ART_F ;containing flags for USART30.RX_BUFF ;USART received data buffer31.TX_BUFF ;USART transmitting data buffer32.RX_SLICE ;RX bit-timing control33.TX_SLICE ;TX bit-timing control34.RX_bcnt ;RX received bit counting35.TX_bcnt ;TX transmitting bit counting36.RX_STA ;RX STATE-MACHINE controller37.TX_STA ;TX STATE-MACHINE controller38.endc39.40.;===============================41.;pre-definition for readability42.#define RX_PIN PORTA,2 ;assign RX pin43.#define TX_PIN PORTA,3 ;assign TX pin44.#define TXEN USART_F,0 ;USART transmit enable45.#define TXBUSY USART_F,1 ;USRAT transmit is in progress46.#define RXBF USART_F,2 ;USART receive buff full47.#define RXBUSY USART_F,3 ;USART receive is in progress48.#define RX_ERR USART_F,4 ;USART receive error49.#define TX_ERR USART_F,5 ;USART transmit error50.51.;===============================52.;define constant53.#define OSC_FREQ .4000 ;oscillator frequency in KHz54.#define BAUDRATE .240055.#define TMR0CONST .118 ;256-OSC_FREQ*1000/4/(BAUDRATE*3) + 256.57.;===============================58.;for my personal style59.#define skp0 btfsc60.#define skp1 btfss61.62.;******************************************************** ************** 0x00064.clrwdt65.goto MAIN ; go to beginning of program66.67.68.;================================== =====69.;Interrupt service routine 0x004 ; interrupt vector location71.72.movwf w_temp ; save off current W register cont ents73.movf STATUS,w ; move status register into W regis ter74.banksel status_temp75.movwf status_temp ; save off contents of STATUS r egister76.movf PCLATH,w77.movwf pclath_temp ; save off contents of PCLATH78.79.banksel INTCON ;select bank80.skp0 INTCON,T0IF ;test for TMR0 interrupt81.goto tmr0IntStart ;do TMR0 ISR82.;here test for any other interrupt source83.goto int_end84.85.tmr0IntStart ;TIMER0 interrupt service86.bcf INTCON,T0IF ;clear T0IF87.88.;====== start of RX =======89.movlw high($)90.movwf PCLATH ;set PCLATH before PCL change91.movf RX_STA,w ;get the state value for RX92.andlw 0x03 ;for safeguard purpose93.addwf PCL,f ;switch to STATE94.goto rxStartChk ;check for START bit95.goto rxReceiveBit ;receive DATA bit96.goto rxIdle ;wait for idle97.goto rxEnd ;do nothing98.rxStartChk ;check for START bit99.skp0 RX_PIN ;test RX pin for START bit100.goto rxEnd ;not found101.;start bit found. do following102.movlw .8103.movwf RX_bcnt ;count for 8 bits incoming data 104.movlw .4105.movwf RX_SLICE ;wait 4 time-slice for 1st data bit 106.movlw .1107.movwf RX_STA ;switch to STATE 1 for 1st data bi t sampling108.goto rxEnd109.rxReceiveBit ;receive DATA bit110.decfsz RX_SLICE,f ;wait of bit timing111.goto rxEnd112.;time to sample incoming data bit113.rrf RX_BUFF,f ;right shift for new bit space114.bcf RX_BUFF,7 ;pre-set to 0115.skp0 RX_PIN ;incoming data bit test116.bsf RX_BUFF,7 ;set if data bit = 1117.movlw .3 ;3 slice for data bit timing118.movwf RX_SLICE ;bit timing for next data bit119.decfsz RX_bcnt,f ;see if 8-bit completed120.goto rxEnd121.;bit receive completed, do follwoing122.movlw .2123.movwf RX_STA ;set to STATE 2 for idle waiting 124.bsf RXBF ;set receive buffer full125.movf RX_BUFF,w ;display data on PORTB126.movwf PORTB127.goto rxEnd128.rxIdle ;wait for idle129.skp0 RX_PIN ;try to find STOP bit130.clrf RX_STA ;back to STATE 0 for next byte 131.goto rxEnd132.;====== End of RX =========133.rxEnd134.;====== start of TX =======135.;do TX, if transmit is engaged136.skp1 TXEN ;skip if TXEN set, do TX137.goto tmr0IntEnd ;not in transmit mode138.movf TX_SLICE,f ;see if in bit-timing delay 139.skpnz ;140.goto txDo ;bit-timing completed141.decfsz TX_SLICE,f ;keep bit-timing delay142.goto txEnd143.txDo144.;Transmit STATE-MACHINE control145.movlw high($)146.movwf PCLATH ;set PCLATH before PCL change147.movf TX_STA,w ;get current state148.andlw 0x03 ;make sure in range149.addwf PCL,f ;switch to TX STATE150.goto txStartBit ;send START bit151.goto txDatBit ;send DATA bit152.goto txStop ;send STOP bit153.goto txIdle ;set transtim IDLE154.txStartBit ;TX_STA=0, send START bit here 155.bsf TXBUSY ;set TX busy flag156.movlw .8157.movwf TX_bcnt ;count for 8 bit transmitting 158.bcf TX_PIN ;start bit159.movlw .3160.movwf TX_SLICE ;set bit timing161.movlw .1162.movwf TX_STA ;set transmit STATE-MACHINE 163.goto txEnd164.txDatBit ;TX_STA=1, send DATA bit here 165.;time for next bit sending166.rrf TX_BUFF,f ;rotate bit to C167.skpnc ;test C168.goto $+3169.bcf TX_PIN ;0 out170.goto $+2171.bsf TX_PIN ;1 out172.movlw .3173.movwf TX_SLICE ;wait 3 time-slices174.decfsz TX_bcnt,f175.goto txEnd ;8 bit serial not end176.movlw .2177.movwf TX_STA ;set transmit STATE-MACHINE 178.goto txEnd179.txStop ;TX_STA=2, send STOP bit here180.bsf TX_PIN ;send STOP bit181.movlw .3182.movwf TX_SLICE ;set bit timing183.movlw .3184.movwf TX_STA ;set transmit STATE-MACHINE 185.goto txEnd186.txIdle ;TX_STA=3, reset transmission to IDLE187.bcf TXBUSY ;not busy188.bcf TXEN ;not in transmission189.clrf TX_STA ;reset transmit STATE-MACHINE190.goto txEnd191.;====== End of TX =========192.txEnd193.;add more TMR0 related code here194.tmr0IntEnd195.movlw TMR0CONST196.addwf TMR0,f197.goto int_end198.199.int_end200.banksel pclath_temp201.movf pclath_temp,w ; retieve copy of PCLATH regis ter202.movwf PCLATH203.movf status_temp,w ; retrieve copy of STATUS regi ster204.movwf STATUS ; restore pre-isr STATUS register contents205.swapf w_temp,f206.swapf w_temp,w ; restore pre-isr W register contents207.retfie ; return from interrupt208.209.210.;================================== =====211.;Code wriiten for test purpose212.MAIN213.banksel TRISA ;select respective bank214.movlw b'00000100' ;RA2-input, RA3-output215.movwf TRISA216.clrf TRISB217.movlw b'10001000' ;TMR0 in timer mode218.movwf OPTION_REG219.clrf STATUS ;make sure in bank 0220.221.call USART_INIT222.223.movlw TMR0CONST224.movwf TMR0225.226.movlw 0xff227.movwf PORTB228.229.bsf INTCON,T0IE230.bsf INTCON,GIE231.232.LOOP ;test code233.skp1 RXBF ;wait for data received234.goto $-1235.bcf RXBF ;clear data flag236.movf RX_BUFF,w237.movwf TX_BUFF ;send back received data238.bsf TXEN239.skp0 TXEN ;wait for transmit completion240.goto $-1241.goto LOOP ;242.243.244.245.;================================== =====246.;Initializtion of software USARTART_INIT248.clrf USART_F ;clear all flag bit249.clrf RX_STA ;reset STATE MACHINE250.clrf TX_STA251.bsf TX_PIN ;TX is in Idle252.return。

PIC18FXX8单片机通用同步异步收发器的编程应用

PIC18FXX8单片机通用同步异步收发器的编程应用

PIC18FXX8 单片机通用同步异步收发器的编程应用 摘要本文介绍了公司推出的 188 单片机通用同步异步收发器串行通信 接口的相关内容,给出了单片机该模块的接口电路和语言应用编程。

关键词 188,串行通信 0 引言 188 单片机是美国微芯公司推出的 16 位指令集的高级产品, 由于芯片内含有、 内部 2 存储器、 2 和接口、 接口、 同步/异步串行通信接口等强大的功能,具有很好的应用前景。

但是,目前介绍其应用和以语言编程的中文参考资料很少。

本文将探讨该型单片机异步串行通信的编程应用,程序用--18 语言编 写,并在重庆大学-美国微芯公司单片机实验室的 18458 实验板上通过。

1188 单片机同步异步收发器通用同步异步收发器模块是由 188 内的 三个串行模块组成的器件之一也叫串行通信接口即,可以配置为全双工异 步方式、半双工同步主控方式、半双工同步从动方式三种工作方式。

是 188 单片机串行通信发送状态和控制寄存器,是接收状态和控制寄 存器。

由于在实际工程中,异步方式用得最多,这里仅介绍异步工作方式, 其它方式可参阅相关资料。

11 异步工作方式在异步工作方式下, 串行通信接口采用标准的不归零 格式 1 位起始位、8 位或 9 位数据位和一位停止位,最常用的数据位是 8 位。

片内提供的 8 位波特率发生器可用来自振荡器时钟信号产生标准的波 特率频率。

通过对位在寄存器中清零,可选择异步工作方式。

12 波特率发生器带有一个 8 位的波特率发生器, 这个支持的同步方式 和异步方式。

用寄存器控制一个独立的 8 位定时器的周期。

在异步方式下,位控制寄存器的也被用来控制波特率。

在同步方式下,用不到位。

表 1 给出了在主控方式下内部时钟不同工作方式时的波特率计算式。

表 1 主控方式下的波特率计算式=0 低速=1 高速 0 异步波特率=[64+1] 波特率=[16+1]1 同步波特率=[ 4+1]无 13 异步工作方式配置下面是串行通信异步工作方式配置步骤 顺序可以改变 1 配置发送状态和控制寄存器;2 配置接收状态和控制寄存 器;3 配置 7 引脚、6 引脚分别为输入和输出方式;4 通过设定的通信波特 率配置寄存器,计算公式参见表 1;5 设置串行通信接收或发送中断是否 使能;6 清串行通信接收或发送中断标志;7 设置串行通信接收中断或发 送中断的优先级是高或低优先级中断方式, 18 单片机默认情况下是高优先 级中断,若是低优先级中断,则必须进行设置;8 设置串行通信接收和发 送数据是否允许。

单片机 同步通信和异步通信

单片机 同步通信和异步通信

单片机同步通信和异步通信单片机是一种高性能、低成本、可编程的集成电路芯片。

在实际应用中,单片机需要和外部设备进行通信,以实现数据传输等功能。

单片机通信方式可以分为同步通信和异步通信两种。

本文将从通信方式的定义、特点、优缺点等方面进行详细介绍,并分析两种通信方式的应用场景。

一、同步通信同步通信是指通信双方针对数据传输采用完全同步的方式,即发送端每次发送一个完整的数据帧,接收端则需要在数据帧中找到起始位和终止位,以便正确解析出数据。

同步通信采用单一时钟,所以不需要通过特殊的控制信号来识别不同的数据单元。

同步通信的特点是传输速度快,数据传输稳定可靠,不容易出现误差。

由于同步通信通过时钟信号进行控制,因此可以按照固定的时间间隔发送数据,使得数据传输更加准确。

因此,同步通信广泛应用于需要高速数据传输的场合,比如高速网络、音频视频等领域。

同步通信的缺点是在传输过程中需要占用较多的带宽,资源利用率较低。

同时同步通信对硬件设备的要求也较高,对于一些较低成本的设备来说,同步通信可能不太合适。

三、应用场景同步通信和异步通信两种通信方式各有优缺点。

在实际应用中,如何选择合适的通信方式取决于具体的应用场景。

需要根据通信需求的不同以及硬件设备的实际情况来选择适合的通信方式。

在需要进行任意大小和速度数据传输的领域,比如智能家居、工业控制等领域,异步通信可能更加合适。

因为异步通信采用不间断的通信方式,不需要占用过多的带宽,资源利用率更高。

同时,异步通信对硬件设备的要求更加灵活,适应性更强。

PIC单片机原理及应用

PIC单片机原理及应用

PIC单片机原理及应用PIC单片机的原理是基于微处理器的原理,它包含了CPU、存储器、输入输出(I/O)端口、定时/计数器等功能单元。

其中,CPU负责执行指令,通过存储器存储数据和程序,通过输入输出端口与外部设备进行数据交互,通过定时/计数器实现计时和计数功能。

PIC单片机的应用非常广泛。

首先,它可以用于各种嵌入式系统中,如智能家居系统、工业自动化系统等。

在智能家居系统中,PIC单片机可以控制家电设备的开关和状态,实现智能化的控制;在工业自动化系统中,PIC单片机可以根据不同的传感器信号,控制设备的运行状态和生产流程。

其次,PIC单片机还可以用于电子产品设计中,如手机、数码相机等。

在手机中,PIC单片机可以实现电池电量显示、充电管理、触摸屏控制等功能;在数码相机中,PIC单片机可以控制图像处理、曝光控制、对焦等功能。

此外,PIC单片机还可以应用于通信设备、医疗设备、汽车电子等领域。

在PIC单片机的开发过程中,需要使用相应的开发工具和软件。

Microchip公司提供了一系列的开发工具和编程软件,如PICkit系列的编程器、MPLAB X IDE集成开发环境等,方便开发者进行开发和调试。

同时,PIC单片机采用C语言进行编程,可以通过编写代码实现相应的功能和控制。

总之,PIC单片机作为一种强大的单片微控制器,具有体积小、功耗低、性能稳定等特点,广泛应用于各种电子设备中。

它的原理基于微处理器的原理,具有CPU、存储器、输入输出端口、定时/计数器等功能单元。

通过合理使用PIC单片机的开发工具和软件,可以实现各种应用需求,为电子行业的发展提供了有力的支持。

PIC单片机与PC机异步串行通信的设计

PIC单片机与PC机异步串行通信的设计

赵凯摘要:当PIC单片机不具备片上硬件USART或USART不够用时,可以利用软件模拟实现异步串行通信。

论述了异步串行通信的基本概念,根据中断驱动的软件模拟异步串行通信的要求,设计了PIC单片机与PC机之间的接口电路和通信程序框图,单片机程序利用PIC单片机指令集编写,PC机程序利用VB编写。

关键词:PIC单片机;异步串行通信;VB;外部中断引言因为具有运行速度快、低功耗、价格低、体积小等优点,MICROCHIP公司推出的PIC系列单片机已经得到越来越广泛的应用。

应用之一是作为下位机与上位机(例如PC机)通信,它被广泛应用在工业控制、数据采集和检测等领域中。

单片机与PC机通信的方式有串行通信、并行通信。

其中,串行通信具有硬件电路简单、软件实现容易和运行可靠等优点,十分适合对实时性要求不太高的场合。

由于部分PIC 单片机不具备串行通信所需的硬件USART口,故系统设计者需要用软件实现PIC单片机与PC机之间的串行通信。

笔者介绍利用PIC单片机的中断功能实现异步串行通信的方法。

异步串行通信基本概念异步串行通信字符格式如图1所示。

通信线路上传送的每个字符包括1个起始位、5~8个数据位、1个奇偶校验位(可无)和1~2个停止位。

每个字符的传送都是以起始位作为开始标志,紧跟其后的是要传送的数据(低位先传送),然后是奇偶校验位,最后是停止位。

相邻字符之间的时间间隔即空闲时间可为任意长。

线路空闲时应表现为“1”,当检测到“0”时,表示一帧字符的开始。

串行接口硬件电路选用的单片机型号为PIC16C711,不具备硬件USART,需要用一般I/O口来模拟串行口。

如图2所示,RB0为接收脚,RB5为发送脚。

RB0除作为一般I/O引脚外,还可以作为外部中断输入引脚,引起中断的方式分为上跳沿和下跳沿2种方式。

在本文中,设置下跳沿引起中断。

当起始位到来时,RB0上出现下跳沿,引起中断,如果不是干扰信号则开始接收数据。

RS-485标准的特点是抗干扰能力强,传输速率高、传送距离远。

用软件实现PIC16f877a异步串行口通信

用软件实现PIC16f877a异步串行口通信

用软件实现PIC单片机异步串行口通信的方法在讨论具体实现方式前,我们先来简单回顾一下异步串行通信的格式定义。

发送一个完整的字节信息,必须有“起始位”、“若干数据位”、“奇偶校验位”和“停止位”;必须定义每位信息的时间宽度——每秒发送的信息位个数,即为“波特率”。

单片机系统中常用的波特率从300~19 200 b/s。

当波特率为1200b/s时,每个信息位的时间宽度为1/1200≈833μs;无数据通信时,数据线空闲状态应该是高电平,“起始位”为低电平,数据位低位先发且后跟奇偶校验位(若有),“停止位”为高电平,如图1所示。

图1按图1最基本的异步串行通信时序,软件实现UART在不同架构的单片机上有多种方法。

其中数据接收是关键,因异步通信没有可参照的时钟信号,发送方随时都可能发送数据,任何时刻串行数据到来时,系统都应该及时准确地接收。

比较而言,本机发送串行数据相对容易,只要对发送出去的电平做持续时间的定时即可。

按不同的接收技巧并针对PIC单片机的特点,这里介绍两种常用且十分可靠的方法。

1 三倍速采样法三倍速采样法顾名思义就是以三倍于波特率的频率对接收引脚Rx进行采样,保证检测到“起始位”,又可以调整采样的时间间隔;将有效数据位的采样点控制在码元的中间1/3处,最大限度地减少误码,提高接收的准确性。

我们把图1的起始位和部分数据位放大,如图2所示,把每个信息位分成三等份,每等份的时间宽度设为ts,以方便分析。

图2以三倍频对信息位进行采样时,每个信息位都将可能被采样到三次。

当处于空闲状态并检测起始位时,最早检测到起始位低电平的时刻必将落在S0阴影区,虽然每次具体的采样点会在此S0阴影区随机变化。

检测到起始位低电平后,间隔4×ts时间,正好是第一位数据位的中间1/3处(图2中Ds阴影区)。

此后的数据位、校验位和停止位的采样间隔都是3×ts,所有采样点均落在码元的中间1/3处,采样数据最可靠。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PIC单片机同步异步通信的应用
PIC单片机同步异步通信的应用
PIC单片机是一种微型控制器,其底层系统由CPU和外围设备组成,通常用于各种类型的自动化和控制应用程序中。

在现代自动化和通信系统中,PIC单片机同步异步通信是至关重要的一部分,在许多应用程序中起着关键作用。

本文将探讨PIC单片机同步异步通信的应用,并深入探讨同步异步通信的概念以及其与PIC单片机的相互关系。

同步与异步通信
通信是两个或多个设备之间传输数据的过程。

同步和异步通信是两种不同的通信方法。

同步通信:在同步通信中,传输数据的两个设备之间需要协调各自的进程以确保数据被收发方同时接收和发送。

例如,发送方要发送500个字节,那么接收方必须发送一个确认信息给发送方,之后发送方才能继续发送下一个包。

异步通信:在异步通信中,设备可以独立地发送和接收数据,而不需要协调。

例如,在异步通信中,当发送方输11101101,接收方不断收到该数据直到数据的传输完成。

PIC单片机同步通信应用
在现代自动化和控制系统中,PIC单片机同步通信应用之一就是使用SPI(串行外设接口)进行通信。

SPI是一种简单却
强大的同步通信基本协议,它通常在PCB板上使用,用于把芯片(比如EEPROM、RTC等临时存储位置)连接到主处理器上。

作为一种高效的同步通信协议,SPI在与PIC单片机一起使用时,它可以实现超过20MB/s的速度,大幅加快了PIC单片机与其他外设设备之间传输数据的速度。

除此之外,PIC单片机同步通信应用还可以使用I2C通信协议,这种基于同步方式的通信协议通常用于连接微控制器与外设设备,比如传感器和计时器等。

I2C通信协议支持单主机同时控制多个设备,以及多个从设备控制同一个总线的情况。

PIC单片机异步通信应用
在PIC单片机异步通信应用中,最常见的是使用USART(通用同步/异步收发器)。

USART接口允许单片机与其他串行设备进行通信,比如与计算机上串口设备的通信。

通过使用USART协议,PIC单片机可以从计算机上接收和发送数据,以
便进行实时监控和数据记录等控制操作。

此外,也可以使用UART通信协议在PIC单片机中实现异
步通信。

UART是一种普遍使用的异步通信协议,它允许PIC
单片机与外部设备进行数据传输。

当要通过UART协议传输数
据时,PIC单片机必须调整自己的时钟和波特率,以确保其与
另一个设备同步。

总结
可以看出,在PIC单片机应用中,同步异步通信是常见的
通信方法,每种方法都有不同的优缺点,并具有广泛的应用。

当需要快速传输数据时,可以选择基于同步通信的SPI等协议,
对于控制环境中要求较高的I2C协议,可以从多个方面管理通
信设备;基于异步通信的USART和UART通信协议适合用于更高级别的数据监控和控制。

了解PIC单片机中的同步异步通信
不仅有助于扩展硬件系统,还可最大限度地发挥单片机的性能,确保安全稳定的通信和控制操作。

相关文档
最新文档