当前位置: 首页 > news >正文

AT89C51单片机实现单片机串口互动(中断方式,单片机--单片机,应答)

51b4b684bd5544229bd1c0f48c63d2cb.png

 说一下功能:客户机发送0x01到服务机

2服务单片机应答0xf2到客户机

3客户机接收到0xf2,发送信息153432这6个数字到服务机

4client发送完信息后发送0xaa结束通信

5server接收到0xaa后回复0xaa结束通信,从此老死不相往来

看代码:

//发送端代码#include "reg51.h"
#include "myheader.h"
#define uchar unsigned char
long int sleep_i=0;
long int main_i=0;
int bufferc[6]={0};
uchar tag=0;
void test()
{P17=0;
}
void main()
{uchar sendx[6]={1,5,3,4,3,2};sleep(1000);TMOD=0x20;//采用初值自动重载的方式TH1=0XF4;//根据波特率计算公式这里需要设置为这么多才能够在串行数据传输模式1的状况下实现波特率2400B/STL1=0XF4;TR1=1;//启动定时器开始计时SCON=0X40;REN=1;EA=1;ES=1;SBUF=0x01; //发送01while(TI==0);
//	test();for(;;){if(tag==1)break;}if(tag==1){EA=0;for(main_i=0;main_i<6;main_i++){SBUF=sendx[main_i];while(TI==0);TI=0;}EA=1;tag=0;}SBUF=0XAA;while(1);
}void int_4() interrupt 4
{EA=0;if(SBUF==0X01) {;//while(RI==0);}else if(SBUF==0XF2)  {tag=1;}else if(SBUF==0Xaa){if(TI==1){;}else if(RI==1)  {REN=0;}}else{;}RI=0;TI=0;EA=1;
}void sleep(long int a)
{for(sleep_i=0;sleep_i<a;sleep_i++){;}
}

服务端代码:

#include "reg51.h"
#include "myheader.h"
#define uchar unsigned char
int szc[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int bufferc[6]={0};
int sza[6]={0x01,0x02,0x04,0x08,0x10,0x20};
int t=0;
int i=0;
void display()   //显示设备没有问题,因为可以忠实的显示出012345  如果是显示异常比如是数据出问题:bufferc[6]数据出了问题
{									//设备全部显示0,说明bufferc[6]没有被赋值  ,找到赋值bufferc语句uchar i=0;uchar num=0;for(i=0;i<6;i++)  //显示异常,只能显示一个数字P1角有问题{num=bufferc[i];  //bufferc【】数据异常,0位置:3  1位:4  2位:5  3位置:6    4位置:后面都是0 也就是说1,2都被另外那个东西给截住了P2=szc[num];P1=sza[i];sleep(1);P2=0xff;}
}void test()
{P17=0;
}void main()
{TMOD=0x20;TH1=0XF4;//根据波特率计算公式这里需要设置为这么多才能够在串行数据传输模式1的状况下实现波特率2400B/STL1=0XF4;TR1=1;SCON=0x40;//串口工作与方式1,定义了传送数据的格式EA=1;ES=1;   //串口中断开关打开REN=1;while(1){display();}
}void int_4() interrupt 4
{static uchar first=0;EA=0;t=SBUF;if(t==0x01&&first==0){first++;SBUF=0xF2;while(TI==0);TI=0;}else if(SBUF==0XF2){first++;}else if(SBUF==0Xaa){//需要判断是接收的0XAA,还是发送的0xaaif(RI==1)//接收的0xaa{SBUF=0XAA;while(TI==0);}else if(TI==1){REN=0;		}}else if(RI==1){bufferc[i]=SBUF;i++;}if(RI==1&&TI==0)RI=0;if(TI==1&&RI==0)TI=0;EA=1;
}void sleep(long int a)
{uchar i=0;for(i=0;i<a;i++){;}
}

 

 

http://www.lryc.cn/news/125979.html

相关文章:

  • 九耶丨阁瑞钛伦特-请说说你在工作中的PRD文档是如何撰写的?
  • Android免打包多渠道统计如何实现
  • Apipost CICD怎么配置?
  • utf-8和utf-8 mb4区别
  • 考研 408 | 【计算机网络】 应用层
  • 设计模式-单例
  • mysql截取最后一个字符之前的数据
  • Flutter 中,ListView 中需要放置 ListView 需要怎么处理才高效?
  • Appium Desktop安装
  • Open3D 最小二乘拟合平面(SVD分解法)
  • Pytorch源码搜索与分析
  • 运维监控学习笔记9
  • gulimall-缓存-缓存使用
  • 概述、搭建Redis服务器、部署LNP+Redis、创建Redis集群、连接集群、集群工作原理
  • redis数据类型与底层数据结构对应关系
  • SpringBoot请求响应
  • 功能上新|全新GPU性能优化方案
  • 试岗第一天问题
  • 2023-08-15力扣每日一题
  • Java单例模式详解(五种实现方式)
  • 【javaweb】学习日记Day1 - HTML CSS入门
  • 贴吧照片和酷狗音乐简单爬取
  • Databend 开源周报第 106 期
  • Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
  • IL汇编ldc指令学习
  • 【Redis基础篇】浅谈分布式系统(一)
  • CSS中的calc()函数有什么作用?
  • 由浅入深学习Tapable
  • YOLOv5白皮书-第Y6周:模型改进
  • word之插入尾注+快速回到刚才编辑的地方