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


相关推荐

  • Java 序列化

    Java 序列化

    2021年10月7日
    45
  • plc的移位指令C语言实现,PLC中使用移位指令是如何实现移位动作的

    plc的移位指令C语言实现,PLC中使用移位指令是如何实现移位动作的plc移位指令怎么么用楼主的意思大约是用X2来检测有没有罐子,X1用来定位灌装位置,现在需要把检测罐子的X2位置,移动到灌装位置的前面,应该是提供图片的下面的那种应用吧,这种应用的思路其实主要是要记录下到灌装工位时是否有罐子,程序在图片里面,假设开机前X1和X2之间没有罐子开机后传送带运转当X1检测到应该有罐子的工位来到罐装工位时,首先将检测罐子有无的X2的状态放入M3中,有罐子M3为1,没罐子M…

    2022年5月1日
    64
  • mysql卸载步骤_系统应用怎么卸载步骤

    mysql卸载步骤_系统应用怎么卸载步骤重装卸载了一下午,很多方法都尝试了,最后终于找到一个彻底删干净的方法:1.很多大佬都提到的cmd搜索regedit注册表,打开后找到下面三个目录并删除(要是没有不用管)HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/Eventlog/Application/MySQLHKEY_LOCAL_MACHINE/SYSTEM/ControlSet002/Services/Eventlog/Application/MySQLHKEY_LOCAL_MACHIN

    2022年9月27日
    2
  • C++智能指针「建议收藏」

    C++智能指针「建议收藏」一、基础知识介绍二、不带引用计数的智能指针三、带引用计数的智能指针四、shared_ptr和weak_ptr五、多线程访问共享对象的线程安全问题六、自定义删除器

    2022年6月20日
    49
  • 【mySQL】mysql数据库分页查询讨论专题

    【mySQL】mysql数据库分页查询讨论专题MySQL:limit分页公式、总页数公式1)limit分页公式(1)limit分页公式:curPage是当前第几页;pageSize是一页多少条记录limit(curPage-1)*pageSize,pageSize(2)用的地方:sql语句中select*fromstudentlimit(curPage-1)*pageSize,pageSize;2)…

    2022年5月31日
    27
  • Nginx转发https

    Nginx转发httpsnginx

    2022年10月19日
    2

发表回复

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

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