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)
    	{
    	}
    }
    
    
    
    



  • 相关阅读:
    383. Ransom Note
    598. Range Addition II
    453. Minimum Moves to Equal Array Elements
    492. Construct the Rectangle
    171. Excel Sheet Column Number
    697. Degree of an Array
    665. Nondecreasing Array
    视频网站使用H265编码能提高视频清晰度吗?
    现阶段的语音视频通话SDK需要解决哪些问题?
    企业远程高清会议平台视频会议系统在手机端使用的必备要求有哪些?
  • 原文地址:https://www.cnblogs.com/l20902/p/10610972.html
Copyright © 2011-2022 走看看