单片机(AT89C51)的串行通信实验

单片机(AT89C51)的串行通信实验串口通信的重要性和基础就不用我多讲了吧 基础不懂直接点链接 https blog csdn net weixin article details 这一次的重点是讲解几个串口的实验来加深自己对串口通信的理解 实验一 将一个简单的字符串输出到单片机中 实验目的 实现输出 nihao 用 VIRTUALTERMI 显示出来

串口通信的重要性和基础就不用我多讲了吧?基础不懂直接点链接:https://blog.csdn.net/weixin_/article/details/

这一次的重点是讲解几个串口的实验来加深自己对串口通信的理解。

目录

实验一(将一个简单的字符串输出到单片机中):

 实验一—–电路图:

 实验一—–代码段:

 实验一—–结果:

实验二(通过串口通信的方式实现开关控制灯的亮灭) 

 实验二—–电路图

 实验二—–代码块

发送机: 

接收机:

实验二—–结果


 

实验一(将一个简单的字符串输出到单片机中):

 实验目的:

  1. 实现输出“3 YEYUEHNG   ”
  2. 用VIRTUAL TERMINAL显示出来

 实验一—–电路图:

单片机(AT89C51)的串行通信实验

   实验图比较的简单明了,主要要注意的就是单片机的晶振要设置为11.0592MHz,不然不会出现预想的结果,如下图设置:

  单片机(AT89C51)的串行通信实验

 实验一—–代码段:

#include<reg51.h> unsigned char code str[]="3 YEYUEHNG "; //定义一个发送的数据 //函数的功能是:向PC端发送一个字节数据 void send(unsigned char dat) { SBUF=dat; //发送数据 while(TI==0); //检查发送完成中断标志,发送完成为1,未完成为0 TI=0; //复位发送标志位 } void delay(unsigned int n) //设置延时函数 { unsigned int i,j; for(i=0;i<n;i++) for(j=249;j>0;j--) ; } void main(void) { unsigned int i; TMOD=0x20; //TMOD=0010 0000,设置定时器T1工作于方式二 SCON=0x60; //SCON=0100 0000,设置串口的工作方式为方式1 PCON=0x00; //PCON=0000 0000,波特率为9600 晶振为11.0592 TH1=0xfd; //设置定时器T1的初值 TL1=0xfd; //定时器T1自动填充的值 TR1=1; //启动定时器T1 while(1) { i=0; while(str[i]!='\0') //循环发送字节数组中的数据 { send(str[i]); i++; delay(1); } delay(1000); } }

 实验一—–结果:

单片机(AT89C51)的串行通信实验如果实验中得到的是你所设置的字符串的话就是实验成功了

实验一比较的简单,我们可以通过实验一思考可不可以通过开关来控制灯的亮灭(实验二)

实验二比较的贴合实际中用到的情况相比之下实验二肯定会比较的有难度,不过有了实验一的基础也就可以顺藤摸瓜的得出实验的代码了。

实验二(通过串口通信的方式实现开关控制灯的亮灭) 

实验的目的和要求

实验的目的中只提到了两个灯的操作,其实八个灯也就没什么问题了,可以以此类推的实现多灯的控制。

 实验二—–电路图

 单片机(AT89C51)的串行通信实验

注:需要设置两个单片机的晶振为11.0592MHz   

led灯旁边的电阻值不要太大,不然led无法点亮

 实验二—–代码块

实验涉及两个单片机所以需要两个代码块,分别为接收机和发送机的。

发送机: 

#include<reg51.h> unsigned char code str1[]=""; //设置需要发送的协议代码 unsigned char code str2[]=""; unsigned char code str3[]=""; sbit P1_0=P1^0; //给相应端口一个编号 sbit P1_1=P1^1; sbit P1_2=P1^2; //函数的功能是:向PC端发送一个字节数据 void send(unsigned char dat) { SBUF=dat; while(TI==0); TI=0; } void delay(unsigned int n) //延时函数的设置 { unsigned int i,j; for(i=0;i<n;i++) for(j=249;j>0;j--) ; } void main(void) { unsigned int i; TMOD=0x20; //TMOD=0010 0000,设置定时器T1工作于方式二 SCON=0x60; //SCON=0100 0000,设置串口的工作方式为方式1 PCON=0x00; //PCON=0000 0000,波特率为9600 晶振为11.0592 TH1=0xfd; //设置定时器T1的初值 TL1=0xfd; //定时器T1自动填充的值 TR1=1; //启动定时器T1 while(1) { if(P1_0==0) //判断P1_0口的开关状态 { i=0; while(str1[i]!='\0') //循环发送相应数组中的数据 { send(str1[i]); i++; delay(1); } send('\0'); //最后一位补上\0作为接收机判断结束的标准 delay(1000); } else if(P1_1==0) //判断P1_1口的开关状态 { i=0; while(str2[i]!='\0') //循环发送相应数组中的数据 { send(str2[i]); i++; delay(1); } send('\0'); //最后一位补上\0作为接收机判断结束的标准 delay(1000); } else if(P1_2==0) //判断P1_2口的开关状态 { i=0; while(str3[i]!='\0') //循环发送相应数组中的数据 { send(str3[i]); i++; delay(1); } send('\0'); //最后一位补上\0作为接收机判断结束的标准 delay(1000); } } }

接收机:

#include<reg51.h> #define uchar unsigned char uchar temp,flag; uchar a[10]; uchar count=0; void main() { TMOD=0x20; //定时器T1工作于方式2 SCON=0x40; //SCON=0100 0000B,串口工作方式1 PCON=0x00; //PCON=0000 0000B,波特率9600 TH1=0xfd; //根据规定给定时器T1赋初值 TL1=0xfd; //根据规定给定时器T1赋初值 TR1=1; //启动定时器T1 REN=1; //允许接收 EA=1; //开起总中断开关 ES=1; //需要用到串行口的中断所以ES=1就是把串行口的中断打开了 while(1) //进入循环 { if(flag==1) //等待中断的来临,然后flag就会被赋值为1 { if(a[7]==0x31) //如果发送的数据最后一位为1的话(“”最后一位1 P1=0xFE; //对应的就是十六进制的0x31) 0xfe对应1111 1110 就第 //一盏灯亮 else if(a[7]==0x32) //以此类推 P1=0xFD; else if(a[7]==0x33) //以此类推 P1=0xFC; else P1=0x00; //发送为其他数据时灯全亮 flag=0; } } } void serial() interrupt 4 //设置中断函数 { temp=SBUF; //当有中断时把传过来的数据暂存到temp中 RI=0; //把设置中断的标志初始化,等待下一中断 if(temp==0x00) //当到达最后一位 { a[count]=temp; count=0; //计数器初始化为下一次中断准备 flag=1; //标志置1进入主函数,进行端口的赋值 } else { a[count]=temp; count=count+1; } }

实验二—–结果

单片机(AT89C51)的串行通信实验

单片机(AT89C51)的串行通信实验

单片机(AT89C51)的串行通信实验

有错请指出,不胜感激!!!! 

                                            单片机(AT89C51)的串行通信实验

No pains No results 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233659.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PHP使用swoole实现多线程爬虫[通俗易懂]

    PHP使用swoole实现多线程爬虫

    2022年2月12日
    37
  • JAVA事件适配器的作用

    JAVA事件适配器的作用适配器 其实从接口事件演变尔来的。相当于触发器,说简单点,它就是一些动作。例如说鼠标的按下点击还有键盘等等。适配器就是实现接口事件的类不过,不是真的实现,只是空实现,没有具体的方法体。适配器主要是为了方便程序员操作,避免了代码的重复性。只要一个对象或者属性添加了这个适配器,那么它就会监视这对象或属性。例如说一个按纽。按纽添加一个MouseAdap

    2022年5月4日
    56
  • webstorm2021.11.2激活码【2021最新】

    (webstorm2021.11.2激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html9K2BT69C4S-eyJsa…

    2022年3月28日
    43
  • SpringMVC 处理器适配器详解[通俗易懂]

    SpringMVC 处理器适配器详解[通俗易懂]0x00:介绍处理器适配器HandlerAdapter:作用是根据映射器找到的处理器Handler信息,按照特定的规则去执行相关的处理器Handler。其配置方式有两种,一种是基于xml的资源配置,也就是非注解的配置方式。另外一种就是基于Annotation注解的配置。其注解在代码中做上特殊标记,这些标记就可以编译、类加载、运行时被读取,然后去执行相应的处理。0x01:…

    2022年6月8日
    65
  • java绝对值方法(java计算绝对值的方法)

    **文章摘要**1、绝对值函数,用来获取表达式的绝对值。2、绝对值函数,实现降序+升序输出。一、绝对值函数使用说明绝对值函数是JDK中Math.java中的实现方法,其用来得到表达式的绝对值。其实现非常简单,源码如下:/***Returnstheabsolutevalueofan{@codeint}value.*Iftheargumentisnotnegative…

    2022年4月18日
    910
  • stimulsoft mysql_【Stimulsoft Reports Java教程】在运行时使用MySQL数据库创建报表

    stimulsoft mysql_【Stimulsoft Reports Java教程】在运行时使用MySQL数据库创建报表此示例项目显示如何使用MySQL字段创建新报表并提取MySQL数据库信息。首先,您需要创建一个新报表并添加MySqlDatabase。在StiMySqlDatabase类的构造函数中,您应该设置数据库名称,别名和连接字符串。publicstaticStiReportcreateReport()throwsClassNotFoundException,SQLException,StiE…

    2022年7月13日
    22

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号