📄 main.lst
字号:
C51 COMPILER V7.06 MAIN 03/16/2005 16:48:06 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE main.c BROWSE NOAREGS DEBUG OBJECTEXTEND
stmt level source
1 #include "main.h"
2
3 /******************************
4 微控电子 www.mcuc.cn
5 modbus RTU 的C51程序
6 单片机89S52
7 通信波特率 9600 8位数据 1位停止位 偶校验 485通位接口
8 单片机控制板地址 localAddr(变量)
9 通信可设置数据的地址:
10 字地址 0 - 255 (只取16位的低8位)
11 位地址 0 - 255 (只取16位的低8位)
12 *******************************/
13
14 uint32 dwTickCount,dwIntTick; //时钟
15 uint8 idata sendBuf[16],receBuf[16]; //发送接收缓冲区
16 uint8 idata checkoutError; // ==2 偶校验错
17 uint8 idata receTimeOut; //接收超时
18 uint8 idata c10ms; //10ms 计时
19 bit b1ms,bt1ms,b10ms,bt10ms,b100ms,bt100ms; //定时标志位
20
21 // 串行中断程序
22 void commIntProc() interrupt 4
23 {
24 1 if(TI)
25 1 {
26 2 TI = 0;
27 2 if(sendPosi < sendCount)
28 2 {
29 3 sendPosi++;
30 3 ACC = sendBuf[sendPosi];
31 3 TB8 = P; //加上校验位
32 3 SBUF = sendBuf[sendPosi];
33 3 }
34 2 else
35 2 {
36 3 b485Send = 0; //发送完后将485置于接收状态
37 3 receCount = 0; //清接收地址偏移寄存器
38 3 checkoutError = 0;
39 3 }
40 2 }
41 1 else if(RI)
42 1 {
43 2 RI = 0;
44 2 receTimeOut = 10; //通讯超时值
45 2 receBuf[receCount] = SBUF;
46 2 ACC = receBuf[receCount];
47 2 if(P != RB8)
48 2 checkoutError = 2; //偶校验出错
49 2 receCount++; //接收地址偏移寄存器加1
50 2 receCount &= 0x0f; //最多一次只能接收16个字节
51 2 }
52 1
53 1 } // void CommIntProc()
54
55 //定时器0 1ms 中断
C51 COMPILER V7.06 MAIN 03/16/2005 16:48:06 PAGE 2
56 void timer0IntProc() interrupt 1
57 {
58 1 TL0 = TIMER_LOW;
59 1 TH0 = TIMER_HIGHT;
60 1 dwIntTick++;
61 1 bt1ms = 1;
62 1 c10ms++;
63 1 if(c10ms >= 10)
64 1 {
65 2 c10ms = 0; //10ms计时器清零
66 2 bt10ms = 1;
67 2 }
68 1 } // void Timer0IntProc()
69
70 //外部中断0
71 void intEx0Proc(void) interrupt 0
72 {
73 1
74 1 }
75
76 //计数器1中断
77 void counter1IntProc(void) interrupt 3 using 1
78 {
79 1
80 1 }
81
82
83 //定时处理
84 void timeProc(void)
85 {
86 1 static uint8 c200ms;
87 1
88 1 bWatchDog = ~ bWatchDog; //看门狗取反
89 1 b1ms = 0;
90 1 b10ms = 0;
91 1 b100ms = 0;
92 1
93 1 ET0 = 0;
94 1 dwTickCount = dwIntTick;
95 1 ET0 = 1;
96 1
97 1 if(bt1ms)
98 1 {
99 2 bt1ms = 0;
100 2 b1ms = 1;
101 2
102 2 if(receTimeOut>0)
103 2 {
104 3 receTimeOut--;
105 3 if(receTimeOut==0 && receCount>0) //判断通讯接收是否超时
106 3 {
107 4 b485Send = 0; //将485置为接收状态
108 4 receCount = 0; //将接收地址偏移寄存器清零
109 4 checkoutError = 0;
110 4 }
111 3 }
112 2 }
113 1
114 1 if(bt100ms)
115 1 {
116 2 bt100ms = 0;
117 2 b100ms = 1;
C51 COMPILER V7.06 MAIN 03/16/2005 16:48:06 PAGE 3
118 2 }
119 1 if(bt10ms) //判断中断10ms标志位是否1
120 1 {
121 2 bt10ms = 0; //清中断10ms标志位
122 2 b10ms = 1;
123 2
124 2 c200ms++; //200ms计时器加1
125 2 if(c200ms >= 20) //判断是否计时到200ms
126 2 {
127 3 c200ms = 0; //清200ms计时器
128 3 bRunLED = ~bRunLED; //取反运行指示灯
129 3 }
130 2 }
131 1 } // void TimerProc(void)
132
133 //初始化串口
134 void initUart(void)
135 {
136 1 //T2 用于波特率 9600
137 1 T2CON = 0x30;
138 1 RCAP2H = 0xff;
139 1 RCAP2L = 0xb8;
140 1 TR2 = 1;
141 1
142 1 //偶校验
143 1 SCON = 0xd0;
144 1 PCON = 0;
145 1 ES = 1;
146 1 }//void initUart(void)
147
148 //初始化中断
149 void initInt(void)
150 {
151 1 TMOD = 0x51;
152 1 TH0 = TIMER_HIGHT;
153 1 TL0 = TIMER_LOW;
154 1 TR0 = 1;
155 1 ET0 = 1;
156 1 TH1 = 0; //9600
157 1 TL1 = 0;
158 1 TR1 = 0; //定时器1用于计数定时器2用于波特
159 1 ET1 = 1;
160 1 //PT1 = 1;
161 1
162 1 IT0 = 1;
163 1 IT1 = 1;
164 1 EX0 = 0;
165 1 PX0 = 1;
166 1 EX1 = 0;
167 1
168 1 initUart();
169 1
170 1 EA = 1;
171 1 } // void initInt(void)
172
173 //初始化
174 void initProg(void)
175 {
176 1 initInt();
177 1 b485Send = 0;
178 1 }
179
C51 COMPILER V7.06 MAIN 03/16/2005 16:48:06 PAGE 4
180 void main(void)
181 {
182 1 initProg();
183 1
184 1 while(1)
185 1 {
186 2 timeProc();
187 2 checkComm0Modbus();
188 2 }
189 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 313 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 9 ----
IDATA SIZE = 35 ----
BIT SIZE = 6 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -