📄 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 {
237 1 SJA_BCANAdr=REG_INTERRUPT; //指针指向中断寄存器
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 + -