单片机(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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 手机怎么识别图片上的文字「建议收藏」

    手机怎么识别图片上的文字「建议收藏」 识别提取文字的方法有很多,大家平时也都会使用到自己的方法,但是你所使用到的方法是不是简单而且识别效果很不错呢?其实手机里有很多的识别转换工具,但是很多的识别效果都不如人意,小编最近发现的一个简单有效的方法,一起来看看吧。1.首先在应用市场里找到如下的拍照识别文字工具,然后将其运行。2.在主页点击右下角的蓝色加号按钮然后会出现两个蓝色的小图标,分别是相册和相机,在此选择相机。…

    2022年6月12日
    38
  • docker 现实—联网多台物理主机,容器桥到物理网络(三)

    docker 现实—联网多台物理主机,容器桥到物理网络(三)

    2022年1月4日
    78
  • pycharm svn设置_新手配置交换机详细教程

    pycharm svn设置_新手配置交换机详细教程1.打开pycharm设置配置svn.exe的地址Seting-versioncontrol-subversion按照红色填入svn.exe的路径2.在配置的时候找不到svn.exe的方法原因是在默认安装svn的时候忽略了安装svn.exe2.1在卸载或更改程序中重新安装一下svn2.2按照图片进行操作完成后需要重新打开pycharm设置,就可以找到svn.exe3.配置自动化脚本svn的地址导出的时候可以选择放置的位置如D盘4.注意事项pycharm的使用和本地使用没有太

    2022年8月25日
    6
  • bug生命周期流程_bug六大要素

    bug生命周期流程_bug六大要素你们公司是如何管理bug的?考查点:缺陷的生命周期常见的流程就不多说了,CSDN上有很多,今天说一些不一样的点:正常流程:打开–接受–已解决-关闭其它状态:拒绝、重新打开、遗留1、线上的bug优先级最高,会要求测试leader亲自协助运营、开发人员定位,邮件报告相关领导:bug分析、开发人员如何修改,有哪些影响范围,bug修改进度,开发和测试的改进措施;2、测试环境的典型b…

    2022年10月20日
    4
  • hashmap扩容过程保证可用_HashMap扩容

    hashmap扩容过程保证可用_HashMap扩容前言JDK1.8对HashMap进行的较大的改动,其中对HashMap的扩容机制进行了优化。在JDK1.8前,在多线程的情况下,使用HashMap进行put操作会造成死循环。这是因为多次put操作会引发HashMap的扩容机制,HashMap的扩容机制采用头插法的方式移动元素,这样会造成链表闭环,形成死循环。JDK1.8中HashMap使用高低位来平移元素,这样保证效率的同时避免了多线程情…

    2022年9月21日
    2
  • 微信公众号网页授权登录[通俗易懂]

    微信公众号网页授权登录[通俗易懂]微信公众号网页授权登录:前端时间做了一个微信公众号的项目,就是微信公众号的菜单点击我的个人中心,就向用户授权登录获取用户的信息,进行业务逻辑的操作,微信公众号官方文档,这是我写的文章,里面有很多微信的官方文档,希望对大家有用:https://blog.csdn.net/qq_41971087/article/details/82466647在微信公众号官方文档中,看到微信页面开发,…

    2022年6月5日
    37

发表回复

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

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