?? master485.lst
字號:
C51 COMPILER V7.06 MASTER485 03/28/2005 13:08:45 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MASTER485
OBJECT MODULE PLACED IN master485.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE master485.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //-----------------------函數聲明,變量定義---------------------
2 #include <reg51.h>
3 sbit RE_DE=P1^0;
4 #define COUNT 10 // 定義接收緩沖區大小
5 #define Slaver_NUM 10
6
7 unsigned char bdata flag; //在可位尋址去定義一個標志變量
8 sbit time_over_flag =flag^0; //接收超時標志
9
10 unsigned char buffer[COUNT]; //定義緩沖區
11 unsigned char point; //定義緩沖區位置指示
12
13 unsigned char Slave_AD[Slaver_NUM]; //定義有效地址存放區
14 unsigned char ADD_num; //有效地址個數
15
16 unsigned char idata count_10ms; //用于表示有多少次10ms中斷
17
18 unsigned char idata send_data[7]={
19 0x31,0x32,0x33,0x34,0x35,0x36,0x37}; //與定義發送數據,共7位
20
21 void UART_init(); //串口初始化函數
22 void COM_send(void); //串口接收函數
23 unsigned char CLU_checkdata(void); //計算校驗位函數
24
25 //---------------------------------------------------------------
26 // 函數名稱: UART_init()串口初始化函數
27 // 函數功能: 在系統時鐘為11.059MHZ時,設定串口波特率為9600bit/s
28 // 串口接收中斷允許,發送中斷禁止,設定定時器中斷允許
29 //---------------------------------------------------------------
30 void UART_init()
31 {
32 1 //初始化串行設置
33 1 SCON =0x58; //選擇串口工作方式為1,打開接收允許,TB8=1
34 1 TMOD =0x21; //定時器1工作在方式2,定時器0工作在方式1
35 1 TR1 =1; //啟動定時器T1
36 1 ES=1; //允許串行口中斷
37 1 PS=1; //設計串行口中斷優先級
38 1 //初始化定時器1
39 1 TH1 =0xfd; //實現波特率9600(系統時鐘11.0592MHZ)
40 1 ET1 =0; //定時器1中斷禁止
41 1 }
42 //---------------------------------------------------------------
43 // 函數名稱: timer0_init()初始化定時器0
44 // 函數功能: 設置timer0工作模式
45 //---------------------------------------------------------------
46 void timer0_init()
47 {
48 1 time_over_flag=0;
49 1 count_10ms=0;
50 1 ADD_num=0;
51 1 TL0=0x0F0; //T0用于產生10ms的中斷
52 1 TH0=0x0D8; //50次T0中斷產生1次超時溢出
53 1 ET0=1; //允許定時器0中斷
54 1 }
55 //---------------------------------------------------------------
C51 COMPILER V7.06 MASTER485 03/28/2005 13:08:45 PAGE 2
56 // 函數名稱: system_init()系統初始化
57 // 函數功能: 調用串口、定時器初始化函數,完成系統初始化
58 //---------------------------------------------------------------
59 void system_init(void)
60 {
61 1 //系統總設置
62 1 UART_init();
63 1 timer0_init();
64 1 EA =1; //單片機中斷允許
65 1 }
66 //---------------------------------------------------------------
67 // 函數名稱: com_interrup()串口接收中斷處理函數
68 // 函數功能: 接收包括起始位"S"在內的十位數據到數據緩沖區
69 //---------------------------------------------------------------
70 com_interrupt(void) interrupt 4 using 3
71 {
72 1 unsigned char RECEIVR_buffer;
73 1 if(RI) //處理接收中斷
74 1 {RI=0; //清除中斷標志位
75 2 RECEIVR_buffer=SBUF; //接收串口數據
76 2 if(point==0) //如果還沒有接收到起始位
77 2 {
78 3 if(RECEIVR_buffer==0xFE) //判斷是否起始標志位
79 3 {
80 4 buffer[point++]=RECEIVR_buffer;//把接收到的數據放入接收緩存區
81 4 }
82 3 else
83 3 point=0; //不是,繼續等待起始位
84 3 }
85 2 else if(point>0&&point<10) //判斷是否接收夠十位數據
86 2 buffer[point++]=RECEIVR_buffer; //不夠,把接收到的數據放入接收緩存區
87 2 else if(point==10)
88 2 {
89 3 if(RECEIVR_buffer==0xEF) //判斷結束標志位是否正確
90 3 {
91 4 buffer[point]=RECEIVR_buffer; //把接收到的數據放入接收緩存區
92 4 Slave_AD[ADD_num++]=buffer[2]; //把接收到的地址放到地址存儲器
93 4 //表示該地址有有效設備
94 4 }
95 3 else
96 3 point=0; //不是,繼續等待起始位
97 3 }
98 2 else point=0; //緩沖區已滿,清除緩存區內數據重新接收
99 2 }
100 1 if(TI) //串口發送中斷
101 1 {
102 2 TI=0; //清除發送中斷
103 2 }
104 1 }
105 //---------------------------------------------------------------
106 // 函數名稱: timer0_interrup()
107 // 函數功能:定時器T0中斷服務程序
108 // 函數說明:T0枚10ms中斷一次,連續中斷50次置time_over_flag=1;
109 //---------------------------------------------------------------
110 timer0_interrupt(void) interrupt 1 using 2
111 {
112 1 count_10ms++;
113 1 if(count_10ms==50)
114 1 {
115 2 ET0=0; //關閉定時器T0中斷
116 2 TR0=0; //停止定時器T0
117 2 time_over_flag=1;//設置接收超時標志
C51 COMPILER V7.06 MASTER485 03/28/2005 13:08:45 PAGE 3
118 2 count_10ms=0x00; //10ms計數器復位
119 2 }
120 1 else
121 1 {
122 2 TL0=0x0F0; //重裝定時器初始值
123 2 TH0=0x0D8;
124 2 }
125 1 }
126
127 //---------------------------------------------------------------
128 // 函數名稱: COM_send()串口發送函數
129 // 函數功能: 把數據緩沖區的十位數據發送出去
130 //---------------------------------------------------------------
131 void COM_send(void)
132 {
133 1 RE_DE=1; //設置MAX483進入發送狀態
134 1 for(point=0;point<=10,TI=1;point++) //連續發送十位數據
135 1 //把緩存區的數據都發送到串口
136 1 {
137 2 SBUF=buffer[point];
138 2 TI=0;
139 2 }
140 1 RE_DE=0; //設置MAX483進入接收狀態
141 1
142 1 }
143 //---------------------------------------------------------------
144 // 函數名稱: write_buffer()
145 // 函數功能: 寫發送緩沖區十位數據
146 //---------------------------------------------------------------
147 void write_buffer(unsigned char slaver_add)
148 {
149 1 unsigned char i;
150 1 TB8=1; //打開多機通信方式
151 1 buffer[0]=0xFE;
152 1 buffer[1]=slaver_add;
153 1 for(i=2;i<9;i++) //連續發送十位數據
154 1 //把緩存區的數據都發送到串口
155 1 {
156 2 buffer[i]=send_data[i-2];
157 2 }
158 1 buffer[9]=0xEF;
159 1 }
160
161 //---------------------------------------------------------------
162 // 函數名稱: 主函數
163 // 函數功能: 調度個子函數,完成通信過程
164 //---------------------------------------------------------------
165 void main(void)
166 {
167 1 unsigned char i=0;
168 1 system_init(); //系統初始化
169 1 do{ //查旬0到10好地址有沒有對應設備
170 2 write_buffer(i++); //寫查詢第i號設備的發送信息
171 2 COM_send(); //調用發送函數,完成發送
172 2 timer0_init(); //完成一次查詢,重新初始定時器0,準備下一次查詢
173 2 }
174 1 while(time_over_flag&&i<10);
175 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 252 ----
C51 COMPILER V7.06 MASTER485 03/28/2005 13:08:45 PAGE 4
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 23 ----
IDATA SIZE = 8 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -