📄 sp23x8 demo.lst
字号:
C51 COMPILER V7.20 SP23X8_DEMO 03/09/2006 09:34:04 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE SP23X8_DEMO
OBJECT MODULE PLACED IN SP23x8 demo.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil 7.20\C51\BIN\C51.EXE SP23x8 demo.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!申 明!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
2 //本驱动程序属于成都视普科技公司所有,仅允许免费用于本公司销售的产品中,未 //
3 //经书面许可任何单位或个人不可将本程序用于其它用途,否则将追究其法律责任 //
4 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5 /***************************************************************************
6 SP23x8 demo.c source file SP2328/SP2338 serial communication
7 example for MCS-51 MCU (oscillating crystal: 11.0592MHz)
8 Author: Wen hua, 2005-07-18
9 ***************************************************************************/
10 /********************************上位机资源占用*****************************
11 ****** RAM:8(BYTE,不含子串口发送缓冲)+5(BIT),ROM:200BYTE(内核部分) ******
12 ****** 接收一个字节耗用15条指令(MAX),发送一个字节耗用45条指令(MAX)******
13 ***************************************************************************/
14
15 #include <reg52.h>
16 #define uchar unsigned char
17 #define uint unsigned int
18
19 bit bdata bUartBusy; //上位机串口发送状态标志,"1"表示上位机串口"忙"(正发送数据
20 //到子串口,新数据只需送入子串口发送缓冲区即可,"0"表示上位
21 //机串口"空闲",需用户程序将"TI=1"来启动子串口数据发送
22
23 bit bdata bInstructFlag; //上位机发送指令请求标志,上位机需要发送指令时必须
24 //先将待发发送指令放到"InstructBuf",之后将该
25 //标志设置为"1"即可.标志变为"0"后可继续发送指令
26
27 bit bdata bUart0RFlag,bUart1RFlag,bUart2RFlag; //上位机接收到子串口数据
28 //标志,"1"表示上位机接收到相应子串口数据,主程序可通过查询
29 //该标志的方式判断相应子串口是否接收到新数据(主程序取走刚
30 //收到的新数据后,必须将该标志清"0",以便识别下一个新数据)
31
32 uchar idata Uart0Tbuf[8]; //子串口0数据发送缓冲区(大小可由用户随意配置)
33 uchar idata Uart1TBuf[8]; //子串口1数据发送缓冲区(大小可由用户随意配置)
34 uchar idata Uart2TBuf[8]; //子串口2数据发送缓冲区(大小可由用户随意配置)
35
36 uchar idata Uart0RBuf,Uart1RBuf,Uart2RBuf; //上位机接收子串口数据缓
37 //冲存储器,上位机通过判断"bUart0RFlag"等标志
38 //是否为"1",来决定是否读取该寄存器的数据
39
40 uchar idata UartPointer; //子串口发送数据指针,中断服务程序通过该指针轮询
41 //发送数据到各子串口,保证各子串口的数据不丢失
42
43 uchar idata InstructBuf; //指令缓冲(用户可将设置SP2328/SP2338的指令放入
44 //该寄存器,由驱动程序自动完成指令发送)
45
46 uchar idata Uart0TNum,Uart1TNum,Uart2TNum; //等待发送到各
47 //子串口的字节数,"0"表示相应子串口发送缓冲区"空"
48 //主程序可以通过判断该标志是否为"0"来决定是否向
49 //相应子串口发送后续数据
50 /*****************************************************************************
51 功能:设定SP2328/SP2338输入、输出地址,可根据实际电路修改
52 *****************************************************************************/
53 sbit AdrIn0 =P1^0; /* 连接到SP2328/SP2338的PIN0 (ADRO0)*/
54 sbit AdrIn1 =P1^1; /* 连接到SP2328/SP2338的PIN1 (ADRO1)*/
55 sbit AdrOut0=P1^2; /* 连接到SP2328/SP2338的PIN18(ADRI0)*/
C51 COMPILER V7.20 SP23X8_DEMO 03/09/2006 09:34:04 PAGE 2
56 sbit AdrOut1=P1^3; /* 连接到SP2328/SP2338的PIN17(ADRI1)*/
57
58 #define _DEBUG_SUB_MODULE
59 /****************************************************************************
60 功能:上位机串口中断服务函数,自动完成子串口数据发送(自动发送数据包)和数据接收
61 (单字节接收并缓存)以及自动发送上位机配置指令等
62 输入:Uart0TNum,Uart1TNum,Uart2TNum,bInstructFlag,InstructBuf,bUartBusy
63 Uart0Tbuf[???],Uart1TBuf[???],Uart2TBuf[???]
64 输出:bUart0RFlag,bUart1RFlag,bUart2RFlag,Uart0RBuf,Uart1RBuf,Uart2RBuf,bUartBusy
65 *****************************************************************************/
66 serial () interrupt 4 {
67 1 if(RI){
68 2 RI=0; //准备解析刚接收到的数据来自于哪个子串口
69 2 if(AdrIn1){ //子串口2接收到一个字节
70 3 Uart2RBuf=SBUF; //缓存子串口2收到的数据,以便接收后续数据
71 3 bUart2RFlag=1; //置子串口2收到数据标志,便于主程序查询
72 3 }
73 2 else if(AdrIn0){ //子串口1接收到一个字节
74 3 Uart1RBuf=SBUF; //缓存子串口1收到的数据,以便接收后续数据
75 3 bUart1RFlag=1; //置子串口1收到数据标志,便于主程序查询
76 3 }
77 2 else { //子串口0接收到一个字节
78 3 Uart0RBuf=SBUF; //缓存子串口0收到的数据,以便接收后续数据
79 3 bUart0RFlag=1; //置子串口0收到数据标志,便于主程序查询
80 3 }
81 2 }
82 1
83 1 else{
84 2 TI=0; //已经产生发送中断,准备解析下一个需要发送的数据
85 2 switch(UartPointer){ //判断即将向哪个子串口发送数据?
86 3 case 0:{ //准备向子串口0发送数据
87 4 UartPointer++; //下一次发送中断准备向子串口1发送数据
88 4 if(Uart0TNum){ //串口0发送缓存区是否有数据需要发送?
89 5 AdrOut0=0; //有数据需要发送,则选通子串口0的地址
90 5 AdrOut1=0;
91 5 SBUF=Uart0Tbuf[--Uart0TNum];//将串口0发送缓存中的一个字节
92 5 break; //由子串口0发送到下位机
93 5 }
94 4 else goto T_NopInstruction; //若子串口0没有数据发送则准备发送空指令
95 4 }
96 3
97 3 case 1:{ //准备向子串口1发送数据
98 4 UartPointer++; //下一次发送中断准备向串口2发送数据
99 4 if(Uart1TNum){ //串口1发送缓存区是否有数据需要发送?
100 5 AdrOut0=1; //有数据需要发送,则选通子串口1的地址
101 5 AdrOut1=0;
102 5 SBUF=Uart1TBuf[--Uart1TNum];//将串口1发送缓存中的一个字节
103 5 break; //由子串口1发送到下位机
104 5 }
105 4 else goto T_NopInstruction; //若子串口1没有数据发送则准备发送空指令
106 4 } //而只能够发送一条空指令用于时序配合
107 3
108 3 case 2:{ //准备向子串口2发送数据
109 4 UartPointer++; //下一次发送中断准备发送空指令
110 4 if(Uart2TNum){ //串口2发送缓存区是否有数据需要发送?
111 5 AdrOut0=0; //有数据需要发送,则选通子串口2的地址
112 5 AdrOut1=1;
113 5 SBUF=Uart2TBuf[--Uart2TNum];//将串口2发送缓存中的一个字节
114 5 break; //由子串口2发送到下位机
115 5 }
116 4 else goto T_NopInstruction; //若子串口2没有数据发送则准备发送空指令
117 4 } //而只能够发送一条空指令用于时序配合
C51 COMPILER V7.20 SP23X8_DEMO 03/09/2006 09:34:04 PAGE 3
118 3
119 3 default:{
120 4 UartPointer=0; //下一次发送中断准备向串口0发送数据
121 4 T_NopInstruction:
122 4 AdrOut0=1; //选通目串口准备发送空指令或者其他指令
123 4 AdrOut1=1;
124 4 if(bInstructFlag){ //判断是否需要发送其他指令?
125 5 bInstructFlag=0; //清除指令发送标志
126 5 SBUF=InstructBuf; //将需要发送的指令发送到串口扩展IC
127 5 break;
128 5 }
129 4 else if(Uart0TNum|Uart1TNum|Uart2TNum){//判断所有子串口的数据是否
130 5 SBUF=0; //都已经全部发送完毕
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -