教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 实用文档 >

51串口通信C程序--模块集合

来源:网络收集 时间:2026-09-01
导读: 串口通信 本文以51单片机控制四路开关量输入/六路开关量输出为例,设计了一个简单的上位机下位机通信作品,作为模块学习和整理,供读者参考! 难为,2010-11-28,于上海! 四路开关量输入/六路开关量输出C语言程序 #includereg51.h #define uint unsigned in

串口通信

本文以51单片机控制四路开关量输入/六路开关量输出为例,设计了一个简单的上位机下位机通信作品,作为模块学习和整理,供读者参考!

难为,2010-11-28,于上海!

四路开关量输入/六路开关量输出C语言程序

#include<reg51.h>

#define uint unsigned int

#define uchar unsigned char

uchar indata[4];

uchar outdata[4];

volatile uchar temp1 = 0,temp2 = 0;

uchar i,j;

void initial_comm(void)

{

SCON = 0x50; //设定串行口工作方式:mode 1 ; 8-bit UART,enable ucvr

TMOD = 0x21; //TIMER 1;mode 2 ;8-Bit Reload

PCON = 0x80; //波特率不加倍SMOD = 1

TH1 = 0xfa; //baud: 9600;fosc = 11.0596

IE = 0x90; // enable serial interrupt

TR1 = 1; // timer 1

}

void uart_send(void)

{

ES = 0;

if(indata[3] == indata[0]^indata[1]^indata[2])

{

if(indata[1]== 0x01)

{

temp1 = P0;

temp1 = temp1&0x0f;

outdata[0] = 0xee;

outdata[1] = 0x02;

outdata[2] = temp1;

outdata[3] = outdata[0]^outdata[1]^outdata[2];

for(i=0;i<4;i++)

{

SBUF = outdata[i];

while(TI == 0);

串口通信

TI = 0;

}

}

if(indata[1]== 0x03)

{

temp2 = indata[2];

P1 = temp2;

}

if(indata[1]==0x04)

{

outdata[0] = 0xee;

outdata[1] = 0x05;

outdata[2] = temp2;

outdata[3] = outdata[0]^outdata[1]^outdata[2];

for(i=0;i<4;i++)

{

SBUF = outdata[i];

while(TI == 0);

TI = 0;

}

}

}

ES = 1;

}

void main()

{

initial_comm();

ES = 1;

while(1)

{

uart_send();

}

}

void uart_receive(void) interrupt 4

{

RI = 0;

for(j=0;j<4;j++)

{

indata[j] = SBUF;

串口通信

}

} while(RI==0); RI =0;

四路开关量输入/六路开关量输出通讯协议

通信设置: 波特率 9600b/s

1位起始位 8位数据位 无校验位 1位停止位

命令格式:

区别码(1字节) + Command(1字节) + Content(1字节)+ Xor(1字节)

区别码: 上位发送/单片机接收:0xff

单片机发送/上位机接收 :0xee

Command = 0x01 上位机命令单片机读取四路输入开关量的输入状态

如:0xff + 0x01 + 0x00 + Xor

Command = 0x02 单片机返回四路输入状态给上位机

此时,Content 的1字节中的低四位分别表示四路开关量的输入状态

1表示输入高电平,0表示输入低电平

第一路输入(第0位)

第二位输入(第1位)

第三路输入(第2位)

第四路输入(第3位)

如:假设某一时刻四路输入开关量的输入状态为0x03,上位机读取其状态为: 0xee + 0x02 + 0x03 + Xor

Command = 0x03 上位机命令单片机控制六路输出的输出状态

此时,Content 的1字节中的低六位分别表示六路开关量的输出状态

1表示输出高电平,0表示输出低电平

第一路输出(第0位)

第二路输出(第1位)

第三路输出(第2位)

第四路输出(第3位)

第五路输出(第4位)

第六路输出(第5位)

如:上位机欲设置某一时刻六路输出开关量的输出状态为0x01:

0xff + 0x03 + 0x01 + Xor

串口通信

Command = 0x04 上位机命令单片机读取六路输出开关量的输出状态

如:0xff + 0x04 + 0x00 + Xor

Command = 0x05 单片机返回六路输出状态给上位机

此时,Content 的1字节中的低六位分别表示六路开关量的输出状态

1表示输出高电平,0表示输出低电平

第一路输出(第0位)

第二路输出(第1位)

第三路输出(第2位)

第四路输出(第3位)

第五路输出(第4位)

第六路输出(第5位)

如: 某一时刻六路输出开关量的输出状态为0x01,上位机读取其状态为:

0xee + 0x05 + 0x01 + Xor

Content:表示四路输入开关量的输入状态(数据)或者六路输出开关量的输出状态(数据),在不使用它的命令格式中,它的值无意义,为通信方便,在不使用它的命令格式中,规定其值为0x00;

Xor :从第一个字节开始到Xor的前一个字节(总共3个字节),做异或运算

…… 此处隐藏:433字,全部文档内容请下载后查看。喜欢就下载吧 ……
51串口通信C程序--模块集合.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/1803024.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)