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