📄 main.lst
字号:
C51 COMPILER V7.50 MAIN 09/30/2006 21:59:31 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN MAIN.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SRC\MAIN.C BROWSE DEBUG OBJECTEXTEND PRINT(.\MAIN.lst) OBJECT(MAIN.obj)
line level source
1 /******************************************
2 STC 单片机开发程序。V0_1_1
3 //在KEIL uVision3中,如有不清楚的函数封装,选中后点右键,选择“GO TO Ddfinition Of 'XXXXXX'“
4 //可以看到该函数的原形。
5
6 //create by changshengwuji
7 //email: netspider@163.com
8 //qq: 450353168
9 //2006.05.03
10 ********************************************************************/
11
12 //5a 55 a2 51 read addr
13 //5a 10 a5 0f read integer t
14 //5a 10 a3 0d read tp
15 //5a 10 a6 10 shut
16 //5a 10 a7 11 open
17 //5a 10 a1 0b modify addr
18
19 #include "../inc/MCS_X51.H"
20 #include "../inc/hardmap.h"
21 #include "../inc/MCS_X51LIB.H"
22 #include "../inc/DS18B20.H"
23
24 #include "../inc/stc_flash.H"
25
26 #define EXT_11M 1 //外部11.0592MHz晶体
27 //#define EXT_1M 1 //外部输入时钟1Mhz
28 #define UART_ERR 0XEE
29 #define UART_SUC 0XA0
30 //------上位机命令---------------
31 #define SET_ADDR 0XA1 //设置本机地址
32 #define READ_ADDR 0XA2 //读取本机地址
33 #define READ_T 0XA3 //读取温湿度
34 #define HEAT 0XA4 //加热命令
35 #define READ_S 0XA5 //READ SHORT TEMPERATURE
36 #define SHUT 0XA6 //关
37 #define OPEN 0XA7 //开
38 #define TEST 0XA0 //TEST CODE
39
40 #define HEAD 0X5A //帧头
41 #define ADDR 0X10 //默认本机地址
42
43 #define ERR_ADDR 0XE1 //设置地址错误应答
44 #define ERR_VERI 0XE2 //上位机发送的数据校验和不对应答。
45 #define ERR_TH 0XE3 //本机读取温湿度时出错应答。即后面的数据不可靠
46
47 #define SUCC_ADDR 0XF1 //设置地址成功应答
48 #define SUCC_TH 0XF2 //表示温湿度读数正确。
49 #define ASK 0XF8 //应答
50 #define SYS_ADDR 0XAA //系统标志,表示该机的地址已经设置。
51 #define RA_FLAG 0X55 //上位机读本机地址时,在地址位发送该标志。
52
53 #define TIMING_5MS 0XEE00 //TIMING 5MS @ 11.0592MHz
54 #define TIMING_10MS 0XDC00 //TIMING 10MS @ 11.0592MHz
55 #define NUM_SEG 3 // 数码管个数
C51 COMPILER V7.50 MAIN 09/30/2006 21:59:31 PAGE 2
56
57 //*******************************************************************
58 //------------uart------------------------------
59 bit bit_ut_start = 0;
60 bit bit_ut_over = 0;
61
62 //----------ds18b20-------------------------------
63 bit bit_tpsensor = 0;
64 //-----------IAP---------------------------------------
65 bit bit_iap = 0;
66 bit bit_10ms = 0;
67 bit bit_100ms = 0;
68 bit bit_1s = 0;
69 bit bit_400ms = 0;
70
71 bit bit_10ms_over = 0;
72 bit bit_400ms_over = 0;
73
74 data UINT8 t0_10ms = 0;
75 data UINT8 t0_400ms = 0;
76
77
78 data UINT8 disbuff[3]; //显示缓冲,存放查找后的段码
79 data UINT8 buffer[10]; //uart buffer
80 data UINT8 seg_num = 0; //数码管点亮顺序
81 data UINT8 dabuff[10]; //数据缓冲
82 data UINT8 machine_addr; //local address
83 //---------------温度 ----------------
84 data SINT16 tp;
85 data SINT8 t ;
86
87
88 bit bit_disp; //显示标志
89 bit bit_relay;
90 UINT8 ut_num=0;
91 //code UINT8 table[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
92 code UINT8 table[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
93
94
95 void relay_os(bit bit_con);
96 //********************************************************************
97 void cpu_init()
98 {
99 1 relay_os(0);
100 1 INT_GLOBAL(0);
101 1 INT_T1(0);
102 1 INT_T0(0);
103 1 INT_UART(0);
104 1
105 1 P1 = 0xff;
106 1 P3 = 0xff;
107 1 setup_timer(T1_START_BY_TR | T1_TIMER | T1_MODE_2 | T0_START_BY_TR | T0_TIMER | T0_MODE_1);
108 1 #ifdef STC_12X2052X //定义使用STC12C2052单片机。
#ifdef EXT_1M //外部1MHz时钟
SET_T0_DIV_BY_1; //timer0/timer1 定时器的时钟直接使用外部时钟。不做分频
SET_T1_DIV_BY_1;
set_timer1(0xF3F3); //设置波特率4800
UART_RATE_MUL; //波特率翻倍
#endif
#endif
116 1
117 1 #ifdef EXT_11M //使用STC89C51单片机。11059200晶振
C51 COMPILER V7.50 MAIN 09/30/2006 21:59:31 PAGE 3
118 1 //set_timer1(0xFDFD); //9600
119 1 set_timer1(0xFAFA); //4800
120 1 #endif
121 1 T1_START;
122 1 setup_uart(UART_MODE_1); //UART工作于模式1
123 1 ENABLE_UART_RCV;
124 1
125 1
126 1 bit_iap = flsh_sector_rd(EEP_SECTOR1,2,dabuff);
127 1 if(!bit_iap)
128 1 flsh_sector_rd(EEP_SECTOR1,2,dabuff);
129 1 if(buffer[0] == SYS_ADDR)
130 1 {
131 2 machine_addr = dabuff[1];
132 2 }
133 1 else
134 1 machine_addr = ADDR;
135 1
136 1 set_timer0(TIMING_5MS);
137 1 T0_START;
138 1 INT_GLOBAL(1);
139 1 INT_UART(1);
140 1 INT_T0(1);
141 1 WDT_DIV_BY_128;
142 1 WDT_ENABLE;
143 1 WDT_CLR;
144 1 }
145
146 /*********************************************************************
147 /串口中断服务程序
148 //处理串口接收中断,对于发送中断不作处理
149 ***********************************************************************/
150 void uart_service() interrupt 4 using 1
151 {
152 1 UINT8 tmp;
153 1 if(RI)
154 1 UART_RIIF_CLR ;
155 1 else
156 1 return;
157 1
158 1 tmp = rd_uart();
159 1 if(!bit_ut_start)
160 1 {
161 2 if(tmp == HEAD)
162 2 {
163 3 bit_ut_start = 1;
164 3 bit_ut_over = 0;
165 3 ut_num = 0;
166 3 }
167 2 }
168 1 else
169 1 {
170 2 buffer[ut_num] = rd_uart();
171 2 ut_num++;
172 2 /*
173 2 if(ut_num == 1)
174 2 {
175 2 if((buffer[0] != machine_addr) && (buffer[0] !=RA_FLAG)) //地址不符
176 2 { //且地址不等于RA_FLAG.退出。RA_FLAG是读本机地址标志
177 2 ut_num = 0;
178 2 bit_ut_start = 0;
179 2 return;
C51 COMPILER V7.50 MAIN 09/30/2006 21:59:31 PAGE 4
180 2 }
181 2 } */
182 2 if(ut_num == 3)
183 2 {
184 3 bit_ut_over = 1 ; //接收完毕一帧数据
185 3 bit_ut_start = 0; //接着重新开始接收
186 3 ut_num = 0;
187 3 }
188 2 }
189 1 }
190 //----------------------------------------------------------------
191 void relay_os(bit bit_con)
192 {
193 1 if(bit_con)
194 1 {
195 2 con1=0;
196 2 con2=1;
197 2 bit_relay = 1;
198 2 }
199 1 else
200 1 {
201 2 con1 = 1;
202 2 con2 = 0;
203 2 bit_relay = 0;
204 2 }
205 1 delay_10clk(10000); //30~40ms
206 1 con1=0;
207 1 con2=0;
208 1 }
209 /*********************************************************************
210 使用ULN2003或者2803驱动,8位并口,输出反相。驱动电流200mA
211 每个数码管用一个驱动器。驱动器的控制端使用p1口。p1口留上拉位置。
212 扫描信号由p0口产生,使用上拉,驱动4953.
213
214 *********************************************************************/
215
216 void display()
217 {
218 1 SEG_DRV = 0Xf8; //SHUT LED
219 1 seg_num++;
220 1 if((seg_num>=3) )
221 1 {
222 2 seg_num = 0;
223 2 SEG_DRV = 0xf9;
224 2 }
225 1 else
226 1 {
227 2 SEG_DRV = 0XF8 + (seg_num<<1);
228 2 }
229 1
230 1 SEG_PARA = disbuff[seg_num];
231 1 }
232
233 /*********************************************************************/
234 void t0_service() interrupt 1 using 2
235 {
236 1 set_timer0(TIMING_5MS);
237 1 if(bit_disp)
238 1 {
239 2 display();
240 2 }
241 1 if(bit_10ms)
C51 COMPILER V7.50 MAIN 09/30/2006 21:59:31 PAGE 5
242 1 {
243 2 t0_10ms++;
244 2 if(t0_10ms >= 3)
245 2 {
246 3 bit_10ms_over = 1;
247 3 bit_10ms = 0;
248 3 t0_10ms = 0;
249 3 }
250 2 }
251 1 if(bit_400ms)
252 1 {
253 2 t0_400ms++;
254 2 if(t0_400ms >= 80)
255 2 {
256 3 bit_400ms_over = 1;
257 3 bit_400ms = 0;
258 3 t0_400ms = 0;
259 3 }
260 2 }
261 1 }
262
263
264
265 /**********************************************************************/
266
267 /********************************************************************
268 //
269 //通过串口,输出一帧数据到pc机
270 //参数:输出数据的缓冲地址,输出数据的长度,不包括校验和、帧头等。
271 //发送数据的格式:帧头+本机地址+数据长度+数据包+校验和
272
273 *********************************************************************/
274 void mcu2pc(UINT8 *p,UINT8 l)
275 {
276 1 UINT8 i,tmp;
277 1 en485 = 0; //485发送使能
278 1 delay_7clk(2);
279 1 uart_putc(HEAD);
280 1 uart_putc(machine_addr);
281 1 uart_putc(l); //数据长度。
282 1 tmp = HEAD + machine_addr + l;
283 1 for(i = 0;i<l ;i++)
284 1 {
285 2 uart_putc(*p); //p指向要发送的数据
286 2 tmp = tmp + *p;
287 2 p++;
288 2 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -