📄 serial.lst
字号:
C51 COMPILER V8.02 SERIAL 08/13/2008 08:26:11 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN serial.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE serial.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*----------------------------------------------------------------------------
2 名 称:serial.c
3 功 能:aduc848串口相关函数的实现
4 版 本:0.1
5 负责人:邓健
6 历 史:
7 2007.7.11 created by Jiandeng
8 ----------------------------------------------------------------------------*/
9 #include<aduc845.h>
10
11 #define RX_IDL 0
12 #define RX_HDR 1
13 #define RX_ADD 2
14 #define RX_CMD 3
15 #define RX_LEN 4
16 #define RX_DAT 5
17 #define RX_CHK 6
18 #define RX_X16 7
19 #define RX_END 255
20 unsigned char xdata serialRxData[20];
21 unsigned char xdata serialTxData[2500];
22 unsigned int serialTxLEN;
23 unsigned char serialRxADD,serialRxCMD,serialRxLEN;
24 unsigned char serialRxStatus = RX_IDL;
25 extern unsigned char ADDR;
26 /**********************************************************
27 串口初始化,波特率设置为115200,使能中断
28 ***********************************************************/
29 void SerialInit(void)
30 {
31 1 T3CON = 0x82; //115200 Baud rate
32 1 T3FD = 0x2D;
33 1 SCON = 0x52;
34 1 ES=1; //Enable interrupt
35 1 }
36 /**********************************************************
37 串口发送,把发送缓冲区里的数据通过串口发送出去
38 ***********************************************************/
39 void SerialTx(unsigned int len)
40 {
41 1 serialTxLEN = len;
42 1 SBUF = 0xFE;
43 1 }
44
45 /**********************************************************
46 串口发送
47 【add】 从机地址
48 【cmd】 命令
49 【len】 数据长度
50 待发送的数据保存在serialTxData[10]开始先
51 ***********************************************************/
52 void SerialSend(unsigned char add,unsigned char cmd,unsigned int len)
53 {
54 1 unsigned char serialTxCHK = 0;
55 1 unsigned int i;
C51 COMPILER V8.02 SERIAL 08/13/2008 08:26:11 PAGE 2
56 1
57 1 serialTxData[0] = 0xFE;
58 1 serialTxData[1] = 0x68;
59 1 serialTxData[2] = add;
60 1 serialTxData[3] = add;
61 1 serialTxData[4] = cmd;
62 1 serialTxData[5] = cmd;
63 1 serialTxData[6] = len>>8;
64 1 serialTxData[7] = len;
65 1 serialTxData[8] = len>>8;
66 1 serialTxData[9] = len;
67 1
68 1 for(i = 10;i < 10 + len;i ++) //checksum
69 1 {
70 2 serialTxCHK += serialTxData[i];
71 2 }
72 1
73 1 serialTxData[10 + len] = serialTxCHK;
74 1 serialTxData[11 + len] = 0x16;
75 1 SerialTx(12 + len);
76 1 }
77
78 /**********************************************************
79 串口中断函数
80 ***********************************************************/
81 void int_serial() interrupt 4
82 {
83 1 static unsigned char serialRxCounter,serialRxCHK;
84 1 static unsigned int serialTxCounter;
85 1 if(1 == RI)
86 1 {
87 2 RI = 0;
88 2 switch(serialRxStatus)
89 2 {
90 3 case RX_IDL: //空闲状态,接收0xFE进入HDR状态
91 3 if(SBUF == 0xFE)
92 3 {
93 4 serialRxStatus = RX_HDR;break;
94 4 } //HDR状态,接收0x68开始接收地址,接收到0xFE则保持HDR状态
95 3 case RX_HDR:
96 3 if(SBUF == 0x68)
97 3 {
98 4 serialRxStatus = RX_ADD;
99 4 }
100 3 else if(SBUF != 0xFE)
101 3 {
102 4 serialRxStatus = RX_IDL;
103 4 }
104 3 break;
105 3 case RX_ADD: //ADD状态,接收1B的地址,重复发送两次,接收成功则进入CMD状态
106 3 if(serialRxCounter == 0)
107 3 {
108 4 serialRxADD = SBUF;
109 4 serialRxCounter = 1;
110 4 }
111 3 else
112 3 {
113 4 serialRxCounter = 0;
114 4 if(SBUF == serialRxADD && serialRxADD == ADDR)
115 4 {
116 5 serialRxStatus = RX_CMD;
117 5 }
C51 COMPILER V8.02 SERIAL 08/13/2008 08:26:11 PAGE 3
118 4 else
119 4 {
120 5 serialRxStatus = RX_IDL;
121 5 }
122 4 }
123 3 break;
124 3 case RX_CMD: //CMD状态,1B命令,重复发送两次,接收成功则进入LEN状态
125 3 if(serialRxCounter == 0)
126 3 {
127 4 serialRxCMD = SBUF;
128 4 serialRxCounter = 1;
129 4 }
130 3 else
131 3 {
132 4 serialRxCounter = 0;
133 4 if(SBUF == serialRxCMD)
134 4 {
135 5 serialRxStatus = RX_LEN;
136 5 }
137 4 else
138 4 {
139 5 serialRxStatus = RX_IDL;
140 5 }
141 4 }
142 3 break;
143 3 case RX_LEN: //LEN状态,接收2B数据长度,重复两次,这里只考虑了低字节,接收成功进入DAT或者CHK
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -