精华内容
下载资源
问答
  • PIC单片机学习—USART串口

    千次阅读 2020-11-27 11:23:13
    最近做了几个项目都用到了PIC单片机,在这几个项目之前我只用到了51单片机和STM32来做控制类的项目,用PIC单片机的时候发现使用的时候和51单片机还是有所区别,有许多小坑需要注意,所以决定写几篇针对新手使用PIC...

    PIC单片机学习—USART串口

    最近做了几个项目都用到了PIC单片机,在这几个项目之前我只用到了51单片机和STM32来做控制类的项目,用PIC单片机的时候发现使用的时候和51单片机还是有所区别,有许多小坑需要注意,所以决定写几篇针对新手使用PIC单片机时可以参考学习的文章。


    前言

    串口是使用频率非常高的通信接口,掌握串口是单片机项目必须技能


    一、USART串口是什么?

    USART:(Universal Synchronous/Asynchronous Receiver/Transmitter),通用同步/异步串行接收/发送器。
    通用同步 / 异步收发器 (USART) 模块是两个串行 I/O 模块之一 , USART也称为串行通信接口或 SCI。
    USART 可以配置为全双工异步系统,可与计算机等外设进行通信;也可配置为半双工同步系统,可与 A/D 或 D/A 集成电路,以及串行 EEPROM等外设器件进行通信。


    二、PIC单片机USART串口配置要点

    1.与串口相关寄存器

    TXSTA:发送状态和控制寄存器
    TXSTA:发送状态和控制寄存器
    TXSTA寄存器解释RCSTA:接收状态和控制寄存器
    RCSTA:接收状态和控制寄存器接收寄存器解释

    2.异步模式配置步骤

    我们使用串口一般都使用异步模式,下面简单介绍异步配置步骤:
    1.初始化SPBRGH和SPBRGL寄存器对以及BRGH和BRG16位,获得所需的波特率。
    2.清零RX引脚的ANSEL位(如适用)。
    3.将SPEN位置1使能串口。SYNC位必须清零才能进行异步操作。
    4.如果需要中断,将PIE1寄存器的RCIE位以及INTCON寄存器的GIE和PEIE位置1。
    5.如果需要接收9位数据,将RX9位置1。
    6.将CREN位置1使能接收。
    7.当字符从RSR被移入接收缓冲区时,RCIF中断标志位将被置1。如果RCIE中断允许位也置1,则产生中断。
    8.读取RCSTA寄存器取得错误标志和第9个数据位(9位数据接收使能时)。
    9.读取RCREG寄存器从接收缓冲区取得接收数据的低8位。
    10.发生溢出时,通过清零CREN接收器使能位清零OERR标志位。


    三、容易“踩坑”点

    以下是我在实际使用中碰到的一些小问题,这几次都是调试了半天,最后猛的发现原来是这个问题,大家只要注意了就可以避免,望大家参考。

    1、IO口配置必须正确

    PIC单片机的串口一般都是与通用IO口复用,当启用串口功能时,一部分PIC单片机只要使能了串口收发功能,就会自动配置好TX及RX相关端口,不论TRIS三态寄存器相关为配置是输入或输出,TX及RX都可正常使用。但是PIC16LF1823的RX端口必须配置TRIS相关位为输入。
    另外PIC的串口经常会和模拟口复用,这里必须要配置为数字口,否则会一直读为0.
    总结,使用串口时,相关IO口必须配置为数字模式,同时TX配置为输出模式,RX配置为输入模式,这样的话,不论在哪种型号的单片机上都可以正常使用,就不会出现预期外的问题。

    2、电压与晶振频率相匹配

    使用PIC单片机时必须要注意单片机工作在不同的电压时,所能使用的晶振频率是有区别的,大家一定要注意查看相对应芯片数据手册,一般是在电气规范章节中。不过电压和频率配置不对,单片机无法正常工作。比如,下面PIC1LF886的电压与频率关系图。
    PIC16F883/884/886/887 电压—频率关系图从上面的电压-频率关系图,我们可以看出,当PIC16F886使用3.3V电压时,如果配上12MHz晶振,单片机是无法正常工作的。

    展开全文
  • PIC18单片机 官方示例所有程序 包含AD TIMER0123 USART
  • PIC单片机之EUSART串行通信接口

    万次阅读 热门讨论 2013-04-27 11:22:37
    PIC 单片机的EUSART是一种串行通信接口,我们可以利用他让不同设备之间传输数据,我们来讲讲我们最常用的串行异步接收和发送。 管脚  串行异步接收和发送。如果只要两个引脚,一个是接收RX 一个是发送TX。 ...

         PIC 单片机的EUSART是一种串行通信接口,我们可以利用他让不同设备之间传输数据,我们来讲讲我们最常用的串行异步接收和发送。

    管脚

      串行异步接收和发送。如果只要两个引脚,一个是接收RX 一个是发送TX

    数据格式

       我们先来讲讲TX是如何发送出数据的,数据格式具体是什么样的。

      

        

         如果我们要向其他设备发送个大写字母A。将是什么样的呢。"A"这个字母对应的ASCII码是65,对应的八位二进制数则是 01000100TX就将对应的二进制码发送出去。

         发送时用高电平来代表1,用低电平代表0. 那不发送数据的时候管脚就一直为高电平。 

    启动位和停止位

          怎么区分现在是在发送数据还是在常态呢?所以在每次发送一个字节的数据之前TX脚都会先输出一小段的低电平。来告诉对方,我要发送数据了这一小段低电平便是启动位(起始位)。

        如果我们发送的不仅仅只有一个字节,而是好几个字节,两个数据之间总要有个间隔吧!要不然分不清谁跟谁。所以每发送完一个字节的数据,TX脚就会输出一小段的高电平这便是停止位。

      波特率

          在数据发送中每个位的时间都要事先定好,而且发送和接收的双方都必须事先知道并设置好。那这个时间是怎么确定的呢?这就牵扯的一个东西波特率。在这里波特率=比特率。比特率也就是 一秒钟发送多少位的数据。如果要一秒钟发送为9600个位,我们将波特率设置为96001/9600约等于0.0001s 也就是每个位的发送时间。

    小端发送

        如果 发送大写字母“ A ”也就是发送二进制数 “01000100”,串行通信是从低位开始发送。

    下图为字母”A”数据发送的时序图.

    实例:我们可以利用PC机的串口和单片机进行异步串行通信,单片机接收到什么样的数据,就在给PC机发送数据,波特率为115200。不过单片机输出的TTL信号,需TTL232.PC机才能接收。有关这方面的硬件设计网上很多故不赘述。

    在官方的数据手册有对应配置步骤,不过我将根据我的实例来讲解其实也是大同小异。

    1,配置端口

       1.1配置备用功能

          我们可以看单片机的引脚图,第13和第6脚都标有TX说明这两个引脚是可以作为EUSART数据输出。第12和第5脚都标有RX说明这两个引脚是都可以作为EUSART数据输入的。但是同时只有一个引脚作为RX或者TX。不可以同时有两个RXTXRXTX的选择是通过APFCON。我们这里选择13脚作为TX,选择12脚作为RX.配置如下:

           APFCONbits.TXCKSEL = 1;//RA0

           APFCONbits.RXDTSEL = 1;//RA1

           

       1.2RX脚配置位数字输入。

          我们可以看第12脚上标有AN1,说明该引脚还带有模拟输入的功能。所以我们必须将其设置为数字输入。配置如下:

          TRISA1 = 1;//RA1 RX input

          ANSELAbits.ANSA1=0;

     2 配置波特率 

          如何设置波特率为115200呢,这里我们必须先要知道计算公式。在官方的数据手册中有给我们提供表格。到底选择那个公式由SYNCBRG16,BRGH这三个位的配置决定。

    我们选在异步通信模式故SYNC0

    波特率发生器位,可以选择8位或者16位。不过选择16位。波特率的精度会更高。所以选择16位。BRG161.

    我们这里选择高速的波特率BRGH1

    配置如下:

        TXSTAbits.BRGH   =1; //high speed

        BAUDCONbits.BRG16  =1; //16bit Baud rate Generator is used

    TXSTAbits.SYNC   =0; //Asynchronous mode

     

       我们可以得出我们的计算公式为 波特率=FOSC/[4(n+1)]

    我们的波特率为115200,时钟定为32MHz。计算出n的值。

    115200=32MHz/[4(n+1)];可以得到n=68.444 n=0x44;

    0x44存入到SPBRGHSPBRGL中,配置如下

     SPBRGH = 0x00;//

     SPBRGL = 0x44;// Baud rate 115200

    3,配置接收中断

       实际可以根据自己的需求配置是否用中断接收。不过这里设置为中断接收,配置如下。

        PIE1bits.RCIE = 1; //enables the USART Receive interrupt

        INTCONbits.PEIE = 1;

    INTCONbits.GIE  = 1;

    4,开启串口的功能

        开启接收,开启发送,开启串口功能,配置如下:

        RCSTAbits.CREN = 1;//Enables receiver

        TXSTAbits.TXEN = 1;//Transmit enabled

    RCSTAbits.SPEN   =1; //serial port enable

    实例代码:单片机型PIC16LF1823,开发环境MPLAB X IDE.

    #include<pic.h>

    __CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF&BOREN_ON

                       &CLKOUTEN_OFF&IESO_ON&FCMEN_ON);//这个要放到上一行去

    __CONFIG(PLLEN_OFF&LVP_OFF) ;

    unsigned char RC_DATA;

    unsigned char RC_FLAG;

    void init_fosc(void)

    {

     OSCCON = 0xF0;//32MHz

    }

    void init_eusart()

    {

        APFCONbits.TXCKSEL = 1;//RA0

        APFCONbits.RXDTSEL = 1;//RA1

        TRISA1 = 1;//RA1 RX input

        ANSELAbits.ANSA1=0;

        SPBRGH = 0x00;//

        SPBRGL = 0x44;// Baud rate 115200

        TXSTAbits.BRGH   =1; //high speed

        BAUDCONbits.BRG16  =1; //16bit Baud rate Generator is used

        TXSTAbits.SYNC   =0; //Asynchronous mode

        PIE1bits.RCIE = 1; //enables the USART Receive interrupt

        INTCONbits.PEIE = 1;

        INTCONbits.GIE  = 1;

        RCSTAbits.CREN = 1;//Enables receiver

        TXSTAbits.TXEN = 1;//Transmit enabled

        RCSTAbits.SPEN   =1; //serial port enable

    }

    void tx_eusart(unsigned char tx_data)

    {

        TXREG = tx_data;

        while(TRMT==0);// loop

    }

    void interrupt isr(void)

    {

         if (RCIE && RCIF) {

            RC_DATA=RCREG;

            RC_FLAG=1;

            LATA2 = 1;

        }

    }

    /*

     * 

     */

    int main(int argc, char** argv) {

        init_fosc();

        init_eusart();

        RC_FLAG=0;

        TRISA2 = 0;

        LATA2 = 0;

        while(1)

        {

          

          if(RC_FLAG > 0)

           {

            tx_eusart(RC_DATA);

            RC_FLAG=0;

            LATA2=0;

           }

        }

    }

    展开全文
  • 最近一周一直在做pic单片机功耗问题。由于项目使用电池供电,所以功耗问题显得非常重要。根据数据手册以及网络上的资料,影响单片机功耗主要由以下几个因素:1:所有I/O引脚保持为高阻输入高点平或低电平2:关闭比较...
  • PIC单片机实用教程-提高篇 作者:李学海 编著 出版社:北京航天航空大学出版社 出版时间: 2002-09 pic单片机实用教程(提高篇)以介绍PIC16F87X型号单片机为主,并适当兼顾PIC全系列,共分9章,内容包括:存储器;I/...
  •  1 PIC单片机及其同步/异步串行接口USART模块功能简介  PIC16F877A单片机内部有8K*14的FLASH程序存储器和512字的RAM数据存储器:不仅采用哈佛体系结构,而且还采用哈佛总线结构,流水线操作,PIC16F877A大大提高...
  • #include<pic.h> #define uchar unsigned char #define uint unsigned int __CONFIG(0x3B31); //__CONFIG (CP_OFF &WDTE_OFF& BOREN_OFF&PWRTE_OFF &FOSC_HS&WRT_OFF&LVP_OFF&CPD_OFF); int a[10]={0x30,0x31,0x32,...
    #include<pic.h>
    #define uchar unsigned char
    #define uint  unsigned int
    __CONFIG(0x3B31);
    //__CONFIG (CP_OFF     &WDTE_OFF& BOREN_OFF&PWRTE_OFF &FOSC_HS&WRT_OFF&LVP_OFF&CPD_OFF);
    int a[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37};
    int j;
    
    //显示一个整形的数组
    void Show_array(int array[],int n);//显示一个字符型的数组
    void init();
    
    void main()
    {
    	init();
    	TXREG=0x31;
    	while(!TRMT);
    //	TXREG=0x32;
    //	while(!TRMT);
    //	TXREG=0x33;
    //	while(!TRMT);
    //	TXREG=0x34;
    //	while(!TRMT);
    	
    	
    //	TXREG=0x01;
    //	while(TRMT!=1);// 一直等到TSR为空   	
    	
    //	Show_array(a,10);//显示一个字符型的数组
    	while(1);
    }
    void init()
    {
    	TRISC=0xff;
    	TXSTA=0x24;
    	RCSTA=0x90;
    	SPBRG=25;
    	GIE=1;
    	PEIE=1;
    	RCIE=1;
    }
    void interrupt com()
    {
    	if(RCIE&&RCIF)
    	{
    		TXREG=RCREG;
    		while(!TRMT);
    	}
    }
    
    
    //显示一个整形的数组
    void Show_array(int array[],int n)//显示一个字符型的数组
    {	
    	for(j=0;j<n;j++){
        	TXREG=array[j];
    		while(TRMT!=1);// 一直等到TSR为空   
    	}
    }

    展开全文
  • 摘要:详细介绍PIC单片机使用SPI方式与IC卡进行数据传输的原理和电路设计,以及使用USART方式与PC机进行串行异步通信的工作原理;介绍PIC单片机听SPI方式和USART方式的设置方法。 关键词:PIC单片机 IC卡读写器 SPI...
  • 摘要:当PIC单片机不具备片上硬件USARTUSART不够用时,可以利用软件模拟实现异步串行通信。论述了异步串行通信的基本概念,根据中断驱动的软件模拟异步串行通信的要求,设计了PIC单片机与PC机之间的接口电路和通信...
  • PIC16F87X系列单片机可以接收多达14个中断源。中断控制器寄存器INTCON标记着各个中断源的请求,对各个中断设置屏蔽位,对全部中断设置全局屏蔽位。  PIC16F87X系列的中断包含:TMR0溢出中断(TOIF)、外部中断...
  • 本文介绍如何利用PIC 单片机USART 模块模拟实现SPI 和I2C 总线通信。其中 SPI 总线通信实现过程较为简单,本文只给予扼要介绍,对于用USART 模块来实现I2C 总 线通信是本文的重点,除了介绍实现的方法外,还给出了...
  • 单片机串口调试丢包验证过程记录 已解决
                   
    void main_form::remoteDataIncoming() //QSocketNotifier监测到出口有数据读就自动调用该函数(一般不会丢数据){    u_char a;    read(m_fd,read_buf,33);    for(a=0;a<33;a++)        qDebug("%u",read_buf[a]);}
    if((event->timerId()==m_timerId)&&(RADIO_STAR==0))//条件判断(如果是定时器1时间到 且 没有进行广播,就正常采样)    {   //定时器1        i++;if(i>=6)i=1;        w_length=MONITOR_LENGTH;w_cid=MONITOR_CID;w_chksum=w_length+w_cid+addr[i];        u_char w_data_buf[3]={w_length,w_cid,w_chksum};        bzero(read_buf,sizeof(read_buf));        sendAddr(addr[i]);        //usleep(1000); //bukequede        sendData(w_data_buf);        usleep(2000);        remoteDataIncoming(0x02);        qDebug("i:%d",i);    }

    这样好一点,主要是在sendData后延时一下……让单片机反应一下,应该是单片机的事,以前都是单片机的发送的灯都不亮,只要亮就能收到数的,这个应该是单片机的问题,不过也不能这么说,因为用小程序时就没有问题,到这就有问题了,是不是发的有问题呢,这个很难说了……

    还是用Qt的事件结构吧,这样也可以,如果确定这样不行的话再改吧……又想起来了,小程序测试时没有进行清零,清零一下看看:


    #include <stdio.h>      /*标准输入输出定义*/  #include <stdlib.h>     /*标准函数库定义*/  #include <unistd.h>     /*Unix 标准函数定义*/  #include <sys/types.h>     /*系统类型定义*/  #include <sys/stat.h>         /*系统状态定义*/  #include <fcntl.h>      /*文件控制定义*/  #include <termios.h>    /*PPSIX 终端控制定义*/  #include <errno.h>      /*错误号定义*/  #include <string.h>    struct termios serialAttr; const char data[]={0x02,0x01,0x05};  int spaceSerialPort(int m_fd) //空校验  {      int fd=m_fd;       serialAttr.c_cflag |= PARENB | PARODD | CMSPAR;//ou      if(tcsetattr(fd, TCSANOW, &serialAttr) !=0)   //配置立刻起作用      {          perror("serial error");          return -1;      }      return 0;  }  int markSerialPort(int m_fd) // {      int fd=m_fd;       serialAttr.c_cflag |= PARENB | CMSPAR;//ou      serialAttr.c_cflag &= ~PARODD;      if(tcsetattr(fd, TCSANOW, &serialAttr) !=0)   //配置立刻起作用      {          perror("serial error");          return -1;      }      return 0;  }     int main(void)  {      int fd = -1;        const char *devName = "/dev/ttySAC1";    char read_buf[33];      fd = open(devName, O_RDWR|O_NONBLOCK);      if (fd < 0) {          return -1;      }         memset(&serialAttr, 0, sizeof serialAttr);      serialAttr.c_iflag = IGNPAR;      serialAttr.c_cflag = B9600 | HUPCL | CS8 | CREAD | CLOCAL ;      serialAttr.c_cflag |= PARODD; //JI      serialAttr.c_cc[VMIN] = 0;           if (tcsetattr(fd, TCSANOW, &serialAttr) != 0) {          return -1;      }        while(1)      {   printf("hw\n");        char addr = 0x02char i = 0; bzero(read_buf,sizeof read_buf); markSerialPort(fd);          write(fd, &addr, 1); usleep(1000); spaceSerialPort(fd); write(fd, data, 3);          usleep(90000); read(fd,read_buf,sizeof read_buf); for(i=0;i<33;i++) { printf("%x",read_buf[i]); }   printf("\n");    }  }
    添加62行所示……

    ================================================================================================================

    2012年10月23日20:23:03:终于露出马脚了,看读到的信息:

    [root@FriendlyARM mark]# ./a
    hw
    000000000000000000000000000000000
    hw
    000000000000000000000000000000000
    hw
    233014694194567891921718192021222324253233342003738394041130
    hw
    000000000000000000000000000000000
    hw
    000000000000000000000000000000000
    hw
    000000000000000000000000000000000
    hw
    000000000000000000000000000000000
    hw
    000000000000000000000000000000000
    hw
    000000000000000000000000000000000
    hw
    000000000000000000000000000000000
    hw
    000000000000000000000000000000000
    hw
    233014694194567891921718192021222324253233342003738394041130
    hw
    233014694194567891921718192021222324253233342003738394041130
    hw
    000000000000000000000000000000000
    hw
    000000000000000000000000000000000
    hw
    000000000000000000000000000000000
    hw
    000000000000000000000000000000000
    hw
    233014694194567891921718192021222324253233342003738394041130
    hw
    000000000000000000000000000000000
    hw
    000000000000000000000000000000000
    hw
    233014694194567891921718192021222324253233342003738394041130
    hw
    233014694194567891921718192021222324253233342003738394041130
    hw
    233014694194567891921718192021222324253233342003738394041130
    hw
    233014694194567891921718192021222324253233342003738394041130

    总结:原来也会丢数据呀,看来我得把小程序调好了先!

    ========================================================================================================================

    2012年10月23日21:43:42:很无奈呀,怎么调都会丢包,就暂且归为 串口丢包 吧,搜搜前辈们是怎么解决的!

    1.ARM串口通讯丢包问题

    2.http://topic.csdn.net/u/20120820/12/7011b84f-1fc6-42c6-82a3-5b027ba90eca.html?10181

    3.http://zhidao.baidu.com/question/265254259

    4.http://zhidao.baidu.com/question/147480744

    5.传送数据之后,校验。丢失就重发。

    6.降低发送速度2边协同!

    7.适当 降低 波特率 试试看  通信 双方的 配合 很重要

    8.一般 电脑可以设置的 最高 128000

    ======================================================================================================================

    2012年11月4日15:27:05:我想到单片机没有在串口中断之后关闭中断造成的:

    输出结果:

    [root@FriendlyARM mark]# ./c
    hw
    2210929299456789c0111213141516171819202122c8252627282982
    hw
    2210929299456789c0111213141516171819202122c8252627282982
    hw
    2210929299456789c0111213141516171819202122c8252627282982
    hw
    2210929299456789c0111213141516171819202122c8252627282982
    hw
    2210929299456789c0111213141516171819202122c8252627282982
    hw
    2210929299456789c0111213141516171819202122c8252627282982
    尼玛,还真是没有关中断引起的错误,害死人。。。。。。。。。。。。。。。。。。。。。。。。

    MCU程序:

    #include <reg52.h>#define uchar unsigned char#define uint  unsigned int#define slaveaddr 0x02  //从机地址#define radioaddr 0xff  //广播地址uchar  buf[10];uchar  tab2[]={0x02,0x21,0x00,0x92,0x09,0x29,0x09,0x04,0x05,0x06,0x07,0x08,0x09,0xc0,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0xc8,0x25,0x26,0x27,0x28,0x29,130};uchar request_flag = 0;uchar radio_flag = 0;sbit LED=P3^7;/延时函数///  void Delayus(int t)while(t--);}//发送一个字节函数///void send_byte(unsigned char dat) //send one byte {    //RDE = 1;//485为发送 SBUF = dat; while(!TI);//等待发送结束 TI=0;//发送完毕后标志位清零 //RDE = 0;//485为接收 }//串口初始化void UartInit(){   //RDE=0;/*保持为接收状态*/     TMOD=0X21; //定时器T1设为方式2    TH1= 0xfd; //波特率设为9600   TL1= 0xfd//    SCON=0xd0; //方式3允许接收   SM2 = 1;   TR1=1;   EA=1;   ES=1; }/主函数///void main(){ uchar i=0,k = 0; UartInit();  while(1) {   if(radio_flag == 1)  {   SM2=0;//转为一对一通信   for(i=0;i<5;i++)   {     //send_byte(i);        while(!RI);         if(RB8==1)    return;            buf[i] = SBUF;    RI = 0;     }    if((buf[2]==0x00)&&(buf[3]==0x01)&&(buf[4]==0x0a))   {    LED=0;       }   else if((buf[2]==0x01)&&(buf[3]==0x01)&&(buf[4]==0x0b))   {    LED=1;       }   ES = 1;   SM2=1;    radio_flag = 0;  }  else if(request_flag == 1)  {   SM2=0;//转为一对一通信   for(i=0;i<3;i++)   {     //send_byte(i);        while(!RI);         if(RB8==1)    return;            buf[i] = SBUF;    RI = 0;     }    if((buf[0]==0x02)&&(buf[1]==0x01)&&(buf[2]==0x05))   {    for(k=0; k<33; k++)    {          send_byte(tab2[k]);//发送一数据          //Delayus(30);     }       }   ES = 1;   SM2=1;    request_flag = 0;  }  }}串口中断服务子程序void uart() interrupt 4{ uchar rc;  if(RI==1)//接到数据置标志位 {    RI=0;//接收完毕标志位置0  rc=SBUF;//保存缓存数据     if(radioaddr == rc)  {   ES = 0;   //request_flag = 1;   radio_flag = 1;  }  else if(slaveaddr == rc)  {   ES = 0;     request_flag = 1;    } }}/end/
    重点在:ES = 0;OR ES = 1;

               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • UART与USART的区别

    万次阅读 2014-04-22 13:55:17
    UART与USART都是单片机上的串口通信,他们之间的区别如下:  首先从名字上看: UART:universal asynchronous receiver and transmitter通用异步收/发器 USART:universal synchronous asynchronous receiver and ...
  • PIC单片机精通_串口通信模块C实现

    千次阅读 2016-11-15 14:33:03
    1.串口通讯头/定义文件 usart.h #ifndef _SERIAL_H_ #define _SERIAL_H_ #define BAUD 9600 #define FOSC 9216000L #define NINE 0 /* Use 9bit communication? FALSE=8bit */ #define DIVIDER ((int)(FOS
  • PIC单片机printf()函数重定向

    千次阅读 2018-09-15 11:20:14
    基本信息: ...单片机PIC18F66K22 下载器:PICKit3 一、串口初始化 /* 函数名:void USART1_Init( void ) 功能:使用的是串口1,串口初始化 */ void USART1_Init( void ) { TRISC6 = 1; ...
  • PIC单片机内部寄存器信息汇总

    千次阅读 2019-03-11 12:56:53
    PIC16F876A / 877A  11=写保护关闭,所有的程序存储器可能被写入由EECON控制  10=0000h-00FFh写保护,0100h-1FFFh写入由EECON控制  01=0000h-07FFh写保护,0800h-1FFFh写入由EECON控制  00=0000h-0...
  • PIC单片机SPI通信读写93C46,并通过USART将读出的数据在串口调试助手上显示出来
  • __eol__全书基础设计类案例涵盖PIC单片机最基本的端口编程、定时/计数器应用、中断程序设计、A/D转换、CCP程序设计、EEPROM、Flash、USART及看门狗程序设计等;硬件应用类案例涉及单片机存储器扩展、接口扩展、译码...
  • PIC 单片机遇到的串口接收问题

    千次阅读 2018-05-15 10:05:25
    在使用PIC16F1825/9芯片的串口接收时遇到一个问题,就是当串口快速接收时容易出现串口假死的现象,也就是程序运行正常,串口发送也是正常的,但是串口就是不能接收数据。经查询PIC数据手册发现: PIC数据快速接收...
  • 关于PIC单片机SLEEP指令

    千次阅读 2019-03-26 16:58:26
    之前一直没有真正理解sleep指令,最近在做智能水表的产品的时候,用了一款8位的单片机PIC16F690,当看到程序中的sleep指令时以为执行后cpu还会工作,导致一些认识上的错误,在网上搜索了一下,找到了一篇关于sleep的...
  • 全球领先的单片机和模拟半导体供应商——Microchip Technology Inc.(美国微芯科技公司)推出新款PIC18F45J10单片机系列。新产品采用28引脚封装、配备32 KB闪存程序存储器,是目前世界上速度最快的8位单片机之一。该...
  • PIC单片机入门_中断系统详解

    万次阅读 多人点赞 2016-11-10 17:05:31
    单片机正在执行程序时,出现了某些特殊状况,例如定时时间到、有键盘信号输入等,此时CPU须要暂时停止当前的程序,而转去执行处理这些事件的程序,待执行完这些特定的程序之后,再返回到原先的程序去执行,这就...
  • Microchip PIC系列8位单片机入门教程(三)UART串口的使用 第一节 知识点 关键点 (1)增强型通用同步/ 异步收发器(EUSART):增强型通用同步/ 异步收发器(Universal Synchronous Asynchronous Receiver ...
  • 成本、性能及外设优势于一身新型PIC18F45J10单片机系列在3V工作电压下运行速度达40 MHz,拥有丰富的外设配置,与5V单片机相比,可节省30%的成本.  Microchip推出新款PIC18F45J10单片机系列。新产品采用28引脚封装...
  • 单片机通信模块都很相似:端口方向配置(那个是发送数据?哪个是接收数据?);串口状态配置(打开串口?连续发送?同步/异步?);中断配置(打开接收中断触发事件、开启总中断、开启外围中断触发);最后一个是...
  • 书 名:零点起步——PIC单片机常用模块与典型实例 丛书名:零点起步系列丛书 闫广明 张波 孙小君 等编著 机械工业出版社 责任编辑 郝建伟 李宁 书 号 见本光盘盘面 对应盘号 见本光盘盘面 一、运行环境 1....
  • PIC单片机程序全集

    热门讨论 2011-11-17 18:02:14
    程序是按照模块写的!其中有睡眠例程、AD转换、I2C通讯、USART、PSP从动接口等等编程。
  • 基于PIC16f877的USART端口的多机通信 简单的多机通讯程序,附带原理图!
  • pic--USART

    2014-06-20 20:41:17
    pic单片机程序源码全集,USART program,很详细
  • 通用同步 / 异步收发器 (Universal Synchronous/Asynchronous Receiver/Transmitter, USART) 模块是两个串行 I/O 模块之一 ( 另一个是 Synchronous Serial,SSP 模块 )。 USART也称为串行通讯接口(Serial ...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 278
精华内容 111
关键字:

pic单片机usart