亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
MCU51-PC通訊協議
[打印本頁]
作者:
51黑黑黑
時間:
2016-2-13 02:54
標題:
MCU51-PC通訊協議
/****************************************************************************/
/* */
/* Copyright (c) 2016, 老馬工作室 */
/* All rights reserved. */
/* */
/* Email:pcwebmaster@163.com */
/****************************************************************************/
/****************************************************************************/
/* 文 件 名:comint.c */
/* 版 本:Version 1.0 */
/* 描 述:串行口中斷帶通訊協議測試 */
/* 主控芯片:STC89LE54RD*/
/* 晶振頻率:22.1184MHz*/
/* 作 者:pcwebmaster */
/* 函 數: */
/* system_init */
/* com_send_command */
/* com_command_receive*/
/*CalCRC16_1021*/
/*command_decoder*/
/*send_command*/
/* 測 試: 發送:16 16 02 01 02 01 00 35 03 94 BD接收:49 16 16 06 AA 55 */
/* 測試現象:P05/P06/P07三個LED取反*/
/* 歷史記錄:20016.02.09測試通過 */
/* 北極狼 20016-02-09 Creat Inital version. (Version 1.0) */
/****************************************************************************/
#include "comint.h"
void main(void)
{
u_char i = 0;
system_init();
while(1)
{
com_command_receive();
}
}
#include "comint.h"
u_char data pint_buf[MAX_RINTL]; /* 串口接收緩沖區 */
u_char data pint_read; /* 串口緩沖區讀指針 */
u_char data pint_write; /* 串口緩沖區寫指針 */
u_char data psend_int; /* 串口發送允許標志 */
u_char serial_flag = 0; /* 串口接收數據標志位 */
u_char idata prec_buf[MAX_COMMAND_LEN];/* 命令接收緩沖區 */
u_char prec_num; /* 命令接收緩沖區字節數 */
u_char serial_lengthl = 0; /* 消息命令長度低8位 */
u_int serial_length = 0; /* 消息命令長度16位 */
u_char ADDRESS[2]={ZU,ZHAN}; /* byte0:通訊組地址, byte1:開發板地址 */
/* 串口發送一個字節 */
void com_send_command(char onebyte)
{
psend_int = 0;
SBUF = onebyte;
while (psend_int != 1);
}
/* 串口接收數據處理 */
void com_command_receive(void)
{
u_char var1,var4;
u_int crc_data = 0;
var4 = pint_read;
if (var4 != pint_write)
{
var1 = pint_buf[var4];
var4 = var4+1;
if (var4 >= MAX_RINTL)
var4=0;
pint_read = var4;
switch(serial_flag)
{
case 0: /*收到起始位*/
if (var1 == SYN)
{
serial_flag = 1;
//com_send_command(0x01); //測試
}
else
{
serial_flag = 0;
}
break;
case 1:/*收到起始位*/
if (var1 == SYN)
{
serial_flag = 2;
//com_send_command(0x02); //測試
}
else
{
serial_flag = 0;
}
break;
case 2:/*收到同步位*/
if (var1 == STX)
{
serial_flag = 3;
//com_send_command(0x03);//測試
}
else
{
serial_flag = 0;
}
break;
case 3: /*收到組地址*/
if (var1 == ADDRESS[0])
{
serial_flag = 4;
prec_num = 1;
prec_buf[0] = var1;
//com_send_command(0x04); //測試
}
else
{
serial_flag = 0;
}
break;
case 4:/*收到本機地址或者廣播地址*/
if ( (var1 == ADDRESS[1]) || (var1 == 0) )
{
prec_num = 2;
prec_buf[1] = var1;
serial_flag = 5;
//com_send_command(0x05); //測試
}
else
{
serial_flag = 0;
}
break;
case 5:/*數據長度*/
prec_num = 3;
prec_buf[2] = var1;
serial_lengthl = var1;
serial_flag = 6;
//com_send_command(0x06);//測試
break;
case 6:
prec_num = 4;
prec_buf[3] = var1;
serial_length |= var1;
serial_length = ( (serial_length << 8) & 0xff00 ) + serial_lengthl + 3;
serial_flag = 7;
//com_send_command(0x07);//測試
break;
case 7:
prec_buf[prec_num] = var1;
prec_num++;
serial_length--;
if (serial_length == 0)
{
crc_data = CalCRC16_1021(prec_buf, prec_num - 2); /* 計算crc校驗和(從組地址開始到ETX )*/
if ( ( (crc_data & 0x00ff) == prec_buf[prec_num - 2]) && ( ( (crc_data >>8) & 0x00ff) == prec_buf[prec_num - 1]) ) /* 校驗和正確 */
{
prec_num = 1;
var1 = 0;
if ( (prec_buf[4] >= 0x31) && (prec_buf[4] <= 0x3b) ) /* 命令有效 */
{
if (prec_buf[1] != 0x00) /* 如果不是廣播地址則回應ACK*/
com_send_command(0x49);//測試 msg_last_push(MSG_ACK,0);
send_command(ACK); //測試
command_decoder(); /* 如果校驗和正確,則進行命令解碼 */
}
else
{
send_command(NAK); //測試
}
}
else
{
send_command(NAK); //測試
}
serial_flag = 0;
prec_num = 1;
}
break;
default:
serial_flag = 0;
prec_num = 1;
break;
}
}
}
/* 命令解碼子程序 */
void command_decoder(void)
{
u_char i = 0;
if (prec_buf[4] == 0x31) /* 設置報警閾值 */
{
P05 = !P05;//測試
return;
}
else if (prec_buf[4] == 0x32) /* 請求報警閾值 */
{
P05 = !P06;//測試
return;
}
else if (prec_buf[4] == 0x33) /* 修改當前時間 */
{
P07 = !P07;//測試
return;
}
else if (prec_buf[4] == 0x34) /* 請求當前時間 */
{
P05 = !P05;//測試
P07 = !P07;//測試
return;
}
else if (prec_buf[4] == 0x35) /* 請求當前數據 */
{
com_send_command(0xAA);//測試
com_send_command(0x55);//測試
P0 = ~P0;//測試
return;
}
else if (prec_buf[4] == 0x36) /* 請求看門狗信息*/
{
com_send_command(0xFF);//測試
return;
}
else if (prec_buf[4] == 0x37) /* 請求報警情況 */
{
com_send_command(0xFF);//測試
return;
}
else if (prec_buf[4] == 0x38) /* 配置設備地址 */
{
ADDRESS[0] = prec_buf[5]; /* 通訊組地址 */
ADDRESS[1] = prec_buf[6]; /* 站地址 */
com_send_command(0xFF);//測試
return;
}
else if (prec_buf[4] == 0x39) /* 請求設備地址 */
{
com_send_command(0xFF);//測試
return;
}
else if (prec_buf[4] == 0x3a) /* 控制模擬量輸出 */
{
com_send_command(0xFF);//測試
return;
}
else if (prec_buf[4] == 0x3b) /* 控制開關量輸出 */
{
com_send_command(0xFF);//測試
return;
}
}
/* 向PC主機發送消息幀,入口參數:消息類型 */
void send_command(u_char command)
{
switch (command)
{
case ACK:
com_send_command(SYN);
com_send_command(SYN);
com_send_command(ACK);
break;
case NAK:
com_send_command(SYN);
com_send_command(SYN);
com_send_command(NAK);
break;
default:
break;
}
}
void system_init()
{
u_char loop;
EA = 0; /* CPU關中斷 */
pint_read = 0; /* 串口緩沖讀指針 */
pint_write = 0; /* 串口緩沖寫指針 */
//
SCON = 0x48; //主控芯片STC89LE54RD
PCON = 0x80;
TMOD = 0x20;
TCON = 0x50;
TH1 = 0xFD; // 波特率為19200
TL1 = 0xFD;
TR1 = 1; // 定時器1啟動計數*/
ES = 1; /* 串口開中斷 */
PS = 0; /* 串口低優先級 */
REN = 1; /* 串口接收允許 */
EA = 1; /* 開CPU中斷 */
loop = SBUF; /* 清串口緩沖區 */
for (loop=0; loop<MAX_RINTL; loop++)
{
pint_buf[loop] = 0;
}
}
/*計算CRC校驗和使用MTT(0X1021)
參數:
pBuff 為需計算CRC的緩沖區的頭指針
BufferLen 緩沖區長度(以字節計)
*/
u_short CalCRC16_1021(u_char x[], u_short BufferLen)
{
u_short i;
u_char j;
u_short crc16 = 0;
u_short mask = 0x1021;
u_char *pByteBuffer;
u_char tmpbyte;
u_short calval;
pByteBuffer = &x[0];
for (i = 0; i < BufferLen; i++)
{
tmpbyte = *pByteBuffer;
calval = tmpbyte << 8;
for (j = 0; j < 8; j++)
{
if ((crc16 ^ calval) & 0x8000)
crc16 = (crc16 << 1) ^ mask;
else
crc16 <<= 1;
calval <<= 1;
}
pByteBuffer++;
}
return crc16;
}
/* 串口中斷服務程序,使用第3組寄存器 */
void com_int_proc(void) interrupt 4 using 3
{
u_char temp;
u_char temp1;
if (TI == 1) /* 是發送中斷 */
{
TI = 0;
psend_int = 1; /* 可以發送 */
}
if (RI == 1) /* 是接收中斷 */
{
RI = 0; /* 清串口接收中斷 */
temp1 = SBUF;
temp = pint_write + 1; /* 判斷是否可以寫入 */
if (temp == MAX_RINTL)
{
temp=0;
}
if (temp != pint_read)
{
pint_buf[pint_write] = temp1; /* 讀取數據 */
pint_write = temp;
}
}
}
#ifndef __COMINT_H__
#define __COMINT_H__
#define ZU0x01 /*組地址*///通訊地址修改這兩項
#define ZHAN0x02 /*站地址*///通訊地址修改這兩項
#include "STC.h"
#include <absacc.h>
#include <intrins.h>
#include <string.h>
typedef unsigned char u_char;
typedef unsigned int u_int;
typedefunsigned shortu_short;
#define MAX_RINTL 8 /* 串口接收緩沖區長度 */
#define SYN 0x16 /* 通訊同步位*/
#define STX 0x02 /* 通訊起始位*/
#define ETX 0x03 /* 通訊結束位*/
#define ACK 0x06
#define NAK 0x15
#define MSG_ACK 2 /* 正確應答信息 */
#define MSG_NAK 3 /* 錯誤應答信息 */
#define MAX_COMMAND_LEN 16 /* 串口接受命令長度 */
extern char str_test[25] ;
extern u_char data pint_read; // 串口緩沖區讀指針 */
extern u_char data pint_write; // 串口緩沖區寫指針
//extern u_char data psend_int; // 串口發送允許標志
extern u_char data pint_buf[MAX_RINTL]; // 串口接收緩沖區
extern u_char serial_flag; /* 串口接收數據標志位 */
extern u_char idata prec_buf[MAX_COMMAND_LEN];/* 命令接收緩沖區 */
/* 串口發送一個字節 */
extern void com_send_command(char onebyte);
/* 串口接收數據處理 */
extern void com_command_receive(void);
/* 系統初始化 */
extern void system_init();
///* 串口接收一字節數據 */
//unsigned char UartReadChar(void); //reentrant
/*計算CRC校驗和使用MTT(0X1021)
參數:
pBuff 為需計算CRC的緩沖區的頭指針
BufferLen 緩沖區長度(以字節計)
*/
u_short CalCRC16_1021(u_char x[], u_short BufferLen);
/* 命令解碼子程序 */
void command_decoder(void);
/* 向主機發送消息幀,入口參數:消息類型 */
void send_command(u_char command);
#endif
復制代碼
作者:
ztx
時間:
2016-2-15 10:04
51黑有你更精彩...................
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1