📄 0507新从机.lst
字号:
C51 COMPILER V7.50 0507新从籣 05/07/2008 17:57:40 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE 0507新从籣
OBJECT MODULE PLACED IN 0507新从机.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 0507新从机.c BROWSE DEBUG OBJECTEXTEND CODE
line level source
1 #include<REG2051.H>
2 //#include <absacc.h>
3 #include <intrins.h>
4 //#define debug
5 #define uchar unsigned char
6 sbit ANS= P3^3; //抢答按键
7 sbit REQ= P3^4; //发送中断请求。0请求中断
8 sbit LIGHT= P3^7;//从机抢答灯1灭;0亮
9 sbit R_T=P3^5; //控制485接收或发送状态1发送0接收
10
11 #define SETMODE 0X10
12 #define STARTMODE 0X20
13 #define TESTMODE 0X30
14 #define SWAITMODE 0X80
15 #define OVERMODE 0X00
16
17 #define RESETCOMMAND 0X01
18 #define STARTCOMMAND 0X02
19 #define STOPCOMMAND 0X03
20 #define TESTCOMMAND 0X04
21 #define ASKCOMMAND 0X06
22 #define LAMPCOMMAND 0X09
23 #define ANSWERCOMMAND 0XA0
24
25 #define NOP {_nop_();_nop_();_nop_();}
26 //变量定义
27 uchar data SendData[5]={0x7e,0x00,0x00,0x00,0x7f};//向外发送的数据。0x7E+命令+机器编号+数据+0x7F
28 uchar data ReceiveData[5]={0x00,0x00,0x00,0x00,0x00};//接收的数据。0x7E+命令+机器编号+数据+0x7F
29 uchar data mcuWorkState[2]={0x00,0x00}; //从机的工作状态 命令+数据 change可能用不到 删除
30 uchar data bianhao; //机器编号
31 uchar data time_5ms;
32 bit ReceiveEndF=0;//接收命令标志0未接收;1已经接收等待处理。
33 bit key_enable_bit=0; //键盘锁。1响应键盘;0不响应
34 bit key=0;
35 bit ERR;
36
37
38 void iniMCU(void)
39 {
40 1 /*与初始化有关的寄存器
41 1
42 1 计时控制寄存器 TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
43 1 与中断相关 TF1 TF0 IE1 IT1 IE0 IT0
44 1 定时器相关寄存器 //TH0 //TL0 //TH1 //TL1
45 1 计时工作方式 TMOD GATE C/T M1 M0 GATE C/T M1 M0
46 1 中断允许寄存器 IE EA ES ET1 EX1 ET0 EX0
47 1 串口中断寄存器 SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
48 1 中断优先级 IP PS PT1 PX1 PT0 PX0
49 1 特殊功能寄存器 PCON SMOD
50 1 */
51 1 EA=0;
52 1 TMOD=0x21; //置定时器1为方式2,定时器0为方式1
53 1 SCON=0x50; //MODE 1 ,ALLOW RECEIVE
54 1
55 1 TL0=0x00;TH0=0xee;
C51 COMPILER V7.50 0507新从籣 05/07/2008 17:57:40 PAGE 2
56 1 TR0=1; //TCON^4 定时器0开始运行
57 1 ET0=1;
58 1
59 1 TH1=TL1=0x0Fd;//9600 TH1=TL1=0X0FA;//4800
60 1 TR1=1; //定时器1开始运行
61 1
62 1 ES=1; //串口中断允许
63 1 PS=1; //串行通信中断优先级
64 1 TI=0;
65 1 REN=1; //允许串口接收数据
66 1 //TB8=1;//在模式2 和模式3 中将被发送数据的第9 位
67 1 IT0=1; //外部中断0为边沿触发方式。
68 1 IE0=0; //中断请求位清零
69 1 EX0=0;// 禁止int0
70 1 LIGHT=1;
71 1 R_T=0;//接收状态
72 1 ANS=1; //抢答按键
73 1 INT0=1;////中断脚INT0
74 1 REQ=1; //发送中断请求。0请求中断
75 1 EA=1; //IE= 0x80;中断使能
76 1 bianhao=P1&0x0f;
77 1 P1=(~(P1<<4))|0x0f;
78 1 }
79 void delay(uchar Wait_time)
80 {
81 1 uchar i,j;
82 1 for (j=0;j<Wait_time;j++)
83 1 for (i=0; i<250; i++) // 1ms
84 1 _nop_();
85 1 }
86 //发送5字节数据。数据格式见抢答器协议
87 void Send_Data(void)
88 {
89 1 uchar i;
90 1 R_T=1;
91 1 delay(1);
92 1 NOP;
93 1 TI=0;
94 1 for(i=0;i<5;i++)
95 1 {
96 2 SBUF=SendData[i];
97 2 while(TI==0) ;
98 2 TI=0;
99 2 NOP //change
100 2 }
101 1 R_T=0;
102 1 NOP;
103 1 }
104 //接收数据处理
105 void RdataCode(void)
106 {
107 1 uchar i;
108 1 if(ReceiveEndF)
109 1 {
110 2 switch(ReceiveData[1])
111 2 {
112 3 case RESETCOMMAND:
113 3 LIGHT=1;
114 3 NOP
115 3 REQ=1; //关中断请求
116 3 IE0=0;
117 3 EX0=0;//关中断0
C51 COMPILER V7.50 0507新从籣 05/07/2008 17:57:40 PAGE 3
118 3 key_enable_bit=0; //**不响应键盘
119 3 NOP
120 3 key=0; //按键值清零,
121 3 break;
122 3 case ASKCOMMAND://轮询命令(主机响应通讯请求后发给从机要求返回数据的命令)
123 3 if (ReceiveData[2]==bianhao)
124 3 {
125 4 key_enable_bit=0;//不再扫描键盘
126 4 REQ=1;//停止通讯请求
127 4 IE0=0;
128 4 EX0=0;
129 4 SendData[1]=ANSWERCOMMAND;SendData[2]=bianhao;
130 4 if(key) SendData[3]=0x01;
131 4 else SendData[3]=0x00;
132 4 Send_Data();
133 4 }
134 3
135 3 break;
136 3 case STARTCOMMAND://开始抢答
137 3 if (bianhao>7) i= (ReceiveData[2]>>(bianhao-8))&0x01;
138 3 else i=(ReceiveData[3]>>bianhao)&0x01; //判断有无此从机号
139 3 if (i==1)
140 3 {
141 4 REQ=1; //关中断请求
142 4 LIGHT=1; //灯灭
143 4 IE0=0;
144 4 EX0=1;//开中断0
145 4 key_enable_bit=1;//响应键盘
146 4 key=0;
147 4 }
148 3 break;
149 3 case TESTCOMMAND: //测试模式
150 3 if (ReceiveData[2]==bianhao)
151 3 {
152 4 LIGHT=0;
153 4 NOP
154 4 IE0=0;
155 4 EX0=0;//关中断0
156 4 key_enable_bit=1;//响应键盘
157 4 key=0;
158 4 }
159 3 break;
160 3 case LAMPCOMMAND://控制从机灯状态
161 3 REQ=1;
162 3 IE0=0;
163 3 EX0=0;//关中断0
164 3 key_enable_bit=0; //禁止响应键盘
165 3 key=0;
166 3 if (ReceiveData[2]==bianhao)
167 3 {
168 4 if (ReceiveData[3]==0x00)
169 4 { LIGHT=1;NOP }
170 4 else if (ReceiveData[3]==0x01)
171 4 { LIGHT=0; NOP }
172 4 }
173 3 break;
174 3 default:
175 3 break;
176 3 }
177 2 ReceiveEndF=0;
178 2 }
179 1 }
C51 COMPILER V7.50 0507新从籣 05/07/2008 17:57:40 PAGE 4
180
181 //按键处理
182 keycode(void)
183 {
184 1 //根据拨码开关点亮lcd
185 1 bianhao= P1&0x0f;
186 1 if (bianhao<1||bianhao>10)
187 1 {
188 2 ERR=1;
189 2 REQ=1;
190 2 IE0=0;
191 2 EX0=0;//关中断0
192 2 key_enable_bit=0; //禁止响应键盘
193 2 key=0;
194 2 P1=0xf0|0x0f; //黑灯,
195 2 LIGHT=1;
196 2 NOP
197 2 }
198 1 else
199 1 {
200 2 P1=(~(bianhao<<4))|0x0f;
201 2 ERR=0;
202 2 }
203 1 //扫描抢答按键
204 1 if(key_enable_bit&&ERR==0)
205 1 {
206 2 if(!ANS)
207 2 {
208 3 if (time_5ms>10)//延时50ms
209 3 {
210 4 IE0=0;
211 4 EX0=0; //**禁止本机中断
212 4 REQ=0;//通讯请求
213 4 key_enable_bit=0; //按键完成,申请中断,不再扫按键。
214 4 key=1;
215 4 }
216 3 }
217 2 else {time_5ms=0;}
218 2 }
219 1 else {time_5ms=0;}
220 1 //return(0);
221 1 }
222 void main()
223 {
224 1 iniMCU();
225 1 for(;;){
226 2 keycode();
227 2 if (ERR==0) RdataCode();
228 2 }
229 1 }
230
231
232
233
234 //接收中断
235 void int0() interrupt 0 using 1
236 {
237 1 key_enable_bit=0;
238 1 key=0; //**禁止本机键盘
239 1 IE0=0;
240 1 EX0=0;
241 1 }
C51 COMPILER V7.50 0507新从籣 05/07/2008 17:57:40 PAGE 5
242 //接收数据
243 void serial() interrupt 4 using 2
244 {
245 1 if(RI){
246 2 RI=0;
247 2 if(ReceiveEndF==0)
248 2 {
249 3 ReceiveData[0]=ReceiveData[1];
250 3 ReceiveData[1]=ReceiveData[2];
251 3 ReceiveData[2]=ReceiveData[3];
252 3 ReceiveData[3]=ReceiveData[4];
253 3 ReceiveData[4]=SBUF;
254 3 if(ReceiveData[0]==0x7e&&ReceiveData[4]==0x7f)
255 3 {
256 4 if (ReceiveData[1]<ANSWERCOMMAND) //if(((bianhao)==ReceiveData[2]) || ReceiveData[2]==0xff)
257 4 {
258 5 ReceiveEndF=1;
259 5 }
260 4 }
261 3 }
262 2 }
263 1 }
264 void timer0() interrupt 1 using 3
265 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -