单片机串口通信C程序及应用实例

2019-03-03 14:48

一、程序代码

#include//该头文件可到WWW.STCMCU.COM网站下载 #define uint unsigned int #define uchar unsigned char

uchar indata[4]; uchar outdata[4]; uchar flag;

static uchar temp1,temp2,temp3,temp; static uchar R_counter,T_counter;

void system_initial(void); void initial_comm(void); void delay(uchar x); void uart_send(void); void read_Instatus(void); serial_contral(void);

void main() { }

void uart_send(void) {

for(T_counter=0;T_counter<4;T_counter++) {

SBUF = outdata[T_counter]; while(TI == 0);

system_initial(); initial_comm(); while(1) { }

if(flag==1) { }

ES = 0;

serial_contral(); ES = 1; flag = 0;

else read_Instatus();

}

TI = 0;

}

T_counter = 0;

uart_receive(void) interrupt 4 { }

if(RI) { }

RI = 0;

indata[R_counter] = SBUF; R_counter++; if(R_counter>=4) { }

R_counter = 0; flag = 1;

void system_initial(void) { }

P1M1 = 0x00; P1M0 = 0xff;

P1 = 0xff; //初始化为全部关闭

temp3 = 0x3f;//初始化temp3的值与六路输出的初始值保持一致 temp = 0xf0; R_counter = 0; T_counter = 0;

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 RI = 0; TI = 0; ES = 1; EA = 1;

void delay(uchar x) { uchar i,j; for(i=0;i

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

serial_contral(void) { }

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

if(indata[1]== 0x01) {

P0 = 0xff;

temp2 = P0; //读取四路输入

// temp2 = temp2&0x0f; outdata[0] = 0xee; outdata[1] = 0x02;

outdata[2] = temp2;

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

uart_send(); return; }

if(indata[1]== 0x03)

temp3 = indata[2];

{ }

}

P1 = temp3; //控制六路输出 return;

if(indata[1]==0x04) { }

outdata[0] = 0xee; outdata[1] = 0x05;

outdata[2] = temp3;

outdata[3] = ((outdata[0]^outdata[1])^outdata[2]); uart_send(); return;

void read_Instatus(void) {

P0 = 0xff;

temp1 = P0; //读取四路输入 if(temp1!=temp) { }

delay(10); P0 = 0xff; temp1 = P0; if(temp1!=temp) {

temp = temp1; //P0 = 0xff;

//temp = P0; //temp = temp&0x0f; }

outdata[0] = 0xee; outdata[1] = 0x06;

outdata[2] = temp;

outdata[3] = ((outdata[0]^outdata[1])^outdata[2]); uart_send();

}

//总结:原因在于串口中断接收一定要使用全局变量,并且这个变量R_counter和T_counter要在主程序中初始化。这样,当串口有数据进来时,系统进入中断接收程序,就不会出现数组混乱送出的问题。

二、原理图

J421CON2+12Vto+24V+12Vto+24VD7DIODEU2U151FEEDBACK4L1330uHLEDD9IN5822C7330uF/25VC8104VCCU9R171k5TLP521+5VU3R81KR181k5VCCVCCC9R131K5R3123456789101112CON12K3D31N4007910111213141516U11K+5VTLP521U540414243441234567891011121314151617104U14P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7RSTRXD/P3.0INT2TXD/P3.1P3.2P3.3P3.4P3.5P3.6P3.7XTAL2XTAL1VSSP4.0STC8952P4.2VDDP0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7EAP4.1ALEPSENP2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.039383736353433323130292827262524232221201918R91KTLP521+5VR191k5U11U10J312345678CON4TLP521R101KR201k5VCCU12+5VAGND+5V+5VVCCD8R25471VCCVin1243AGND+5VGNDONOFFC2100uF/50VVout2B0505S-1W3+5VC124K112G5V-11334D11N400710uf/16V5R121K5K2D21N4007R21k+5VR1+5VTLP521U4G5V-1J1R141K5RESETRXDTXDVCCG5V-1K4D41N4007VCC7C6C5C4C3C2C1CULN2003EB7B6B5B4B3B21B87654321R51kR41k+5VTLP521U6R151K5G5V-1TLP521+5VU7XTAL2XTAL1R21RES2TLP521R111KK5D51N4007R61k+5VTLP521U8G5V-1R161K5R7K6D61N40071kTLP521VCCG5V-1VCCC10XTAL122pFVCCC3CAP12345678C11U13C1+V+C1-C2+C2-V-T2OUTR2INMAX232C1210uFE111.0592MHzRESETC4XTAL2VCCGNDT1OUTR1INR1OUTT1INT2INR2OUT161514131211109R22R2310k10k22pFR2410KCAPC5J2321CON3C6CAPCAPTXDRXD 三、 四路开关量输入/六路开关量输出通讯协议

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

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位)


单片机串口通信C程序及应用实例.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:青岛大学电子技术课程设计报告

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: