📄 main.lst
字号:
C51 COMPILER V7.06 MAIN 03/08/2008 11:03:47 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /******************************************************
2 **说明:此程序为Peli模式自测试程序,需要硬件四个LED,四个按键,
3 ** 当然按键可以不要,LED只用一个也行,只是不够直观。
4 ** 还有本程序是按一次按键,进入接收中断两次,也即是流水灯
5 ** 会流动两次,串口也会收到两次数据,原因未知,看来对CAN的体
6 ** 会还很有限。
7 **作者:桂电飞天鼠
8 **日期:2007。06。04
9 **邮件:mozhenhua211@tom.com
10 **备注:不知道为什么用STC的单片机老是没反应,郁闷~由于本人毕设验收在即,
11 ** 所以暂时没继续寻找原因,待毕设完成再详细探讨。另外按键部分的处理
12 ** 以及SJA的驱动部分感觉十分累赘,编程风格目前正在形成中,望各位前辈
13 ** 指点一下。谢谢!
14 *******************************************************/
15
16 #include <at89x51.h>
17 #include "SJA1000_PELI.h"
18
19 sfr WDT_CONTR = 0xe1;
20
21 #define LED0 P1_0
22 #define LED1 P1_1
23 #define LED2 P1_2
24 #define LED3 P1_3
25
26 #define KEY0 P1_4
27 #define KEY1 P1_5
28 #define KEY2 P1_6
29 #define KEY3 P1_7
30
31 extern bit g_RiFlag;
32
33
34 extern void SJAInit(void);
35 extern bit SJASendData(unsigned char *SendDataBuf);
36 extern bit SJAReceData(unsigned char *ReceiveDataBuf);
37
38 void RS232Init(void);
39 void DelayTime (unsigned char times);
40
41 unsigned char TX[11];
42 unsigned char RX[11];
43
44
45
46 void main(void)
47 {
48 1 unsigned char i;
49 1 unsigned char tempdata;
50 1
51 1 P1 = 0xff;
52 1
53 1
54 1 SJA_RESET = 1; //SJA复位
55 1 DelayTime(50);
C51 COMPILER V7.06 MAIN 03/08/2008 11:03:47 PAGE 2
56 1 SJA_RESET = 0;
57 1 DelayTime(500);
58 1 SJA_RESET=1;
59 1
60 1 RS232Init(); //串口初始化,19200,1停止位,没校验
61 1 SJAInit(); //SJA初始化,自收自发模式,在模式寄存器修改(0x00)
62 1 //WDT_CONTR = 0x3c; //STC单片机的看门狗,喂狗
63 1
64 1 EX0 = 1;
65 1 EA = 1;
66 1
67 1 while(1)
68 1 {
69 2 if (KEY0 ==0) //假如按键KEY0按下,则进入发送
70 2 {
71 3 DelayTime(50);
72 3 if (KEY0 ==0)
73 3 {
74 4 TX[0] = 0x08; //标准帧
75 4 TX[1] = 0xff; //滤波全通
76 4 TX[2] = 0xff;
77 4
78 4 TX[3] = 0xfe; //发送的数据,(在这里为流水灯的花式)
79 4 TX[4] = 0xfd;
80 4 TX[5] = 0xfb;
81 4 TX[6] = 0xf7;
82 4 TX[7] = 0xf7;
83 4 TX[8] = 0xfb;
84 4 TX[9] = 0xfd;
85 4 TX[10] = 0xfe;
86 4
87 4 SJASendData(TX); //把要发送的内容放到SJA的发送缓冲区
88 4 SJARegWrite(0x01,0x10); //启动自收发
89 4 SJARegWrite(0x01,0x02); //中止发送,即为单次发送,按一下,发送一次
90 4 //LED0 = !LED0;
91 4 }
92 3 }
93 2 if (KEY1 ==0)
94 2 {
95 3 DelayTime(50);
96 3 if (KEY1 ==0)
97 3 {
98 4 TX[0] = 0x08;
99 4 TX[1] = 0xff;
100 4 TX[2] = 0xff;
101 4
102 4 TX[3] = 0xf9;
103 4 TX[4] = 0xf6;
104 4 TX[5] = 0xf9;
105 4 TX[6] = 0xf6;
106 4 TX[7] = 0xf9;
107 4 TX[8] = 0xf6;
108 4 TX[9] = 0xf9;
109 4 TX[10] = 0xf6;
110 4
111 4 SJASendData(TX);
112 4 SJARegWrite(0x01,0x10);
113 4 SJARegWrite(0x01,0x02);
114 4 }
115 3 }
116 2 if (KEY2 ==0)
117 2 {
C51 COMPILER V7.06 MAIN 03/08/2008 11:03:47 PAGE 3
118 3 DelayTime(50);
119 3 if (KEY2 ==0)
120 3 {
121 4 TX[0] = 0x08;
122 4 TX[1] = 0xff;
123 4 TX[2] = 0xff;
124 4
125 4 TX[3] = 0xf1;
126 4 TX[4] = 0xf2;
127 4 TX[5] = 0xf4;
128 4 TX[6] = 0xf8;
129 4 TX[7] = 0xf1;
130 4 TX[8] = 0xf2;
131 4 TX[9] = 0xf4;
132 4 TX[10] = 0xf8;
133 4
134 4 SJASendData(TX);
135 4 SJARegWrite(0x01,0x10);
136 4 SJARegWrite(0x01,0x02);
137 4 }
138 3 }
139 2 if (KEY3 ==0)
140 2 {
141 3 DelayTime(50);
142 3 if (KEY3 ==0)
143 3 {
144 4 TX[0] = 0x08;
145 4 TX[1] = 0xff;
146 4 TX[2] = 0xff;
147 4
148 4 TX[3] = 0xfc;
149 4 TX[4] = 0xf9;
150 4 TX[5] = 0xf3;
151 4 TX[6] = 0xf6;
152 4 TX[7] = 0xfc;
153 4 TX[8] = 0xf9;
154 4 TX[9] = 0xf3;
155 4 TX[10] = 0xf6;
156 4
157 4 SJASendData(TX);
158 4 SJARegWrite(0x01,0x10);
159 4 SJARegWrite(0x01,0x02);
160 4 }
161 3 }
162 2
163 2 if (g_RiFlag) //SJA接收中断标志
164 2 {
165 3 g_RiFlag = 0;
166 3 SJAReceData(RX); //将接收到的内容从SJA的接收缓冲区读出
167 3 SJARegWrite(1,0x04); //释放缓冲区
168 3
169 3 for (i=0; i<8; i++) //用四个LED循环显示接收到的八个数据(每个数据只用低四位)
170 3 {
171 4 tempdata = RX[i+3];
172 4 tempdata |= 0xf0; //为了不改变键盘数值,加此句
173 4 P1 =tempdata;
174 4
175 4 SBUF =tempdata; //在显示的同时,也把数据往串口发送
176 4 while(!TI);
177 4 TI = 0;
178 4 DelayTime(80);
179 4 }
C51 COMPILER V7.06 MAIN 03/08/2008 11:03:47 PAGE 4
180 3
181 3 P1 = 0xff;
182 3 }
183 2
184 2 //WDT_CONTR = 0x3c; //STC单片机的喂狗,用S51不用加此句
185 2 }
186 1 }
187
188 void RS232Init(void)
189 {
190 1 SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
191 1 TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
192 1 PCON |= 0x80; //SMOD=1;
193 1 TH1 = 0xFD; //SMOD=1,Baud:19200 fosc=11.0592MHz
194 1 //IE |= 0x90; //Enable Serial Interrupt
195 1 TR1 = 1; // timer 1 run
196 1 }
197
198 void DelayTime (unsigned char times)
199 {
200 1 unsigned char i=0;
201 1 while(times--)
202 1 {
203 2 for(i=0;i<50;i++)
204 2 {;}
205 2 }
206 1 }
207
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 396 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 22 1
IDATA SIZE = ---- ----
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 + -