zoukankan      html  css  js  c++  java
  • 51单片机 串口通信

    首先,了解一些基本概念。

    RS232电平:逻辑1(MARK)=-3V~-15V,逻辑0(SPACE)=+3~+15V

    TTL电平:+5V等价于逻辑“1”,0V等价于逻辑“0”

    TXD   :发送数据 Transmit Data,单片机的P31

    RXD   :接收数据 Receive Data,单片机的P30

    波特率  :单片机或计算机在串口通信时的速率,定义为每秒传输二进制代码的位数,单位bts

    UART  :通用异步收发器。51单片机的串行口是一个可编程全双工的通信接口,具有UART的全部功能,能同时进行数据的发送和接收,也可作为同           步移位寄存器使用。

    SBUF : 串行数据缓冲寄存器

    经常使用的都是通信方式1(10位数据的异步通信,波特率可变,定时器1),因此必须掌握~~~

    定时器1通常用方式2,当溢出后,单片机会自动为其装初值,方式1需要手动装初值

    附:常用波特率初值表




    /*		发送字符  @L2  2016/08/08     */
    #include<reg51.h>
    unsigned char word[19] = "Nice to meet you! ";
    void init();
    void Delay10ms(unsigned int c);
    
    void main()
    {
    	unsigned char i;
    	init();
    	while(1)
    	{
    		for(i=0; i<19; i++)
    		{
    			SBUF = word[i];   //将要发送的数据放入到发送寄存器
    			while(!TI);		  //等待发送数据完成:当串行发送第8位数据结束时,内部硬件置1。
    			TI=0;			  //清除发送完成标志位:软件清零
    		}
    		Delay10ms(50);		  //延时一下再发
    	}
    }
    
    void init()				  // 设置串口
    {
    	SCON=0X50;			//设置为工作方式1   SMO SM1 SM2 REN=0 1 0 1  
    	TMOD=0X20;			//设置定时器1工作方式2
    	PCON=0X80;			//波特率加倍	SMOD=1
    	TH1=0XE6;		    //计数器初始值设置,此处波特率是2400
    	TL1=0XE6;
    //	ES=1;						//打开接收中断
    //	EA=1;						//打开总中断
    	TR1=1;					    //打开计数器
    }
    
    
    void Delay10ms(unsigned int c)   //误差 0us
    {
        unsigned char a, b;
        for (;c>0;c--)
    	{
    		for (b=38;b>0;b--)
    		{
    			for (a=130;a>0;a--);
    		}          
    	}       
    }


    /**			将接收到发送回电脑上面。@L2  2016/08/08 		**/
    
    #include<reg51.h>
    
    void init()			  // 设置串口
    {
    	SCON=0X50;			//设置为工作方式1
    	TMOD=0X20;			//设置计数器工作方式2
    	PCON=0X80;			//波特率加倍
    	TH1=0XF3;		    //计数器初始值设置,注意波特率是4800的
    	TL1=0XF3;
    	ES=1;						//打开接收中断
    	EA=1;						//打开总中断
    	TR1=1;					    //打开计数器
    }
    
    void Usart() interrupt 4	 // 串行口中断,串行端口完成一帧字符发送/接收后引起
    {
    	unsigned char receiveData;
    
    	receiveData=SBUF; //出去接收到的数据
    	RI = 0;           //清除接收中断标志位
    	SBUF=receiveData; //将接收到的数据放入到发送寄存器
    	while(!TI);		  //等待发送数据完成
    	TI=0;			  //清除发送完成标志位
    }
    
    void main()
    {
    	init();
    	while(1)
    	{
    	}
    }
    
    
    
    



  • 相关阅读:
    [JSOI2012][bzoj4332] 分零食 [FFT]
    [MUTC2013][bzoj3513] idiots [FFT]
    [bzoj4259][bzoj4503] 残缺的字符串 [FFT]
    [bzoj3160] 万径人踪灭 [FFT+manacher]
    [AHOI2017/HNOI2017][bzoj4827] 礼物 [FFT]
    [ZJOI2014][bzoj3527]力 [FFT]
    [CQOI2012][bzoj2668] 交换棋子 [费用流]
    [CQOI2014][bzoj3504] 危桥 [最大流]
    [ZJOI2011][bzoj2229] 最小割 [最小割树]
    移动游戏ui设计(一)
  • 原文地址:https://www.cnblogs.com/l20902/p/10610972.html
Copyright © 2011-2022 走看看