📄 main.lst
字号:
C51 COMPILER V8.02 MAIN 12/19/2006 09:36:14 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c LARGE BROWSE DEBUG OBJECTEXTEND
line level source
1 /****************************************************************************
2 * File : main.c *
3 * COPYRIGHT BY HUOYAN LTD.COMPANY *
4 * Version: V1.0 *
5 * *
6 * Created: 15.Aug.2006 *
7 * Last Change: 17.Aug.2006 *
8 * *
9 * Author: huzi *
10 * *
11 * Compiler: KEIL C51 V7.10 *
12 * *
13 * Description: STC89C52RD+ Firmware for HY502 Serial Reader *
14 * OSC use 11.0592MHz crystal. *
15 *****************************************************************************/
16
17 /********************************************************************************
18 此程序是RS485从机通讯,包含3部分:接收帧程序、发送帧程序及执行命令程序。
19 从机通讯地址从地址开关读取4位
20 由于485的通信规约差别很大,这里只是提供参考,具体请参照自己的项目特点做修改。
21 ********************************************************************************/
22 //#include<reg52.h>
23 #include<main.h>
24 #include<hy502.h>
25
26 /*宏定义*/
27 #define uchar unsigned char
28 #define uint unsigned int
29
30 // 按键端口定义
31 sbit P20=P2^0;
32 sbit P21=P2^1;
33 sbit P22=P2^2;
34 sbit P23=P2^3;
35
36 bit ack; //应答标志
37 uchar code cStatus1[]="Ok!";
38
39 /*通讯变量定义*/
40 sbit CTRL485=P3^7; /*RS485切换控制信号*/
41
42 #define N 32 /*通讯缓存区长度*/
43 uchar idata Serial_buf[N]; /*定义通讯缓存区*/
44
45 /*数据结构:地址域A0A1A2A3 4个,命令字节1个,长度字节1个,数据区(标识符2个,数据)*/
46
47 /*主程序变量定义*/
48 uchar data Command_status1=0x00; /*程序运行状态字节*/
49
50 /********************************************************************
51 延时函数
52 原型:void Delay(uchar);
53 功能:延时1ms*i
54 入口参数: i是设定延时时间
55 出口参数:无
C51 COMPILER V8.02 MAIN 12/19/2006 09:36:14 PAGE 2
56 ********************************************************************/
57 void Delay(uchar i)
58 {
59 1 uint j;
60 1 for(;i>0;i--)
61 1 for(j=0;j<700;j++);
62 1 }
63
64
65 /********************************************************************
66 蜂鸣器函数
67 原型:void beep(uchar n);
68 功能:设定响的次数
69 入口参数:n
70 出口参数:无
71 ********************************************************************/
72 void beep(uchar n)
73 {
74 1 uchar i;
75 1 for(i=0;i<n;i++)
76 1 {
77 2 BUZ=0; //产生周期为1s的方波
78 2 Delay(500); //delay 0.5s
79 2 BUZ=1;
80 2 Delay(500);
81 2 BUZ=0;
82 2 }
83 1 }
84 /********************************************************************
85 LED闪烁函数
86 原型:void splash(uchar n);
87 功能:设定LED闪烁的次数
88 入口参数:n
89 出口参数:无
90 ********************************************************************/
91 void splash(uchar n)
92 {
93 1 uchar i;
94 1
95 1 for(i=0;i<n;i++)
96 1 {
97 2 LED_YELLOW=1;
98 2 Delay(500); //delay 0.5s
99 2 LED_YELLOW=0;
100 2 Delay(500);
101 2 LED_YELLOW=1;
102 2 }
103 1 }
104 /********************************************************************
105 CPU各个部件的初始化函数
106 原型:void InitializeSystem();
107 功能:初始化系统各个部件
108 入口参数:无
109 出口参数:无
110 ********************************************************************/
111 void InitializeSystem()
112 {
113 1 ET2 = 0;
114 1 T2CON = 0x04;
115 1 PCON&=0x3f; /*UART设置工作方式3,11位数据*/
116 1 SCON=0xd0;
117 1 TMOD = 0x21; //TMOD = 0x22;
C51 COMPILER V8.02 MAIN 12/19/2006 09:36:14 PAGE 3
118 1
119 1 TH1 = BAUD_19200; //默认波特率
120 1 TL1 = TH1;
121 1 TR1 = TRUE; // 波特率发生器
122 1
123 1 TH0 = 0xDC;
124 1 TL0 = 0x00;
125 1 TR0 = 1;
126 1 ET0=1;
127 1
128 1 ET1=0;
129 1 EA=1;
130 1 EX0=1;
131 1 IT0 = 1;
132 1 TR2=0;
133 1
134 1 g_bReceCommandOk=0;
135 1 Delay(100); /*延时100ms,以稳定CPU*/
136 1 //喇叭和指示灯测试
137 1 splash(1);
138 1 beep(1);
139 1
140 1 CTRL485=1; /*485通讯为接收状态*/
141 1 ES = TRUE;
142 1 }
143
144 /********************************************************************
145 接收一个字节通讯函数
146 原型:uchar RecByte();
147 功能:接收一个字节通讯
148 入口参数:无
149 出口参数:返回接收值
150 ********************************************************************/
151 uchar RecByte()
152 {
153 1 RI=0;
154 1 while(!RI);
155 1 RI=0;
156 1 ACC=SBUF;
157 1 if(P!=RB8) /*偶校验正确吗?*/
158 1 {
159 2 SP--;SP--;CY=0;return CY; /*错误返回*/
160 2 }
161 1 return (ACC); /*接收一个字节,并进行偶校验*/
162 1 }
163
164 /********************************************************************
165 接收一帧通讯函数
166 原型:void RecFrame(uchar *s);
167 功能:接收一帧通讯
168 入口参数:接收存取地址指针
169 出口参数:接收正确标志,1为接收正确
170 ********************************************************************/
171 bit RecFrame(uchar *s)
172 {
173 1 uchar CS=0x00,Serial_data;
174 1 char i,j;
175 1
176 1 RI=0;
177 1 Serial_data=SBUF; /*接收第一字节*/
178 1 while(Serial_data!=0xfe)
179 1 return 0; /*不是前导字节*/
C51 COMPILER V8.02 MAIN 12/19/2006 09:36:14 PAGE 4
180 1 do
181 1 Serial_data=RecByte(); /*是前导字节,继续查询*/
182 1
183 1 while(Serial_data==0xfe); /*是前导字节吗?*/
184 1 if(Serial_data!=0x68) /*是帧头吗?*/
185 1 return 0;
186 1 CS+=0x68;
187 1 for(i=0;i<=3;i++) /*接收通讯地址*/
188 1 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -