?? main.lst
字號:
C51 COMPILER V8.02 MAIN 07/24/2007 14:50:26 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: d:\program files\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <P8XC5X2.H>
2 #include <intrins.H>
3 #include "sja_bcanconf.h"
4 #include "X5045.h"
5 sbit io=P2^6;
6 /*CAN通信定義*/
7 volatile unsigned char bdata flag_init; //保存中斷寄存器值
8 sbit rcv_flag=flag_init^0; //接收中斷標志
9 sbit err_flag=flag_init^2; //錯誤中斷標志
10 unsigned char SendBuf[6]; //CAN發送緩沖區
11 unsigned char SampleHVal[8],SampleLVal[8]; //模擬量采集結果
12 #define BaseID 0
13 #define RTR 0
14 #define DLC 4
15
16 #define V_T1s 255 //1秒
17 #define V_T1m 20
18 #define V_T50ms 10 //100ms
19 #define V_TH0 0xEA /*10ms ,!notice: crystal 24MHz */
20 #define V_TL0 0x00
21
22 #define TERMINAL 0x00 //主機命令CAN通信標識兼功能碼
23
24 volatile unsigned char CanID; //當前CAN節點的標識
25 void LedTest()
26 {
27 1 static char led=1;
28 1 led=!led;
29 1 io=led;
30 1 }
31 void InitWtd()
32 {
33 1 wren_dog(); //看門狗寫使能
34 1 wrsr_dog(0x03); //看門狗周期1.4秒
35 1 wrdi_dog(); //看門狗寫禁止
36 1 }
37 void FeedDog()
38 {
39 1 rest_dog();
40 1 }
41 void delayUs()
42 {
43 1 _nop_();
44 1 }
45
46 void delayMs(unsigned char a)
47 {
48 1 unsigned char i, j;
49 1 for(i = a; i > 0; i--)
50 1 for(j = 100; j > 0; j--);
51 1 }
52
53 /**//*****************************DS18B20*******************************/
54 sbit ds = P1^0;
55 //初始化DS18B20
C51 COMPILER V8.02 MAIN 07/24/2007 14:50:26 PAGE 2
56 //讓DS18B20一段相對長時間低電平, 然后一段相對非常短時間高電平, 即可啟動
57 void dsInit()
58 {
59 1 //對于11.0592MHz時鐘, unsigned int型的i, 作一個i++操作的時間大于為8us
60 1 unsigned char i;
61 1 ds = 0;
62 1 i = 100; //拉低約800us, 符合協議要求的480us以上
63 1 while(i>0) i--;
64 1 ds = 1; //產生一個上升沿, 進入等待應答狀態
65 1 i = 5;
66 1 while(i>0) i--;
67 1 }
68
69 void dsWait()
70 {
71 1 unsigned char i;
72 1 while(ds)FeedDog();
73 1 while(~ds)FeedDog(); //檢測到應答脈沖
74 1 //LedTest();
75 1 i = 4;
76 1 while(i > 0) i--;
77 1 }
78
79 //向DS18B20讀取一位數據
80 //讀一位, 讓DS18B20一小周期低電平, 然后兩小周期高電平,
81 //之后DS18B20則會輸出持續一段時間的一位數據
82 bit readBit()
83 {
84 1 unsigned char i;
85 1 bit b;
86 1 ds = 0;
87 1 i++; //延時約8us, 符合協議要求至少保持1us
88 1 ds = 1;
89 1 i++; i++; //延時約16us, 符合協議要求的至少延時15us以上
90 1 b = ds;
91 1 i = 10;
92 1 while(i>0) i--; //延時約64us, 符合讀時隙不低于60us要求
93 1 return b;
94 1 }
95
96 //讀取一字節數據, 通過調用readBit()來實現
97 unsigned char readByte()
98 {
99 1 unsigned char i;
100 1 unsigned char j, dat;
101 1 dat = 0;
102 1 for(i=0; i<8; i++)
103 1 {
104 2 j = readBit();
105 2 //最先讀出的是最低位數據
106 2 dat = (j << 7) | (dat >> 1);
107 2 }
108 1 return dat;
109 1 }
110
111 //向DS18B20寫入一字節數據
112 void writeByte(unsigned char dat)
113 {
114 1 unsigned char i;
115 1 unsigned char j;
116 1 bit b;
117 1 for(j = 0; j < 8; j++)
C51 COMPILER V8.02 MAIN 07/24/2007 14:50:26 PAGE 3
118 1 {
119 2 b = dat & 0x01;
120 2 dat >>= 1;
121 2 //寫"1", 將DQ拉低15us后, 在15us~60us內將DQ拉高, 即完成寫1
122 2 if(b)
123 2 {
124 3 ds = 0;
125 3 i++; i++; i++; //拉低約16us, 符號要求15~60us內
126 3 ds = 1;
127 3 i = 10; while(i>0) i--; //延時約64us, 符合寫時隙不低于60us要求
128 3 }
129 2 else //寫"0", 將DQ拉低60us~120us
130 2 {
131 3 ds = 0;
132 3 i = 10; while(i>0) i--; //拉低約64us, 符號要求
133 3 ds = 1;
134 3 i++; i++; //整個寫0時隙過程已經超過60us, 這里就不用像寫1那樣, 再延時64us了
135 3 }
136 2 }
137 1 }
138
139 //向DS18B20發送溫度轉換命令
140 void sendChangeCmd()
141 {
142 1 dsInit(); //初始化DS18B20, 無論什么命令, 首先都要發起初始化
143 1 dsWait(); //等待DS18B20應答
144 1 delayMs(1); //延時1ms, 因為DS18B20會拉低DQ 60~240us作為應答信號
145 1 writeByte(0xcc); //寫入跳過序列號命令字 Skip Rom
146 1 writeByte(0x44); //寫入溫度轉換命令字 Convert T
147 1 }
148
149 //向DS18B20發送讀取數據命令
150 void sendReadCmd()
151 {
152 1 dsInit();
153 1 dsWait();
154 1 delayMs(1);
155 1 writeByte(0xcc); //寫入跳過序列號命令字 Skip Rom
156 1 writeByte(0xbe); //寫入讀取數據令字 Read Scratchpad
157 1 }
158
159 //獲取當前溫度值
160 void getTmpValue()
161 {
162 1 sendReadCmd();
163 1 //連續讀取兩個字節數據
164 1 SampleLVal[0] = readByte();
165 1 SampleHVal[0] = readByte();
166 1 //if(SampleHVal[0]==0xFF)LedTest();
167 1 }
168 /**//*****************************DS18B20*******************************/
169 void InitCPU()
170 {
171 1 EX0 =1;
172 1 PX0 =1;
173 1 }
174 void CheckCan()
175 {
176 1 if(rcv_flag) //if there is receive charerrupt
177 1 {
178 2 }
179 1 if(err_flag)
C51 COMPILER V8.02 MAIN 07/24/2007 14:50:26 PAGE 4
180 1 {
181 2 EA=0;
182 2 err_flag=0; //錯誤標志位清零
183 2 Config_SJA(); //初始化SJA
184 2 EA=1;
185 2 }
186 1 }
187 void SendByCan()
188 {
189 1 SendBuf[0]=TERMINAL; //主機標識
190 1 SendBuf[1]=0x00|DLC; //標識低3位和RTR以及請求數據位數
191 1 SendBuf[2]=CanID; //本地CAN標識
192 1 SendBuf[3]=0; //第i路遙測值
193 1 SendBuf[4]=SampleLVal[0]; //遙測低字節值
194 1 SendBuf[5]=SampleHVal[0]; //遙測高字節值
195 1 BCAN_DATA_WRITE(SendBuf);
196 1 BCAN_CMD_PRG(TR_CMD);
197 1 }
198 void InitCanID()
199 {
200 1 //讀入P2口狀態,其中0~3為跳線設置
201 1 CanID=~P2;
202 1 CanID&=0x0f;
203 1 CanID|=0x80;
204 1 }
205
206 void main()
207 {
208 1 InitCanID(); //計算當前節點的CAN標識
209 1 Config_SJA(); //CAN初始化,SJA1000配置
210 1 InitCPU(); //CPU初始化
211 1 P3_4=0;
212 1 P1=0;
213 1 InitWtd(); //看門狗電路初始化
214 1 sendChangeCmd();
215 1 while(1)
216 1 {
217 2 CheckCan();
218 2 delayMs(255); //溫度轉換時間需要750ms以上
219 2 FeedDog();
220 2 delayMs(255);
221 2 delayMs(255);
222 2 FeedDog();
223 2 delayMs(255);
224 2 delayMs(255);
225 2 FeedDog();
226 2 delayMs(255);
227 2 delayMs(255);
228 2 getTmpValue();
229 2 SendByCan();
230 2 //LedTest();
231 2 sendChangeCmd();
232 2 FeedDog();
233 2 }
234 1 }
235 void SJA_INTR() interrupt 0 using 1
236 {
238 1 flag_init=*SJA_BCANAdr; //保持中斷寄存器值
239 1 }
C51 COMPILER V8.02 MAIN 07/24/2007 14:50:26 PAGE 5
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 375 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 25 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -