精华内容
下载资源
问答
  • 1利用单片机串口,实现两个实验台之间的串行通信。 2一个试验箱自发自收 郑旅军原创,谢绝抄袭,可以借鉴
  • 适用于AT89c51/52单片机串口通信例程,可根据实际需求更改发送的数据和发送波特率
  • 单片机 串口通信实验

    2020-08-11 07:13:58
    设计两个单片机通过串口方式1进行全双工数据通信,要求将波特率设置为2400,晶振频率为11.0592MHz,请分别编写发送程序和接收程序,接收端需使用液晶屏幕显示接收内容,发送端可循环发送一个字符串(自己定义一个...

    思考题:
    设计两个单片机通过串口方式1进行全双工数据通信,要求将波特率设置为2400,晶振频率为11.0592MHz,请分别编写发送程序和接收程序,接收端需使用液晶屏幕显示接收内容,发送端可循环发送一个字符串(自己定义一个字符串,例如“Welcome to Wuhan”)。

    (1)电路图如下:
    在这里插入图片描述
    (2)设计思路:

    1、电路:
    两个单片机都是用P0口连接LCD1602数据线的0~7位,P20连接寄存器选择位RS,P21连接读写选择位RW,P2^2连接使能位E。然后甲机的RXD连乙机的TXD,甲机的TXD连乙机的RXD。需要注意的是:P0口,P2作为I/O口输出的时候时输出低电平为0输出高电平为高组态(并非5V,相当于悬空状态)。也就是说不能真正的输出高电平,给所接的负载提供电流,因此必须接上拉电阻。

    2、程序:
    波特率2400,晶振频率为11.0592MHZ,T1工作在方式1,由公式X=256-(fosc/12)(2^SMOD/(322400)),可以算出初值TH1=TL1=244=0xf4。有关LCD1602的相关函数此处就略了!!

    2.1甲机发送数据程序说明:
    串口首先要初始化,选择方式1,REN允许接收位置1,即SCON=0x50;T1工作在方式2,即TMOD=0x20;波特率不加倍,即PCON=0x00;设置初值TH1=TL1=0xf4;启动T1,即TR1=1。
    然后串口发送数据,CPU将数据写入SBUF,即SBUF=dat;再搞一个陷阱while(!TI)来判断是否发完,下一步TI置0;
    调用LCD1602的单字符显示函数dis_char(address++,dat) (address刚开始为0x00)发送下一个数据时地址++,(发送完一个数据 就显示一个数据);显示完第一行 就显示第二行;显示完第二行 清屏后又显示第一行;发送完一帧数据 地址就归零 清屏 从头再来。
    注意这里清屏之前要延时一下 ,等前面发送的数据显示完了,再清屏!具体请看代码!!!

    2.2乙机接收数据程序说明:
    首先也是串口的初始化 ,跟楼上甲机是一样的!
    然后是串口接收数据,这里是通过串口中断来接收数据的(interrupt 4)。但是有个不足就是得事先知道发送数据的第一个字符;判断当SBUF==发送数据的第一个字符时,这就说明刚接收完一帧数据或者马上开始接收数据,那这时就将地址address置0并将屏幕清屏;然后读SBUF中的数据,调用LCD1602的单字符显示函数dis_char(address++,receive_char) ;再将RI软件置0。最后同发送的显示格式一样,显示完第一行 就显示第二行;显示完第二行 清屏后又显示第一行;接收完一帧数据 地址就归零 清屏 从头再来。

    (3)发送程序代码:

    /** 功能描述: 甲机发数据!”**/
    #include <reg52.h>
    #include <intrins.h>
    #define uchar unsigned char
    #define uint unsigned int
    #define lcd_out P0
    
    /***********端口定义********************************/
    sbit rs=P2^0;
    sbit rw=P2^1;
    sbit e=P2^2;
    /***********函数申明***********************************/
    void UART_Init(void);
    void UART_SendData(uchar dat);
    void UART_SendString(uchar *p);
    void delay(uint j);
    
    void check_busy(void);
    void write_command(uchar com);
    void write_data(uchar dat);
    void LCD_initial(void);
    void dis_char(uchar ad, uchar input);
    
    /***********变量定义********************************/
    uchar address=0x00;   //显示地址
    
    uchar sting[]="Welcome to Sichuan for hot pot!";
    void main(void)
    {
        LCD_initial();			     //LCD1602 初始化
      	UART_Init();                 //串口初始化 
    	while(1)
    	{
    		UART_SendString(sting);	   //发送字符串
            address=0x00;   //发送完数据 地址就归零 从头再来
    		delay(1000);
    		write_command(0x01);  //发送完一帧数据 清屏 	
        }
    }
    
    //串口初始化 
    void UART_Init(void)
    {
    	SCON=0x50;
        TMOD=0x20;
    	PCON=0x00;
        TH1 =0xf4;
    	TL1 =0xf4;  //预置初值,设波特率为2400
    	TR1 =1;	
     }
    
    //串口发送一个字节的数据 
    void UART_SendData(uchar dat)
    {
    	SBUF=dat;      //发送数据
    	while(!TI);  //判断是否发送完
    	TI=0;    //软件清0
    	delay(100);
    	dis_char(address++,dat);  //发送完一个数据 显示一个数据
    	if(address==0x10) address=0x40;//显示完第一行 就显示第二行
    	if(address==0x50){ 
           write_command(0x01);
    	   address=0x00;//显示完第二行  清屏后又显示第一行
    	 }
    }
    
    //串口发送多字节数据
    void UART_SendString(uchar *p)
    {
      while(*p!='\0')
      {
       UART_SendData(*p);
       p++;
      }
    }
    
    //1ms延时程序
    void delay(uint j)
    {
    	uchar i=250;
    	for(;j>0;j--)
    	{
    		while(--i);
    		i=249;
    		while(--i);
    		i=250;
    	}
    }
    //查忙程序
    void check_busy(void)
    {
    	uchar dt;
    	do
    	{
    		dt=0xff;
    		e=0;
    		rs=0;	
    		rw=1;
    		e=1;
    		dt=lcd_out;
    	}while(dt&0x80);
    	e=0;
    }	
    //写控制指令
    void write_command(uchar com)
    {
    	check_busy();
    	e=0;
    	rs=0;
    	rw=0;
    	lcd_out=com;
    	e=1;
    	_nop_();
    	e=0;
    	delay(1);
    }
    //写数据指令
    void write_data(uchar dat)
    {
    	check_busy();
    	e=0;
    	rs=1;
    	rw=0;
    	lcd_out=dat;
    	e=1;
    	_nop_();
    	e=0;
    	delay(1);	
    }
    //液晶屏初始化
    void LCD_initial(void)
    {
    	write_command(0x38);//8位总线,双行显示,5X7的点阵字符
    	write_command(0x0C);//开整体显示,光标关,无黑块
    	write_command(0x06);//光标右移
    	write_command(0x01);//清屏
    	delay(1);
    }
    
    // 输出字符
    
    void dis_char(uchar ad, uchar input)
    
    {
    	write_command(ad+0x80);//ad是显示位置信息
       
    	write_data(input);
    
    	delay(10);
    
    }
    	
    

    (4)接受程序代码:

    /** 功能描述: 乙机收数据!”**/
    #include <reg52.h>
    #include <intrins.h>
    #define uchar unsigned char
    #define uint unsigned int
    #define lcd_out P0
    
    /***********端口定义********************************/
    sbit rs=P2^0;
    sbit rw=P2^1;
    sbit e=P2^2;
    /***********函数申明***********************************/
    void UART_Init(void);
    void delay(uint j);
    
    void check_busy(void);
    void write_command(uchar com);
    void write_data(uchar dat);
    void LCD_initial(void);
    void dis_char(uchar ad, uchar input);
    
    /***********变量定义********************************/
    uchar address=0x00;   //显示地址
    uchar receive_char;   //接收的数据
    
    void main(void)
    {
        LCD_initial();			     //LCD1602 初始化
      	UART_Init();                 //串口初始化
        ES=1;//打开串口中断开关
        EA=1;//打开中断总开关
    	while(1)
    	{
         if(address==0x10) address=0x40; //显示完第一行 就显示第二行
    	 if(address==0x50){ 
           write_command(0x01);
    	   address=0x00;//显示完第二行  清屏后又显示第一行
    	 }
        }
    }
    //利用串口中断来接收数据 并用LCD显示信息
     void inter (void) interrupt 4
      {
        if(SBUF=='W'){    //不足就是 得事先知道发送数据的第一个字符
         write_command(0x01);//接收完一帧就清屏 
    	 address=0x00;  //地址也归零 从头再来
    	 }
         receive_char=SBUF;
         dis_char(address++, receive_char);//接收一个数据显示一个数据
         RI=0;      //软件清0
      }
    
    
    //串口初始化 
    void UART_Init(void)
    {
    	SCON=0x50;
        TMOD=0x20;
    	PCON=0x00;
        TH1 =0xf4;
    	TL1 =0xf4;  //预置初值,设波特率为2400
    	TR1 =1;	
     }
    
    
    //1ms延时程序
    void delay(uint j)
    {
    	uchar i=250;
    	for(;j>0;j--)
    	{
    		while(--i);
    		i=249;
    		while(--i);
    		i=250;
    	}
    }
    //查忙程序
    void check_busy(void)
    {
    	uchar dt;
    	do
    	{
    		dt=0xff;
    		e=0;
    		rs=0;	
    		rw=1;
    		e=1;
    		dt=lcd_out;
    	}while(dt&0x80);
    	e=0;
    }	
    //写控制指令
    void write_command(uchar com)
    {
    	check_busy();
    	e=0;
    	rs=0;
    	rw=0;
    	lcd_out=com;
    	e=1;
    	_nop_();
    	e=0;
    	delay(1);
    }
    //写数据指令
    void write_data(uchar dat)
    {
    	check_busy();
    	e=0;
    	rs=1;
    	rw=0;
    	lcd_out=dat;
    	e=1;
    	_nop_();
    	e=0;
    	delay(1);	
    }
    //液晶屏初始化
    void LCD_initial(void)
    {
    	write_command(0x38);//8位总线,双行显示,5X7的点阵字符
    	write_command(0x0C);//开整体显示,光标关,无黑块
    	write_command(0x06);//光标右移
    	write_command(0x01);//清屏
    	delay(1);
    }
    
    // 输出字符
    
    void dis_char(uchar ad, uchar input)
    
    {
    	write_command(ad+0x80);//ad是显示位置信息
    
    	write_data(input);
    
    	delay(10);
    
    }
    	
    
    展开全文
  • 单片机串口通信实验 一、实验目的 二、实验内容 三、实验步骤 四、C代码如下 五、实验结果 六、实验体会 一、实验目的 1、 掌握单片机串口通信的设计方法; 2、 了解双单片机通信的原理。 二、实验内容...
    展开全文
  • 数码管显示及双单片机串口通信实验实验项目名称:数码管显示及双单片机串口通信实验实验室(中心): 电 子 实 验 室实验完成时间: 09 年10 月 30 日一.实验目的与要求1、通过实验掌握数码管,显示数据的方法;熟悉...

    数码管显示及双单片机串口通信实验

    实验项目名称:数码管显示及双单片机串口通信实验

    实验室(中心): 电 子 实 验 室

    实验完成时间: 09 年10 月 30 日

    一.实验目的与要求

    1、通过实验掌握数码管,显示数据的方法;熟悉有关元器件的使用方法。

    2、掌握单片机串口通信的设计方法,了解双单片机通信的原理。

    二.实验原理及实验线路

    1、图中,74LS47 是七段译码器。它是将BCD 码翻译成七段驱动码,驱动数码管显示数据,

    数码管为共阴普亮数码管,型号为LTS547R,BCD码由P0口的低四位输出,P2 口作为位选口,

    P2.0 对应左(右)边那块是首显示块,P2.3 对应右(左)边的那块是末显示块。工作时,先送

    BCD 码,再选位,使选中的数码管点亮,往复循环。

    2、已知8051的串行口采用方式1进行通信,晶振频率为11.0592MHz,选用定时器T1作为波特

    率发生器,T1工作于方式2,要求通信的波特率为9600,计算T1的初值。

    设SMOD=0,根据式定时方式:X=M-要求的定时值/(12/fosc),计算T1的初值如下:

    X=28-11.0592*106/9600*32*12=253=FDH

    选用11.0592MHZ晶振的目的就是为了使计算得到的初值为整数,选用定时器T1工作于方

    式2作为波特率发生器,只需要在初始化编程的时候,将计算得到的初值写入TH1和TL1,当

    T1溢出时会自动重新装入初值,从而产生精确的波特率真。如果将T1工作于方式0或方式1,

    则当T1溢出时需要由中断服务程序重装初值,这时中断响应时间和中断服务程序指令的执行

    时间将导致波特率产生一定的误差。因此采用T1作为串行口的波特率真发生器时,通常都将

    T1设置为工作方式2。

    三.实验内容

    1、①左循环显示“1”,“2”,“3”,“4”。

    ②右循环显示“1”,“2”,“3”,“4”。

    ③先四个显示块显示1,2,3,4,1 秒后四个显示块同时显示5,6,7,8。

    2、用串口传送0~F十六个数据。并用C代码编程。

    四、实验电路图

    1、数码管显示实验电路图

    2、双单片机串口通信实验电路图

    五、实验C语言程序

    1、数码管显示代码

    #include

    #include

    #include

    sbit P24=P2^4;

    sbit P25=P2^5;

    sbit P26=P2^6;

    sbit P27=P2^7;

    unsigned char table[10]={0x3f,0x06,0x5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};

    unsigned char count;

    void delay(unsigned i)

    {

    unsigned char a,b,c;

    for(;i>0;i--)

    for(c=167;c>0;c--)

    for(b=171;b>0;b--)

    for(a=16;a>0;a--);

    _nop_;

    }

    void delay0()

    {

    int i,j;

    for(i=10;i>0;i--)

    for(j=110;j>0;j--)

    _nop_;

    }

    void main(void)

    {

    while(1)

    {

    P2=0XFF;

    P0=table[1];

    P24=0;

    delay(1);

    P2=0XFF;

    P0=table[2];

    P25=0;

    delay(1);

    P2=0XFF;

    P0=table[3];

    P26=0;

    delay(1);

    P2=0XFF;

    P0=table[4];

    P27=0;

    delay(1);

    //--------------------------

    P2=0XFF;

    P0=table[1];

    P27=0;

    delay(1);

    P2=0XFF;

    P0=table[2];

    P26=0;

    delay(1);

    P2=0XFF;

    P0=table[3];

    P25=0;

    delay(1);

    P2=0XFF;

    P0=table[4];

    P24=0;

    delay(1);

    //---------------------

    count=50;

    while(count--)

    {

    P2=0XFF;

    P0=table[1];

    P24=0;

    delay0();

    P2=0XFF;

    P0=table[2];

    P25=0;

    delay0();

    P2=0XFF;

    P0=table[3];

    P26=0

    展开全文
  • 单片机串口通信实验

    2021-05-07 14:52:57
    0x1 实验要求 (1)每隔1秒钟,A向B通过串口发送一个字节c_num(该字节按照0x00-0x09循环,例如某一时刻发送c_num=0x-3); (2)B接收到数据后,做9-c_num的计算,并将计算结果通过串口发送给A单片机。例如B接收到0x...

    0x1 实验要求

    (1)每隔1秒钟,A向B通过串口发送一个字节c_num(该字节按照0x00-0x09循环,例如某一时刻发送c_num=0x-3);
    (2)B接收到数据后,做9-c_num的计算,并将计算结果通过串口发送给A单片机。例如B接收到0x03,则B要通过串口返回0x09-0x03=0x06给单片机A;
    (3)A接收到数据后,将收到数据写在数码管上,例如显示收到的数字6;
    (4)A和B的串口发送不要用中断方式,A的串口接收必须用中断方式,B的串口接收可用/不用串口中断。

    0x2 电路原理图

    在这里插入图片描述

    0x3 代码部分

    单片机A:

    #include<reg51.h>
    #define uchar unsigned char
    uchar RIflag=0;
    uchar RIreceive;
    char code map[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    void delay(unsigned int time)
    {
        unsigned int j=0;
        for(;time>0;time--)
            for(j=0;j<125;j++);
    }
    void main(void)
    {
        uchar counter=0;
        TMOD=0x20;
        TH1=TL1=0xf4;
        PCON=0;
        SCON=0x50;
        TR1=1;
        EA=1;
        ES=1;//打开中断
        while(1)
        {
            SBUF=counter;
            while(TI==0);
            TI=0;//数据发送完成,标志位清零
            if((RIflag==1)&&(RIreceive==counter))
            {
                P2=map[counter];
                if(++counter>9)counter=0;
                delay(500);
            }
        }
    }
    void zhongduan() interrupt 4
    {
        if(RI)
        {
            RI=0;
            RIflag=1;
            RIreceive=SBUF;
        }
    }
    

    单片机B:

    #include<reg51.h>
    #define uchar unsigned char
    char code map[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    void main(void)
    {
        uchar receive;
        TMOD=0x20;
        TH1=TL1=0xf4;
        PCON=0;
        SCON=0x50;
        TR1=1;
        while(1)
        {
            while(RI==1)
            {
                RI=0;
                receive=SBUF;
                SBUF=receive;
                while(TI==0);
                TI=0;
                P2=map[9-receive];
            }
        }
    }
    
    展开全文
  • PC机与单片机串口通信的VB源代码,包括VB界面程序和51单片机程序。
  • STC 51 单片机 串口通信实验

    千次阅读 2013-07-21 23:53:01
    以后不再好高骛远,要脚踏实地地做好每件事,要踏踏实实地学好单片机。  作为第一个博客,首先谈谈我... 串口通信的方式是查询方式,下面是我的源代码: /*====================================== 单片机型号:STC12
  • 博文51单片机汇编语言实验(四)----串行通信实验(附参考代码及注释)的附件,包含文章介绍的内容的完整的工程文件
  • STM32f4日记4之HMI智能串口屏与单片机串口通信实验(能通过按下串口屏图片来控制单片机上LED灯闪灭) 板子:stm32f407zgt6正点原子迷你版 串口屏:淘晶驰HMI电容触摸屏3.5寸 // 如果你觉得对你有帮助,请点赞同,这...
  •    本系列共6篇文章,本文作为本系列的第四篇文章,介绍实验四 :串行通信实验,本系列文章基于Dais-52PRO实验箱。 一、实验目的:    学习串行口的工作方式,掌握单片机通信程序编制方法。 二、实验设备:   ...
  • 单片机 串口编程之串口通信仿真实验

    万次阅读 多人点赞 2018-11-17 18:28:24
    单片机 串口编程之串口通信仿真实验 一、简述 记--简单的使能串口,串口收发数据的例子。(使用Proteus仿真+虚拟串口调试) 代码,仿真文件打包:链接: https://pan.baidu.com/s/1nyb46fTJrYcAy_VarFdO3A 提取...
  • 51 单片机串口通信程序,RS232串口通信 含详细例子。 含详细例子,RS232串口通信单片机接收发送数据的 C51程序,手把手教你用增强型51 实验板实现RS232 串口通信 51串口通信
  • FPGA和单片机串行通信接口的实现(源代码)
  • 51单片机学习 串行通信实验
  • 单片机实验 串行通信

    2018-12-24 11:19:21
    如图5-1所示,利用串口方式3,波特率19.2Kb/s,奇校验,全双工实现:甲机(上方的单片机)8个开关的所代表的数据能传送到乙机(下方的单片机)并在乙机的8个LED灯显示,同时乙机8个开关所代表的数据能传送到甲机并在...
  • 这一次的重点是讲解几个串口的实验来加深自己对串口通信的理解。 目录 实验一(将一个简单的字符串输出到单片机中):  实验一—–电路图:  实验一—–代码段:  实验一—–结果: 实验二(通过串口通信的方式...
  • 单片机双机通信实验报告计算机与信息工程学院综合性实验报告专业:物联网 年级/班级: 2015—2016学年第一学期课程名称单片机原理及应用指导教师学号姓名实验地点实验时间2015.11.14项目名称单片机双机通信实验类型...
  • 这是一个目录Linux与单片机串口通信运行ROS串口发送节点后异常中断栈溢出问题catkin_make报错:函数未定义的引用ERROR L107: ADDRESS SPACE OVERFLOW串口实验总结程序组织串口调试 Linux与单片机串口通信    近期...
  • 单片机串口通信基础

    2017-11-01 14:50:11
    单片机串口通信基础串口通信是非常总要的,首先我们先了解一下基础随着多微机系统的广泛应用和计算机网络技术的普及,计算机的通信功能越来越显的重要。计算机通信是指计算机与外部设备或者计算机与计算机制之间的...
  • 机组串口通信实验大作业
  • 单片机C51 - 串行通信原理及串口编程实验

    千次阅读 多人点赞 2016-09-07 10:42:00
    一、两种通信方式概念 1.并行通信 传输原理:并行通信时数据的各个位同时传送,以字节为单位并行传输优点:并行通信速度快,传输的数据宽度可以是1~128位...优点:串行通信传输线少,占用引脚资源少,成本低,适合远
  • stc51单片机串口通信程序

    万次阅读 多人点赞 2019-04-12 17:37:06
    51单片机串口通信,是全双工的,就是可以同时收/发的,互相不影响的。 串口是可以同时收/发的,虽然都是用SBUF,但却是两个独立的寄存器,互不影响,只是都叫一个名,SBUF。 但是,对于接收或发送,确实是接收到一...
  • 单片机与 PC 机串口通信实验

    千次阅读 多人点赞 2019-01-22 17:57:24
    51 单片机串行口是一个可编程的全双工的通信接口,具有 UART(通用异步收发器)的全部功能,能同时进行数据的发送和接收,也可以作为同步移位寄存器使用。51 单片机串行口主要有两个独立的串行数据缓冲寄存器 ...
  • 用于51单片机实现串口通信,可作为下位机程序设计,可以用于vc++ vb,matlab
  • 实验7.4:RS232串口应用实例 设计要求: 通过串口发送接收数据(串口工作方式1) 实现思路: 定时器设置 串口设置 工作方式 波特率 开启定时/计数器 串口执行 接收数据 发送...
  • 51单片机串口通信初始化

    千次阅读 2020-10-23 20:15:35
    51单片机串口通信 实验仿真图: 实验原理: 主机的P3,1(TXD)连接到从机的P3,0(RXD),利用开关对主机的P1口赋值,将P1的数据存到主机SBUF,在通过串口传动到从机的SBUF,从机将接收到的数据从机的P1口体现。 说明...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,480
精华内容 1,792
关键字:

单片机串行通信实验代码