📄 main.lst
字号:
C51 COMPILER V7.50 MAIN 12/19/2008 09:53:31 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN Main.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE Main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //本程序为中心机程序,负责轮询室内分机和其它门口机
2 #include "Main.h"
3
4 void main()
5 {
6 1 EA = 0;
7 1 TMOD = 0x21;
8 1 SETTIME1;
9 1 PCON = 0;
10 1 SCON = 0x50; //MOV SCON,#f0H 11位启用RB8 TB8 ;MOV SCON,#50H 10位数据
11 1 T2CON = 0x00;
12 1 T2MOD = 0;
13 1 SETTIME2;
14 1 SETTIME0
15 1 Uart0_Over = 0; //Com0 超时时间(单位毫秒)
16 1 Uart1_Over = 0; //Com1 超时时间(单位毫秒)
17 1 CallTallOver = 0; //呼叫或通话超时时间(单位时秒)
18 1 TmpMs = 0; //临时时间(单位毫秒)
19 1 MsCount = 0; //毫秒计数器
20 1 tmpdata = 0;
21 1 com0_bAck = 0;
22 1 UART_RXD = 1; //收数据初始化为高
23 1 EX0 = 0; //INT0 控制位
24 1 ET0 = 1; //T0 控制位
25 1 ET2 = 1; //T2 控制位
26 1 ES = 1; //串口 控制位
27 1 PX0 = 1; //INT0 优先级
28 1 PT0 = 0; //T0 优先级
29 1 PT2 = 1; //T2 优先级
30 1 PS = 1; //串口 优先级
31 1 SM = 1; //用作停止位
32 1 IT0 = 1; //INT0 为负跳变触发方式 CLR IT0 低电平触发方式
33 1 TR0 = 1; //T0 开关
34 1 TR1 = 1; //T1 开关
35 1 TR2 = 0; //T2 开关
36 1 EA = 1; //总开关
37 1
38 1 //=======================================
39 1 rec_cmd0 = 0x00; //初始化Uart0接收命令
40 1 uart0_status = 2;
41 1 uart1_status = 3;
42 1 com0_bAck = 0;
43 1 com1_bAck = 0;
44 1 bUart0RecSnd = bRecieve;
45 1
46 1 CallTallOver = 0;
47 1 while(CallTallOver < 2);
48 1
49 1 //****************************************************
50 1 //向室内机发上电命令
51 1 /*
52 1 Uart0ToUart1Data[0] = 0; //室内机的第一个地址
53 1 Uart0ToUart1Data[1] = 0x89; //命令
54 1 Uart0ToUart1Data[2] = 1; //要应答
55 1 bUart0ToUart1 = 1; //Uart1要发送这条命令标志
C51 COMPILER V7.50 MAIN 12/19/2008 09:53:31 PAGE 2
56 1 */
57 1 //******************************************************
58 1
59 1 WDT_CONTR=0x3c; //看门狗定时器初始化
60 1 while(true)
61 1 {
62 2 WDT_CONTR=0x3c; //喂狗
63 2 CommUart0(); //Uart0
64 2 CommUart1(); //Uart1
65 2 }
66 1 }
67
68 void CommUart0() //COM0处理程序
69 {
70 1 //uart0_status 01正在向上发送数据 02发送数据完毕 正在接收数据 03接收数据开始 04接收数据完毕 05校验错
71 1 //呼叫通话时间控制,呼叫或通话超时
72 1 if(uart0_status == 0x01) //向门口机回应数据 超时出错
73 1 {
74 2 if(Uart0_Over > OverMs)
75 2 {
76 3 Uart0_Over = 0; //正在等待数据
77 3 bUart0RecSnd = bRecieve;
78 3 rec_bHead0 =0;
79 3 }
80 2 return;
81 2 }else if(uart0_status ==0x02 && Uart0_Over > OverMs) //发送数据完成没有接收数据
82 1 {
83 2 Uart0_Over = 0; //正在等待数据
84 2 bUart0RecSnd = bRecieve;
85 2 rec_bHead0 = 0;
86 2 return;
87 2 }else if(uart0_status == 0x03 && Uart0_Over > OverMs) //正在接收数据,超时处理 长度错误
88 1 {
89 2 //数据复位
90 2 rec_cmd0 = 0x00; //清除收到的命令
91 2 uart0_status = 0x02; //状态复位
92 2 rec_bHead0 = 0x00; //从新接收数据
93 2 bUart0RecSnd = bRecieve;
94 2 return;
95 2 }else if(uart0_status ==0x05)//效验错误
96 1 {//数据复位
97 2 rec_cmd0=0x00;
98 2 uart0_status = 0x02;
99 2 rec_bHead0 = 0x00; //重新接收数据
100 2 bUart0RecSnd = bRecieve;
101 2 return;
102 2 }
103 1
104 1 if(uart0_status != 0x04) //没有收到数据或者没有收完数据
105 1 return;
106 1
107 1 bUart0RecSnd = bSend; //发送状态
108 1
109 1
110 1 //用上发命令和向门口机返回命令
111 1 if(rec_cmd0 == LAddr) //轮询本机命令
112 1 {
113 2
114 2 }else if(rec_cmd0 == 0xA1) //应答本机命令
115 1 {
116 2 //等待下一个数据包
117 2 bUart0Ask = false;
C51 COMPILER V7.50 MAIN 12/19/2008 09:53:31 PAGE 3
118 2 //不需要重发
119 2 bUart0ReSnd = false;
120 2 }else if(rec_cmd0==0xB7)
121 1 {
122 2
123 2 }else if (uart0_status==0x05) // 接收数据校验错
124 1 {
125 2
126 2 }else //接收完成
127 1 {
128 2
129 2 }
130 1
131 1 if (bTaskUart0) //Uart0本身有请求
132 1 {
133 2 SndUart0[0] = Uart0Data[0]; //数据长度
134 2 SndUart0[1] = Uart0Data[1]; //命令
135 2 SndUart0[2] = Uart0Data[2]; //本机地址
136 2 SndUart0[3] = Uart0Data[3]; //室内机地址
137 2 SndUart0[4] = Uart0Data[4]; //是否有后继数据
138 2 SndUart0[5] = 0xCC^SndUart0[0]^SndUart0[1]^SndUart0[2]^SndUart0[3]^SndUart0[4];
139 2 com0_bAck = Uart0Data[5]; //是否应答
140 2 bTaskUart0 = false;
141 2 bUart0ReSnd = true; //如果没有反回,要重发
142 2 Uart0Nums = 0;
143 2 } else if(bUart1ToUart0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -