?? dpramcomm.lst
字號(hào):
C51 COMPILER V7.02b DPRAMCOMM 12/10/2005 20:55:25 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE DPRAMCOMM
OBJECT MODULE PLACED IN DPRamComm.OBJ
COMPILER INVOKED BY: E:\EDATOOLS\KEILC7.0\C51\BIN\C51.EXE DPRamComm.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*****************************************/
2 /* Copyright (c) 2005, 通信工程學(xué)院 */
3 /* All rights reserved. */
4 /* 作 者:戴 佳 */
5 /*****************************************/
6
7 #include "DPRamComm.h"
8
9 /* 40ms定時(shí)中斷服務(wù)子程序:
10 定期更新左端單片機(jī)的狀態(tài)信息,查詢(xún)右端單片機(jī)的狀態(tài)信息*/
11 void timer0_int() interrupt 1 using 1
12 {
13 1 TR0 = 0; // 關(guān)閉T0
14 1 TH0 = 0x70; // 重置40ms定時(shí)器的計(jì)數(shù)初值
15 1 TL0 = 0x00;
16 1 FillState(); // 定期更新左端單片機(jī)狀態(tài)讓右端單片機(jī)可查詢(xún)
17 1 GetState(); // 定期查詢(xún)右端單片機(jī)的狀態(tài)信息
18 1 }
19
20 /* 外部中斷0服務(wù)子程序:
21 設(shè)置中斷標(biāo)志位int0flag,讀清中斷*/
22 void out_int0() interrupt 0 using 1
23 {
24 1 uchar ch;
25 1 int0flag = 1; // 表示外部中斷0,實(shí)際是雙口RAM產(chǎn)生的中斷
26 1
27 1 get_sem(&INTL_SEM); // 申請(qǐng)并獲得左中斷旗語(yǔ)
28 1 ch = DPRAM_INTR; // 讀清中斷
29 1 INTL_SEM = 0x01; // 釋放左中斷旗語(yǔ)
30 1 }
31
32 /* 主程序 */
33 void main()
34 {
35 1 int0flag = 0;
36 1 rdyflag = 0;
37 1 ProvTimes = 0;
38 1
39 1 LpStateRamAddr = 0x2000;
40 1 LpProvRamAddr = 0x2400;
41 1 RpStateRamAddr = 0x3000;
42 1 RpProvRamAddr = 0x3400;
43 1
44 1
45 1 /* 等待右端單片機(jī)準(zhǔn)備就緒 */
46 1 while(rdyflag!=1)
47 1 {
48 2 get_sem(&RP_STT_SEM); // 申請(qǐng)并獲得右端狀態(tài)旗語(yǔ)
49 2 if (*RpStateRamAddr == READY)
50 2 rdyflag = 1; // 右端單片機(jī)準(zhǔn)備就緒標(biāo)志置1
51 2 RP_STT_SEM = 0x01; // 釋放右端狀態(tài)旗語(yǔ)
52 2 }
53 1
54 1 /* 對(duì)右端單片機(jī)進(jìn)行初始配置 */
55 1 InitProvRP();
C51 COMPILER V7.02b DPRAMCOMM 12/10/2005 20:55:25 PAGE 2
56 1
57 1 /* 通過(guò)向左端狀態(tài)空間的第一地址單元寫(xiě)READY向右端表示左端準(zhǔn)備就緒 */
58 1 get_sem(&LP_STT_SEM); // 申請(qǐng)并獲得左端狀態(tài)旗語(yǔ)
59 1 *LpStateRamAddr = READY; // 左端單片機(jī)準(zhǔn)備就緒
60 1 LP_STT_SEM = 0x01; // 釋放左端狀態(tài)旗語(yǔ)
61 1
62 1 ProvTimes++; // 對(duì)右端口的配置次數(shù)加1
63 1
64 1 EA = 1; // 開(kāi)CPU中斷
65 1 EX0 = 1; // 開(kāi)外部中斷0
66 1 ET0 =1; // 開(kāi)T/C0中斷
67 1 PX0 = 0; // 外部中斷低優(yōu)先級(jí)
68 1 PT0 = 1; // 計(jì)數(shù)器高優(yōu)先級(jí)
69 1 TMOD = 0x01; // T/C0工作在方式1
70 1 TH0 = 0x70; // 預(yù)置40ms定時(shí)器的計(jì)數(shù)初值
71 1 TL0 = 0x00;
72 1 TR0 = 0; // 不啟動(dòng)T0
73 1
74 1 /* 右端單片機(jī)接收左端對(duì)其的初始化配置,運(yùn)行正常后觸發(fā)雙口RAM的
75 1 左端中斷,左端單片機(jī)受中斷觸發(fā)后對(duì)右端單片機(jī)作第二次配置,并啟
76 1 動(dòng)40ms定時(shí)器,開(kāi)始定期更新本機(jī)的狀態(tài)信息并監(jiān)測(cè)右端單片機(jī)的狀態(tài) */
77 1 while(int0flag==1)
78 1 {
79 2 if (ProvTimes==1)
80 2 {
81 3 ProvTimes++; // 對(duì)右端口的配置次數(shù)加1
82 3 Prov(); // 對(duì)右端口單片機(jī)二次配置
83 3
84 3 /* 通過(guò)出發(fā)右端中斷,通知右端單片機(jī)接受二次配置*/
85 3 get_sem(&INTR_SEM); // 申請(qǐng)并獲得右中斷旗語(yǔ)
86 3 DPRAM_INTL = 0xFF; // ITNR腳為低,出發(fā)右端單片機(jī)中斷
87 3 INTR_SEM = 0x01; // 釋放右中斷旗語(yǔ)
88 3 }
89 2
90 2 TR0 = 1; // 啟動(dòng)40ms定時(shí)器T0
91 2 }
92 1 }
93
94 /* 申請(qǐng)并獲得旗語(yǔ)函數(shù) */
95 bit get_sem(uchar *sem_type)
96 {
97 1 *sem_type = 0x00; // 申請(qǐng)旗語(yǔ)
98 1 while((*sem_type!=0x00)); // 無(wú)限循環(huán)直至獲得旗語(yǔ)
99 1 return(1);
100 1 }
101
102
103 /* 對(duì)右端單片機(jī)的初始化配置函數(shù):為簡(jiǎn)化起見(jiàn),通過(guò)向左端的配置
104 空間2500H~25FFH全寫(xiě)0x22,表示對(duì)右端單片機(jī)的初始配置命令 */
105 void InitProvRP(void)
106 {
107 1 uchar i;
108 1 get_sem(&LP_PRO_SEM); // 申請(qǐng)左端配置旗語(yǔ)
109 1 for (i=0;i++;i<=255)
110 1 *(LpProvRamAddr+i) = 0x22;
111 1 LP_PRO_SEM = 0x01; // 釋放左端配置旗語(yǔ)
112 1 }
113
114 /* 對(duì)右端單片機(jī)的二次配置函數(shù):為簡(jiǎn)化起見(jiàn),通過(guò)向左端的配置
115 空間2500H~25FFH全寫(xiě)0x33,表示對(duì)右端單片機(jī)的初始配置命令 */
116 void Prov(void)
117 {
C51 COMPILER V7.02b DPRAMCOMM 12/10/2005 20:55:25 PAGE 3
118 1 uchar i;
119 1 get_sem(&LP_PRO_SEM); // 申請(qǐng)左端配置旗語(yǔ)
120 1 for (i=0;i++;i<=255)
121 1 *(LpProvRamAddr+i) = 0x33;
122 1 LP_PRO_SEM = 0x01; // 釋放左端配置旗語(yǔ)
123 1 }
124
125
126 /* 更新本機(jī)狀態(tài)函數(shù):為了簡(jiǎn)化起見(jiàn),此函數(shù)表示為向左端狀態(tài)空
127 間第一地址單元(存放設(shè)備就緒信息)以后的254字節(jié)全寫(xiě)0x44 */
128 void FillState(void)
129 {
130 1 uchar i;
131 1 get_sem(&LP_STT_SEM); // 申請(qǐng)并獲得左端狀態(tài)旗語(yǔ)
132 1 for (i=0;i++;i<=254)
133 1 *(LpStateRamAddr+i+1) = 0x44;
134 1 LP_STT_SEM = 0x01; // 釋放左端狀態(tài)旗語(yǔ)
135 1 }
136
137 /* 查詢(xún)另一端單片機(jī)狀態(tài)函數(shù):為簡(jiǎn)化起見(jiàn),此函數(shù)表示為用數(shù)組
138 ArrayState存取右端狀態(tài)空間第一地址單元(存放設(shè)備就緒信息)
139 以后的254字節(jié)(3001H~30FFH)包含的狀態(tài)信息 */
140 void GetState(void)
141 {
142 1 uchar i;
143 1 get_sem(&RP_STT_SEM); // 申請(qǐng)并獲得右端狀態(tài)旗語(yǔ)
144 1 for (i=0;i++;i<=254)
145 1 ArrayState[i] = *(RpStateRamAddr+i+1);
146 1 RP_STT_SEM = 0x01; // 釋放右端狀態(tài)旗語(yǔ)
147 1 }
148
149
150
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 413 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 254 ----
PDATA SIZE = ---- ----
DATA SIZE = 11 1
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -