单片机更改串口_怎样更改单片机程序下载串口 - CSDN
  • [单片机] MCU自定义引脚当串口

    千次阅读 2019-07-08 11:07:56
    串口RS232的数据协议有两种,我们以PC与8位/32位单片机间比较常用的异步模式为例子讲解. 单片机的TXD引脚先发一个低电平0给对方,然后发送5–8个位作为数据,最后发送1个位奇偶校验和1个位高电平1作为停止位. 以下...

    串口RS232的数据协议有两种,我们以PC与8位/32位单片机间比较常用的异步模式为例子讲解.
    单片机的TXD引脚先发一个低电平0给对方,然后发送5–8个位作为数据,最后发送1个位奇偶校验和1个位高电平1作为停止位.
    以下例子为波特率9600bps,1个开始位,8个数据位,1个停止位 [10位数据,无奇偶校验位:9600-8-N-1]
    波特率:每秒钟发送的字节位,如果baud=9600,也就是说,每发送1位耗时1000/9600=104uSec

    /**************************************
       利用51定时器中断模拟串口信息发送
       优点:可以自定义串口引脚,可以实现多个串口
       格式: 9600-8-N-1
       功能:模拟串口Send
    *****************************************/
    #include <REG51.H>         
                                     
    char   g_nSendInx=0;
    char   g_nBuff=0;
    char   g_nFlag=0;
    
    #define MY_TXD P2_1 //定义TXD引脚,原生芯片是P3.1
    
    
    void Timer0Init(void)//104微秒@11.0592MHz
    {
     //1000ms/9600=104.166us
     //使用这种方案,由于精确性问题,长时间传输会偶然出现几个误码
    	TMOD &= 0xF0;		//设置定时器模式
    	TMOD |= 0x02;		//设置定时器模式
    	TL0 = 0xA0;		//设置定时初值
    	TH0 = 0xA0;		//设置定时重载值
    	TF0 = 0;		//清除TF0标志
    	TR0 = 1;		//定时器0开始计时
    
    	ET0=1;
    	EA=1;
    }
    
    /******************************
      自定义串口发送单字符  
    ******************************/
    void MyUart_Send(char ch){
      g_nFlag=0;
      g_nBuff=ch;
      TR0=1;
      while(g_nFlag==0);
    }
    
    
    /******************************
      自定义串口发送字符串
    ******************************/
    void MyUart_String(char* str){
     
      int i=0;
     
      while(*(str+i)){
       g_nFlag=0;
       g_nBuff=*(str+i);
        i++;
       TR0=1;
       while(g_nFlag==0);
      }
    }
    
    
    /*
       定时器0中断服务
    */
    void Timer0_ISP() interrupt 1{
    
      g_nSendInx++;//发送模拟第几位
    
      if(g_nSendInx==1)
      {
         MY_TXD=0;//起始位拉低
    
      }else if(g_nSendInx==10)  //格式: 9600-8-N-1,完整10Bit数据
      {
         MY_TXD=1;//停止位拉高
    	 TR0=0;
         g_nSendInx=0;
    	 g_nFlag=1;///发送完成标志位
      }else{
       
        MY_TXD=g_nBuff&0x01;sbuffer_data
    	g_nBuff>>=1;
      }
    
       
    }
    										 
    /**********************************
      用Timer0定时中断模拟串口信号
    **********************************/
    void main (void) {
    
       Timer0Init();///定时器初始化,周期为 1000ms/9600=104us
    
       MyUart_String("===Welcome,My Uart===\r\n ");
       MyUart_Send(0x61);
       MyUart_Send(0x62);
       MyUart_Send(0x63);
    
      while (1);
    
     }
    
    展开全文
  • 51单片机串口通信——串口设置

    千次阅读 2017-08-08 14:20:31
    51单片机串口通信如果全部把发送原理讲完的话可能要打好久几万字, 最重要的是我有些地方也没搞懂的,也讲不清楚,所以今天就直接用代码来解释…….hahahaha 串行口工作之前,应对其进行初始化,主要是设置产生...
      51单片机的串口通信如果全部把发送原理讲完的话可能要打好字,
    最重要的是我有些地方也没搞懂的,也讲不清楚,所以今天就直接用代码来解释…….hahahaha


    串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制和中断控制。
    具体步骤如下:

    1.确定T1的工作方式(编程TMOD寄存器);  
      
    2.计算T1的初值,装载TH1、TL1;  
      
    3.启动T1(编程TCON中的TR1位);  
      
    4.确定串行口控制(编程SCON寄存器);  
      

    5.串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。  


    一言不合上代码:

    #include "reg52.h"           //此头文件中定义了单片机的一些特殊功能寄存器  
      
    typedef unsigned int u16;        
    typedef unsigned char u8;  
      
    void UsartInit()  
    {  
        SCON=0X50;          //0101 000设置串行口控制寄存器sm0,sm1为01,即为工作方式1  
        TMOD=0X20;          //设置计数器工作方式2  
      
         /*看到这里的TMOD=0x20可能有同学会有疑问了,将定时器工作方式寄存器定义为0x20  
          就是将计数器1的M1M0设为10,即方式2(8位初值自动重装的8位定时器/计数器)  
          做过动态数码管的同学可能知道,数码管里的是选择定时器0,为什么要用定时器1呢?  
          单片机内部定时器0和定时器1虽然都是16位定时计数器,但在硬件结构和寄存器配置方面,  
          还是有一些不同之处的,通过对寄存器的配置:  
      
          1,定时器0可分成2个独立的8位定时器,而定时器1则不能;  
          2,定时器1可作为**串口的波特率发生器**,而定时器0则不能。*/  
      
        PCON=0X80;          //定义PCON寄存器中的SMOD=1,波特率加倍  
        TH1=0XF3;               //计数器初始值设置,注意波特率是4800的,当然大家可以改  
        TL1=0XF3;  
        EA=1;               //打开总中断  
        ES=1;               //打开中断允许中的串行口中断允许  
        TR1=1;              //打开计数器  
    }  
    void main()  
    {     
        UsartInit();  //    串口初始化  
        while(1);         
    }  
    void Usart() interrupt 4  
    {  
        u8 rec;  
        rec=SBUF+1;//出去接收到的数据,为了效果更明显,即向pc机发送1,回应2这样的效果  
        RI = 0;//清除接收中断标志位  
        SBUF=rec;//将接收到的数据放入到发送寄存器  
        while(!TI);          //等待发送数据完成  
        TI=0;                        //清除发送完成标志位  
    }


    展开全文
  • 51单片机串口通讯详解

    千次阅读 2019-11-04 22:26:31
    串口,作为单片机程序开发中最常用、最方便,也是应用最广泛的程序调试方法;无论是作为调试工具,打印出调试信息,还是对功能模块进行通信,串口是每个单片机开发人员最常用的单片机外设。 由于大部分51单片机不...

    串口,作为单片机程序开发中最常用、最方便,也是应用最广泛的程序调试方法;无论是作为调试工具,打印出调试信息,还是对功能模块进行通信,串口是每个单片机开发人员最常用的单片机外设。
    由于大部分51单片机不支持在线调试功能,所以串口作为一种有效的调试功能,所以在51单片机程序开发时,无法进行在线调试,不妨可以多采用串口来进行调试。
    1.串口配置

    51单片机配置除了需要配置2个8位寄存器SCON、PCON外,还要配置定时器1的控制寄存器TMOD,因为串口在进行收发需要使用定时器来采样。
    (1)状态控制寄存器 SCON
    SCON 是一个逐位定义的 8 位寄存器,用于控制串行通信的方式选择、接收和发送,指 示串口的状态,SCON 即可以字节寻址也可以位寻址,字节地址 98H,地址位为 98H~9FH。 它的各个位定义如下:
    在这里插入图片描述
    SM0 和 SM1 是串口的工作方式选择位,2 个选择位对应 4 种工作方式,如下表,其中 Fosc 是振荡器的频率。
    在这里插入图片描述
    (2)电源与波特率控制寄存器
    控制寄存器 PCON 也是一个逐位定义的 8 位寄存器,目前仅仅有几位有定义,如下所示:
    在这里插入图片描述
    仅最高位 SMOD 与串口的控制有关,其他位与掉电方式有关。PCON 的地址为 87H 只能按 字节寻址,SMOD 是串行通信波特率系数控制位,当串口工作在工作方式 1、2 时,若使用 T1 作为波特率发生器其 SMOD=1 则波特率加倍。
    (3)定时器控制模式寄存器
    TMOD是定时器、计数器模式控制寄存器,它是一个逐位定义的8为寄存器,但只能使用字节寻址
    在这里插入图片描述
    当串口工作在工作方式0和2是,波特率固定,方式0时fosc/12;方式2时fosc/32或fosc/64(根据SMOD判断)。当串口工作在方式1时,波特率=(2^SMOD/32)*(单片机时钟频率/(256-X)),X是初值;C/T#为定时器和计数器选择位,0为定时器,1为计数器

    2.串口通用程序
    为了有较好的通用性,将串口程序配置为一个H文件和C文件,往后只要开发51单片机程序,都可以将该两个文件复制在工程中直接使用,无须修改。
    (1)uart.H

    #ifndef _UART_H_
    #define _UART_H_
    
    #include "reg52.h"
    
    void UartInit(void);
    void Send_string(unsigned char *c);
    void Send_Data(unsigned char DAT);
    
    #endif
    

    (2)uart.c

    #include "uart.h"
    
    //串口初始化
    void UartInit(void)
    {
    	/*串口初始化 */
    	TMOD = 0x20;	  //定时器T1使用工作方式2
    	SCON = 0x50;	  //工作方式1,,允许接收   
    	PCON = 0x10;
    	TH1 = 253;        // 设置初值,波特率9600bps
    	TL1 = 253;
    	TR1 = 1;          // 开始计时	
    	ES = 1;         //打开接收中断
    	EA = 1;           // 打开所以中断   
    	TI = 0;
    	RI = 0;
    }
    
    void Send_Data(unsigned char DAT)
    {
    	ES = 0;
    	TI=0;
    	SBUF = DAT ;
    	while(TI==0);
    	TI=0;
    	ES = 1;
    }
    
    void Send_string(unsigned char  *c)
    {
    	while(*c != '\0')
    	{
    		Send_Data(*c++);
    	}	
    }
    
    void RSINTR() interrupt 4 using 2
    {
    	EA=0;
    	if(TI==1) //发送中断	  
    	{
    		TI=0;
    	}
    
    	if(RI==1)	 //接收中断		  
    	{	
    
    		RI=0;								 
    
    	}
    	EA=1;
    }
    
    

    如需串口参考例程, 请关注公众号,首页回复“串口”获取资料
    在这里插入图片描述

    展开全文
  • 适用于AT89c51/52单片机串口通信例程,可根据实际需求更改发送的数据和发送波特率
  • C51单片机————串行接口

    千次阅读 2018-07-15 14:44:16
    C51单片机————串行接口 定时(定时控制、测量、延时。。。)和计数(对外部事件统计数目)。 Created with Raphaël 2.1.2张三张三李四李四嘿,四哥, 定时器和计数器有哪几种实现哦?想了想主要有三种方法那...

    C51单片机————串行接口


    Created with Raphaël 2.1.2张三张三李四李四嘿,四哥,我最近在学习串行接口?想了想!有我啥事嗯!牛逼我有点不懂?哪里不懂哇额! 都不懂。。。

    1.引文

    计算机和外界的信息交换叫做通信。

    串行和并行

    基本的通信方式分为2种:串行和并行
    串行通信:这种通信方式发送/接收数据是一位一位按顺序(bit)的进行传输的(相当于公路的单行道吧!)

    传输线多(每次多传一位就多一根线)、价格贵、适合近距离的传输、传输速度快

    并行通信:发送/接收数据可以是多位同时传输的(到底是多少位一起传输,要看硬件设备了)

    传输线只需要1到2根就可以、便宜、远距离传输、但是速度慢(别人一次传几个,你一次传一个你说慢不慢)


    同步和异步

    这个怎么区分呢?
    根据帧信息的格式区分的!
    同步:我的理解就是通信的双方拥有相同的时间线,严格按照此时间线进行通信
    1. 通信的数据格式是 :同步字符–连续的数据–校验字节
    2. 速度高于异步,硬件结构高
    异步:可以看做不同时间轴的操作
    1. 通信的数据格式是 :一帧数据为11位的帧格式:起始位–数据8位–校验位-停止位 (1帧==11位)

    通俗点的理解:
    大家都买过衣服吧!在商场去买和在某宝上买就像同步和异步操作。
    在商场买衣服,需要选衣服,选了衣服后让服务员帮你包好,然后结束自己带回家,这个过程是连续的。
    在某宝上呢?你只是需要选衣服、下单然后就等着收快递了,虽然衣服还没有送到家,但是你买衣服的任务已经完成了。商家接到你的订单后,就会加紧安排送货,当然这一切已经跟你无关了,你已经支付完成,想什么就能去干什么了。
    额。。。好像也不通俗。。。


    通信方向

    单工传送:单行道,数据只可以朝着一个方向!
    半双工:可以双向传送的车道,但是两个方向不可同时使用(不能同时发送接收)
    全双工:双向传送的车道,可同时发送接收。

    2.串行通信的任务

    Created with Raphaël 2.1.2李四李四张三张三CPU处理什么数据的?知道吗额,并行数据对了!那他怎么处理串行数据呢?对啊!怎么处理啊?以手蒙面状。。。

    串行接口就在这儿起作用了?
    CPU处理并行数据的,让他处理串行数据的话就需要串行接口的帮忙了!CPU还要遵守串行通信的协议(通信双方都需要遵守的约定,约定有:数据格式、同步方式、传送步骤、检查/纠错的方式、控制符的定义。。。)

    串行接口的任务:

    1. 数据的处理(不同的串行通信有不同的数据格式)
    2. 并行数据和串行数据的转换
    3. 数据的传输速度
    4. 传输的错误检测(奇偶校验位、校验码。。。)

    串行接口的类型:

    串行通信接口Serial Communication Interface:设备之间互联接口,互相之间距离较长

    串行扩展接口Serial Expand Interface: SPI IIC。。。

    Baud rate | bps | Band width:

    Baud rate波特率:单位时间里传输的二进制代码有效位数

    bps比特率:单位时间里传输的码元个数

    Band width带宽:
    1. 模拟信号中:带宽是信号所占频率
    2. 数字信号里:带宽是传送数字信号速率

    单片机中波特率和比特率数值上相同(一个状态对应一个1或0)


    3.单片机串行口结构和工作原理

    51单片机的串行口:可编程、全双工。
    1. 可作为UART(Universal Asynchronous Receiver/Transmitter)
    2. 同步移位器
    3. 帧格式:8位、10位、11位
    4. 可设置波特率

    这里写图片描述

    SBUF:发送和接收的数据缓冲区
    SOCN:串行口控制寄存器 (98H)
    PCON:电源控制寄存器 (87H)
    TI:发送中断标志位 (方式0:发送结束硬件置1 发送前软件置0)
    RI:接收中断标志位 (方式0:发送结束硬件置1 发送前软件置0)
    TXD: P3.1引脚,发送数据口
    RXD: P3.0引脚,接收数据口

    发送和接收SBUF可同时发送接收(它们在物理上独立的)但是它们公用 SFR地址99H。
    发送时:data 写入SBUF ,经过TXD发出
    接收时:存储RXD接收到的数据


    (1)SCON 串行口控制寄存器(地址98h)

    SCON (98H)
    SM0
    SM1 SM2
    REN TB8
    RB8 TI
    RI
    方式选择
    多机通信控制
    串行接收允许 欲发的第九位
    欲收的第九位 发送中有无中断
    接收中有无中断
    有四种方式0、1、2、3
    方式2、3时候用
    0禁止、1允许 方式2、3中
    方式2、3中 软件清零 硬件置一
    软件清零 硬件置一

    (2)PCON 串行口控制寄存器(地址87h)

    PCON (78H)
    SMOD
    X X
    X GF1
    GF0 PD
    IDL
    波特率加倍位
    X X
    X 通用标志位 掉电方式位 待机方式位
    1加倍、0不加倍
    X X
    X 用户可作为软件使用标志 1激活掉电工作方式 1激活待机工作方式

    4.单片机串行口工作方式


    方式0:

    方式0 :移位寄存器IO方式
    TXD:移位数据IO
    RXD:移位时钟IO
    波特率 = fosc / 12
    8位 数据为一帧,不设置其实和停止位,从最低位开始发送
    发送过程:(1).写SBUF(2).8位数据发完,TI=1(3).发送下一数据
    接收过程:(1).REN=1(2).8位数据收完,RI=1(3).读SBUF
    功能:(1)短距离单片机之间数据传输(2)扩展输出接口 。。。

    方式1:

    方式1:波特率可变10位异步通信方式
    TXD:串行数据发送端
    RXD:串行数据接收端
    波特率 :
    baudrate=2SMOD32(T1)
    波特率 :
    baudrate=2SMOD32fosc12256X
    >> X为T1的计数初值 T1工作在方式2(这是计数器的工作方式哈)
    10位 数据为一帧,从最低位开始发送 起始位和停止位是自动插入的
    使用了T1计数器

    方式2:

    方式2:波特率固定11位异步通信方式
    TXD:串行数据发送端
    RXD:串行数据接收端
    波特率固定 :
    baudrate=2SMODfosc64
    11位 数据为一帧,从最低位开始发送
    起始位和停止位是自动插入的
    第九个数据是TB8、RB8(分别是发送和接收)位提供的

    方式3:

    方式3:波特率可变11位异步通信方式 (数据格式同方式2、波特率计算同方式1)
    TXD:串行数据发送端
    RXD:串行数据接收端
    波特率可变同方式1 :
    baudrate=2SMOD32fosc12256X
    >> X为T1的计数初值 T1工作在方式2(这是计数器的工作方式哈)
    11位 数据为一帧,从最低位开始发送
    起始位和停止位是自动插入的
    第九个数据是TB8、RB8(分别是发送和接收)位提供的

    5.单片机串行口编程

    编程要点:
    1. 波特率计算
    2. 控制字填写
    3. 两种工作方式选择(查询和中断)
    4. 两方波特率一致,可约定某一个标志字符作为发送数据的开始(多机通信中,标志字符就是各分机的地址)


    • 查询方式:
      发送程序:发数据— 查询TI — 发送下一个数据(先发后查)
      接收程序:查询RI—读数据—查询RI—读下一个数据(先查后收)
    • 中断方式:
      发送程序:发数据—等待中断 — 发送下一个数据
      接收程序:等待中断,在中断中再接收下一个数据

    两种方式中都要注意清TI、RI


    ORG 0000H
    AJMP MAIN
    ORG 0030H
    MAIN: 
        MOV TMOD,#20H ;TMOD设置  T1方式二
        MOV TH0 ,#3cH;
        TL0 = #0b0H;  ;初值
        MOV SCON,#40H  ;SCON设置 串行方式1
        MOV R0,#20h    ;发送的数据缓冲区起始地址
        MOV R7,#32     ;发送的数据个数
        SETB TR1      ;启动定时器,TRx = 1
        SETB EA     ;中断总开关
        SETB ET1    ;定时器0  允许中断
        LOOP:
        MOV SBUF,@R0;发送的数据放到缓冲区
        JNB TI,$    ;  TI==0 死循环
        CLR TI      ;软件清零
        INC R0      ;下一个数据
        DJNZ R7,LOOP;是否发完
    HERE:AJMP HERE
    END
    ORG 0000H
    AJMP MAIN
    ORG 0030H
    MAIN: 
        MOV TMOD,#20H ;TMOD设置  T1方式二
        MOV TH0 ,#3cH;
        TL0 = #0b0H;  ;初值
        MOV SCON,#50H  ;串行方式1   可接收REN
        MOV R0,#20h    ;发送的数据缓冲区起始地址
        MOV R7,#32     ;发送的数据个数
        SETB TR1      ;启动定时器,TRx = 1
        SETB EA     ;中断总开关
        SETB ET1    ;定时器0  允许中断
        LOOP:JNB RI,$    ;RI ==0 死循环 
        CLR RI      ;软件清零
        MOV @R0,SBUF;发送的数据放到缓冲区
    
        INC R0      ;下一个数据
        DJNZ R7,LOOP;是否发完
    HERE:AJMP HERE
    END

    如有错误!请多多包含,方便的话留个言!我好马上修改。

    展开全文
  • 单片机通过UART控制串口

    千次阅读 2018-11-01 22:30:14
    最近工程中需要使用瑞萨RX单片机控制迪文LCD串口屏显示。  首先需要使用迪文开发工具开发工程,定义好各类需要显示的变量大小及地址,并生成各类文件(字库、变量文件、图片等)通过usb转串口下载到LCD屏幕中。 ...
  • 单片机--串行口实验

    2019-11-30 16:10:40
    使用AT89S52单片机串行口通过RS232通信接口与PC机进行通信,让单片机把接收到的每一帧数据(即PC机发送给单片机的每一帧数据)直接再发送给PC机。(串行口波特率设定为9600Bit/s,使用方式1)注意:使用串口调试...
  • Linux下ARM 和单片机串口通信设计

    千次阅读 2013-09-27 10:43:19
    摘要:介绍Linux 环境下串口通信的设计方法和步骤,并介绍了ARM9 微处理器s3c2440 在Linux 下和C8051Fxxx 系列单片机进行串行通信的设计方法,给出了硬件连接和通信程序流程图。该方法可靠、实用,适用于大多数Linux...
  • Matlab与单片机串口通信-matlab…

    万次阅读 多人点赞 2016-12-29 09:54:10
    Matlab提供了对串口进行打开、 关闭、 以及串口参数设置等操作的一系列函数。利用这些函数可以选择串口号、 设置串口通信参数( 波特率、 数据位、 停止位、 校验位等)、进行中断控制、流控制。从建立串口通信到结束...
  • 51单片机串口通信 环形缓冲区队列(FIFO)

    千次阅读 多人点赞 2017-01-08 20:45:40
    51单片机串口通信 环形缓冲区队列最近在做毕业设计刚好涉及到51单片机,简单的研究一下发现51单片机串口只有一个字节的缓存,如果遇到单片机串口中断没有及时处理SBUF的值或者串口中断长时间未退出很容易照成数据...
  • C51单片机通过串口调节PWM波

    千次阅读 多人点赞 2019-05-05 16:53:42
    PWM 是一种常用的电子控制技术 PWM 本意为 脉冲宽度调制,可以简单理解为对占空比的控制。下图就是占空比图例,一个周期内高电平时间与周期时间的比值。...串口串口中断 下面看下程序: PWM.H #ifndef _PWM_...
  • 单片机程序,串口打印。要注意串口重定向的问题。 #include <stdio.h> //#pragma pack(4) //单片机程序,串口打印 void USART_SendString( char *str) { while (*str != '\0') { printf("%c", *str); ...
  • 本文只针对初学者。高手绕行,本程序目的实现串口把数值打印到电脑端。...* 项目名称 : STC15W4K 单片机串口打印调试 * M C U : STC15W4K * 编译环境 : KEIL4 * 文件名称 : Main.c * 其它说明 : 主函数 * 当前版本 :
  • 51单片机串口程序(带缓冲区)

    热门讨论 2020-07-30 23:32:56
    利用51单片机串口,编写了串口程序,并且编写了缓冲区处理程序。程序设计了60字节的缓冲区,自己也可以修改缓冲区的大小。
  • STC12C5A60S2单片机内有是有串口2的,正常烧录下载用的是串口1,因此,这个是根据官方程序加以修改,可以用的
  • 教你如何在51单片机上模拟串口通信!!! 转载:原文地址https://www.cnblogs.com/zhenghaoyu/p/10059848.html 我们可以不使用单片机本身带有的串口,而自己用程序去模拟一个串口并达到和本身的串口具有同样的功能...
  • c#与单片机串口通信 自己项目用的一个程序 用串口助手测试过没问题 用的serialport控件 需要注意的是用serialport时需要调用委托 里面有通信协议 可以直接更改通信协议拿来用
  • 这种情况下下,采集会需要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,但我们知道一般的51系列只提供一个串口,那么另一个串口只能靠程序模拟。本文所说的模拟串口, 就是利用51的两个输入输出引脚...
  • 单片机串口接收发送函数

    千次阅读 2016-01-03 11:12:14
    51单片机 串口接收字符串和发送字符串
  • pic单片机串口通讯

    2020-07-21 10:00:24
    pic单片机串口通用通讯C程序,稍加修改就可应用到的你的工程中
1 2 3 4 5 ... 20
收藏数 10,241
精华内容 4,096
关键字:

单片机更改串口