📄 3200demo.lst
字号:
C51 COMPILER V6.02 3200DEMO 12/10/2004 11:42:13 PAGE 1
C51 COMPILER V6.02, COMPILATION OF MODULE 3200DEMO
OBJECT MODULE PLACED IN C:\3200_DEMO\3200DEMO.OBJ
COMPILER INVOKED BY: C:\COMP51V6\C51.EXE C:\3200_DEMO\3200DEMO.C DB SB OE
stmt level source
1 /*******************************************************************************************
2 *
3 * Copyright (c) 2004,北京福星晓程电子科技股份有限公司
4 *
5 * All Rights Reserved
6 *
7 *
8 *
9 * 文件名称:3200DEMO.C
10 *
11 * 文件标识:存档
12 *
13 * 摘 要:单、复费率载波DEMO收发板程序
14 * 1. 接收PC机串口下发的抄表命令并通过载波转发
15 * 2. 接收载波返回的抄表应答命令并通过串口转发给PC机
16 * 3. 不加跳线端子,适用于复费率 ; 4、5脚加跳线端子,适用于单费率
17 * 4. CPU :PL3200
18 * 5. 串口波特率: 2400BPS 无校验
19 * 6. 复费率接收最长有效字节数:247 ; 单费率接收最长字节数:14
20 *
21 *
22 * 当前版本:2.0(发布)
23 * 作 者:魏 茂
24 * 完成日期:2004年11月17日
25 * 修改记录:修改串口转发部分的程序,另开一个com_buf,载波接收到数据以后,
26 * 立即将接收到的数据转移到新开com_buf里,在串口转发时不关闭载波中断,
27 * 直接使用com_buf。
28 *
29 *
30 *
31 * 取代版本:
32 * 原作者 :
33 * 完成日期:
34 *
35 *
36 *******************************************************************************************/
37
38 #include "PL3200.h"
39
40 #define uchar unsigned char
41 #define uint unsigned int
42
43 //I/O 口设置
44
45 sbit DFL_FFL = P1^1; // 单—复费率转换判断标志脚
46 sbit rlamp = P1^2; // 接收指示灯
47 sbit tlamp = P1^3; // 发送指示灯
48
49 // 全局变量设置
50 uchar data DFL_FFL_Sign; // 单——复费率标识
51
52 uchar bdata pl_data; // 发送字节缓冲
53
54 uchar data pl_len; // 发送字节计数
55 uchar data ti_len; // 发送字节计数
C51 COMPILER V6.02 3200DEMO 12/10/2004 11:42:13 PAGE 2
56 uchar data zbr_delay; // 发送字节计数
57 uchar data zbt_delay; // 发送字节计数
58 uchar data uart_delay; // 发送字节计数
59 uchar data max_rx ; // 发送字节计数
60
61 uchar data x,n; // x、n表示串口接收控制变量
62 uchar xdata r[250]; // 串口接收缓冲区
63 uchar data ystxd; // 延时时间变量
64 uchar data Carrier_Rxd_Delay; // 延时时间变量
65 uchar data r_data;
66 uchar data wdi; // 软狗变量
67 uchar data r_len; // 接收字节个数变量
68 uchar data r_len1; // 接收字节个数变量
69 uchar data dat; // 接收字节个数变量
70
71 // 位变量
72 bit bdata r_x; // 载波接收控制变量
73 bit bdata plmrxd; // 载波接收标志
74 bit bdata plmtxd; // 载波发送标志
75 uchar xdata pl_buf[250]; // 载波接收/红外接收缓冲区
76 uchar xdata com_buf[250]; // 载波接收/红外接收缓冲区
77
78
79 /**************************************************************************************
80 *
81 * FUNCTION: timeint0
82 *
83 * DESCRIPTION: 定时器0中断程序; 50 ms 发生一次中断,对延时变量进行减1处理
84 *
85 * PARAMETERS: none
86 *
87 * RETURNED: none
88 *************************************************************************************/
89 void timeint0(void) interrupt 1
90 {
91 1 if (ystxd!=0)
92 1 {
93 2 ystxd--; // 串口发送延时
94 2 }
95 1
96 1 if(Carrier_Rxd_Delay>0)
97 1 {
98 2 Carrier_Rxd_Delay--;
99 2 }
100 1 else
101 1 {
102 2 Carrier_Rxd_Delay=0;
103 2 rlamp=1;
104 2 r_x=0;
105 2 }
106 1
107 1 TH0=0x63; // 置定时器计数 50ms 中断一次( 12MHz )
108 1 TL0=0xcc;
109 1
110 1 if(wdi==0x9a)
111 1 {
112 2 WDT_RST=0xa1; // 清看门狗
113 2 wdi=0;
114 2 }
115 1 }
116
117
C51 COMPILER V6.02 3200DEMO 12/10/2004 11:42:13 PAGE 3
118 /**************************************************************************************
119 *
120 * FUNCTION: pl_pro
121 *
122 * DESCRIPTION: 载波中断收、发程序
123 *
124 * PARAMETERS:
125 * in : PLM_RS(PLM_RS=0 载波接收 ; PLM_RS=1 载波发送)
126 *
127 * out: plmrxd=1 载波接收成功 ; com_buf[] 载波接收成功的数据
128 *
129 * RETURNED: none
130 *************************************************************************************/
131 void pl_pro(void) interrupt 7
132 { // 复费率载波处理
133 1 uchar data i;
134 1
135 1 SSC_ADR=0x00; //选择载波状态寄存器
136 1 dat= SSC_DAT;
137 1 if((dat&0x80)==0x0)
138 1 return;
139 1
140 1 if((dat&0x01)==1) //载波发送状态
141 1 { // 载波发送
142 2 if((pl_len<ti_len)&&(pl_len<240))
143 2 {
144 3 SSC_BUF=r[pl_len++]; //发送下一个字节
145 3 }
146 2 else//((pl_len>=ti_len)||(pl_len>240))//发送字节字数限制,芯片自己会回到载波接收状态
147 2 { //发送完成
148 3 plmtxd=0; // 清正在发送标志
149 3
150 3 ti_len=0;
151 3 pl_data=0;
152 3
153 3 for(pl_len=0;pl_len<20;pl_len++)
154 3 {
155 4 r[pl_len]=0;
156 4 }
157 3 pl_len=0;
158 3 tlamp=1; // 发送指示灯灭
159 3 }
160 2 }
161 1 else
162 1 { // 载波接收
163 2 //if(plmrxd==1){return;}
164 2 if((dat&0x04)==0x04) //如果接收的是祯头标志
165 2 {
166 3
167 3 if(r_x==0) //如果处于等待接收状态
168 3 {
169 4 r_data=SSC_BUF; //接收第一个字节,并准备接收后面的字节
170 4 pl_buf[0]=r_data;
171 4 r_len=1;
172 4 r_len1 =60;
173 4 r_x=1;
174 4 rlamp=0;
175 4
176 4 Carrier_Rxd_Delay=20; // 最大接收延时时间为1S
177 4 }
178 3 }
179 2 else
C51 COMPILER V6.02 3200DEMO 12/10/2004 11:42:13 PAGE 4
180 2 {
181 3 if(r_x==1) // 如果已经接收了祯头,继续接收后续字节
182 3 {
183 4 r_data=SSC_BUF;
184 4 pl_buf[r_len]=r_data;
185 4
186 4 if(r_len==0x04) // 接收到了载波字节个数
187 4 {
188 5 r_len1=r_data+7; // 加7的意思是3个地址码+1个控制码+1个长度码+2个校验码
189 5
190 5 if(r_len1>60)
191 5 r_len1=60; // 接收字节长度限制
192 5 }
193 4
194 4 r_len+=1;
195 4
196 4 if(r_len>=r_len1)
197 4 {
198 5 plmrxd=1;
199 5 rlamp=1;
200 5 r_x=0;
201 5
202 5 for( i=0 ; i<(r_len1+1) ; i++ )
203 5 {
204 6 com_buf[i]=pl_buf[i];
205 6 }
206 5
207 5 }
208 4 }
209 3 }
210 2 }
211 1 }
212
213 /**************************************************************************************
214 *
215 * FUNCTION: initsys
216 *
217 * DESCRIPTION: 初始化设置函数,
218 * 进行系统初始化设置
219 *
220 * PARAMETERS: none
221 *
222 * RETURNED: none
223 *
224 *************************************************************************************/
225 void initsys(void)
226 { // 控制看门狗喂狗时间长度
227 1 CKCON=0X3F;
228 1 // 8位/16位运算模式选择位设置
229 1 ALU_MOD=0; // 设置成8位运算模式
230 1 //载波通讯配置
231 1 //************ 3200的载波寄存器设置 **********//
232 1 SSC_ADR=0x03;
233 1 SSC_DAT=0xC0;
234 1
235 1 SSC_ADR=0xFF;
236 1 SSC_DAT=0xFF;
237 1 SSC_ADR=0x02;
238 1 SSC_DAT=0x1F;
239 1 SSC_ADR=0xFF;
240 1 SSC_DAT=0x00;
241 1
C51 COMPILER V6.02 3200DEMO 12/10/2004 11:42:13 PAGE 5
242 1 //************ 3200的载波寄存器设置 **********//
243 1 EIE=0X01; // (A9H 使能INT2中断(EX2=1)
244 1 IT2=1; // (C8H) 为边沿触发方式(IT2=1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -