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


相关推荐

  • grep命令的使用

    grep是UNIX和LINUX中使用最广泛的命令之一。grep允许对文本文件进行模式查找。如果找到匹配模式,grep打印包含模式的所有行。grep支持基本正则表达式,也支持其扩展集。grep有三种变

    2021年12月24日
    43
  • echarts+vue_vue安装echarts

    echarts+vue_vue安装echarts1.安装cnpminstallecharts-wordcloud2.创建模板组件WordCloudChart<template><div:id=”id”:style=”{height:height,width:width}”/></template><script>importechartsfrom”echarts/lib/echarts”;importresizefrom”@/m

    2022年10月9日
    0
  • Cadence 电源完整性仿真实践(一)

    Cadence 电源完整性仿真实践(一)

    2021年11月29日
    58
  • Java中super()的使用[通俗易懂]

    Java中super()的使用[通俗易懂]目录1.super()的使用实例一一一子类重写父类的方法2.super()的使用实例一一一子类重写父类的变量3.super()的使用实例一一一在子类的构造方法中4.关于构造方法中super()第一种情况:编译不通过第二种情况:编译不通过第三种情况:成功编译通过1.super()的使用实例一一一子类重写父类的方法publicclassA{…

    2022年6月11日
    28
  • CentOS7网络配置-静态IP设置

    CentOS7网络配置-静态IP设置安装完VM后,需要进行网络配置。第一个目标为可以进行SSH连接,可以从本机到VM进行文件传送。故,VM中centos需要可以独立访问外网!【1】修改网络配置文件安装完CentOS7时,网络是通的。此时网络配置如下:网络配置文件路径:/etc/sysconfig/network-scripts/ifcfg-enp0s3其中“enp03”是你的网卡名称。TYPE="Ethernet"PROXY_ME

    2022年6月9日
    35
  • 基于Kubernetes集群的Jenkins CI/CD版本上线流程部署

    基于Kubernetes集群的Jenkins CI/CD版本上线流程部署基于kubernetes平台的CICD持续集成文章目录基于kubernetes平台的CICD持续集成1.基于k8s集群的Jenkins持续集成2.将Jenkins部署在k8s集群2.1.编写Jenkinsnamespace文件2.2.编写Jenkinsrbac授权文件2.3.编写Jenkinsstatefulset资源文件2.4.编写JenkinsStorageClass资源文件2.5.编写Jenkinssvc资源文件2.6.准备Jenkins镜像并推送至harbor2.7.创建所有资源并查看资

    2022年6月2日
    36

发表回复

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

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