【51单片机】【protues仿真】基于51单片机主从串行通信系统

目录

一、主要功能

二、使用步骤

三、硬件资源

四、软件设计

五、实验现象

一、主要功能

1、LCD1602液晶显示

2、矩阵按键​,独立按键设置采集模式

3、主机显示从机采集的电压数据

4、从机采集电压数据传送到主机

5、可以设置采集显示的时间0.5s或1s

二、使用步骤

基于51单片机的主从串行通信系统通常采用主从式多机通信架构,主机通过串口控制多个从机,实现数据交互与设备协同。

三、硬件资源

1、51单片机核心模块

2、按键模块

3、数模转换模块

4、LCD1602显示模块

四、软件设计

#include<reg51.h>

#include <INTRINS.H>

#include"lcd.h"

#define GPIO_KEY P1

char KeyValue;

sbit key_1 = P2^0;

sbit key_2 = P2^1;

unsigned char receiveData=0;

unsigned int V_A = 0;

unsigned int V_B = 0;

unsigned char rec6;

char r = 0;

int count = 0;

bit start = 0;

int time = 10; //默认1s时间

void delay10ms(unsigned char d) //误差 0us

{

unsigned char a, b,c;

for (c=d;c>0;c--)

{

for (b=38;b>0;b--)

{

for (a=130;a>0;a--);

}

}

}

void display(void)

{

if(start)

{

if(count<10)

{

LcdWriteCom(0x80); //清屏

LcdWriteData('A');

LcdWriteData('-');

LcdWriteData('0'+V_A/100);

LcdWriteData('.');

LcdWriteData('0'+(V_A%100)/10);

LcdWriteData('0'+V_A%10);

LcdWriteData('V');

LcdWriteCom(0xc0);

LcdWriteData('B');

LcdWriteData('-');

LcdWriteData('0'+V_B/100);

LcdWriteData('.');

LcdWriteData('0'+(V_B%100)/10);

LcdWriteData('0'+V_B%10);

LcdWriteData('V');

}

else

{

LcdWriteCom(0x80);

LcdWriteData(' ');

LcdWriteData(' ');

LcdWriteData(' ');

LcdWriteData(' ');

LcdWriteData(' ');

LcdWriteData(' ');

LcdWriteData(' ');

LcdWriteData(' ');

LcdWriteCom(0xc0);

LcdWriteData(' ');

LcdWriteData(' ');

LcdWriteData(' ');

LcdWriteData(' ');

LcdWriteData(' ');

LcdWriteData(' ');

LcdWriteData(' ');

LcdWriteData(' ');

}

LcdWriteCom(0x8b);

LcdWriteData('S');

LcdWriteData('T');

LcdWriteData('A');

LcdWriteData('R');

LcdWriteData('T');

}

else

{

LcdWriteCom(0x80);

LcdWriteData('A');

LcdWriteData('-');

LcdWriteData('0'+V_A/100);

LcdWriteData('.');

LcdWriteData('0'+(V_A%100)/10);

LcdWriteData('0'+V_A%10);

LcdWriteData('V');

LcdWriteCom(0xc0);

LcdWriteData('B');

LcdWriteData('-');

LcdWriteData('0'+V_B/100);

LcdWriteData('.');

LcdWriteData('0'+(V_B%100)/10);

LcdWriteData('0'+V_B%10);

LcdWriteData('V');

LcdWriteCom(0x8b);

LcdWriteData('S');

LcdWriteData('T');

LcdWriteData('O');

LcdWriteData('P');

LcdWriteData(' ');

}

}

void main(void)

{

LcdInit();

UsartConfiguration();

LcdWriteCom(0xcb);

LcdWriteData('1');

LcdWriteData('.');

LcdWriteData('0');

LcdWriteData('S');

while(1)

{

KeyValue = 99;

KeyDown();

if(KeyValue==14)

{

time = time - 5; //

}

if(KeyValue==15)

{

time = time + 5;

}

if(time<5)

time = 5;

else if(time>990)

time = 990;

LcdWriteCom(0xca);

LcdWriteData('0'+time/100);

LcdWriteData('0'+time%100/10);

LcdWriteData('.');

LcdWriteData('0'+time%10);

LcdWriteData('S');

if(start==0)

{

if(KeyValue==1)

senddata(1);

else if(KeyValue==2)

senddata(2);

}

else

{

if(count>time*2)

{

senddata(1);

delay10ms(10);

if(rec0==1)

{

V_A = rec1*2;

}

else if(rec0==2)

{

V_B = rec1*2;

}

senddata(2);

delay10ms(10);

if(rec0==1)

{

V_A = rec1*2;

}

else if(rec0==2)

{

V_B = rec1*2;

}

count = 0;

}

}

if(rec0==1)

{

V_A = rec1*2;

}

else if(rec0==2)

{

V_B = rec1*2;

}

if(key_1==0)

{

while(key_1==0);

start = 0;

//senddata(1);

}

if(key_2==0)

{

while(key_2==0);

start = 1;

}

display();

delay10ms(10);

}

}

void delay1s(void) interrupt 1

{

TH0 = (65536-45000)/256;

TL0 = (65536-45000)%256;

count++;

}

五、实验现象

演示视频:

相关推荐
Zwawa3 分钟前
把 AO 接回来:黑线和白底之间到底差了多少
c语言·单片机·嵌入式
北京盛世宏博大卤蛋14 分钟前
多机房分布式采集实战:网口温湿度传感器网段划分与网关解耦要点
物联网
C++ 老炮儿的技术栈17 分钟前
char (*csConnectName)[256]; 和 char csConnectName [256] 有什么区别
java·c语言·开发语言·c++·人工智能·算法·c
Yiran_G23 分钟前
BLE终端数据积压如何处理?缓存队列、断连补传与流量调度设计
嵌入式硬件·物联网
做萤石二次开发的哈哈1 小时前
网络音箱如何接入?音频文件夹、TTS播报、音量管控与ISAPI透传对接详解
人工智能·物联网·蓝海aiot一站式工作台·aiot开发·网络音箱·智慧广播·二次开放
硅基手札1 小时前
【串口技术系列文档 07】UART控制器寄存器详解
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
甜甜的大香瓜1 小时前
【MT32F006】MT32F006之TM1621C驱动LCD
单片机
硅基手札1 小时前
【串口技术系列文档 09】FIFO管理与流控
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
硅基手札1 小时前
【串口技术系列文档 08】中断驱动vs轮询vs DMA
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
尼喃1 小时前
OVP芯片完整方案:前级瞬态钳位、持续过压隔离与后端保护
嵌入式硬件