📄 cdle-j20_main.lst
字号:
C51 COMPILER V7.01 CDLE_J20_MAIN 07/06/2003 22:51:48 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE CDLE_J20_MAIN
OBJECT MODULE PLACED IN CDLE-J20_Main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE CDLE-J20_Main.c BROWSE DEBUG OBJECTEXTEND TABS(2)
stmt level source
1 /*----------------------------------------
2 CDLE-J20_Main.c
3
4 20个继电器控制电路
5 用I/O口20线加三极管驱动20个继电器
6
7
8 Copyright 2003 http://cdle.yeha.net
9 http://cdle.126.com
10 All rights reserved.
11 明浩 E-mail: pnzwzw@163.com
12 ----------------------------------------*/
13
14 #include <AT89X51.h>
15
16 static unsigned char data CN[4];
17 static unsigned char data CT;
18 unsigned char code TS[8] = {1,2,4,8,16,32,64,128};
19
20 void main(void)
21 {
22 1 void InitCom(unsigned char BaudRate);
23 1 void ComOutChar(unsigned char OutData);
24 1 void CSToOut(void);
25 1 void CNToOut(void);
26 1 unsigned int a;
27 1
28 1 P0 = 0;
29 1 P1 = 0;
30 1 P2 = 0; //IO口清零
31 1 CT = 0; //接收字符序列
32 1 CN[1] = 0;
33 1 CN[2] = 51;
34 1 CN[3] = 51;
35 1 CN[4] = 0;
36 1 InitCom(6); //设置波特率为9600 1-8波特率300-57600
37 1 EA = 1;
38 1 ES = 1; //开串口中断
39 1 do
40 1 {
41 2 for (a=0; a<30000; a++)
42 2 P3_6 = 1;
43 2 for (a=0; a<30000; a++) //指示灯闪动
44 2 P3_6 = 0;
45 2 }
46 1 while(1);
47 1 }
48
49
50 //串口初始化 晶振为11.0592M 方式1 波特率300-57600
51 void InitCom(unsigned char BaudRate)
52 {
53 1 unsigned char THTL;
54 1 switch (BaudRate)
55 1 {
C51 COMPILER V7.01 CDLE_J20_MAIN 07/06/2003 22:51:48 PAGE 2
56 2 case 1: THTL = 64; break; //波特率300
57 2 case 2: THTL = 160; break; //600
58 2 case 3: THTL = 208; break; //1200
59 2 case 4: THTL = 232; break; //2400
60 2 case 5: THTL = 244; break; //4800
61 2 case 6: THTL = 250; break; //9600
62 2 case 7: THTL = 253; break; //19200
63 2 case 8: THTL = 255; break; //57600
64 2 default: THTL = 208;
65 2 }
66 1 SCON = 0x50; //串口方式1,允许接收
67 1 TMOD = 0x20; //定时器1定时方式2
68 1 TCON = 0x40; //设定时器1开始计数
69 1 TH1 = THTL;
70 1 TL1 = THTL;
71 1 PCON = 0x80; //波特率加倍控制,SMOD位
72 1 RI = 0; //清收发标志
73 1 TI = 0;
74 1 TR1 = 1; //启动定时器
75 1 }
76
77 //向串口输出一个字符(非中断方式)
78 void ComOutChar(unsigned char OutData)
79 {
80 1 SBUF = OutData; //输出字符
81 1 while(!TI); //空语句判断字符是否发完
82 1 TI = 0; //清TI
83 1 }
84
85 //串口接收中断
86 void ComInINT(void) interrupt 4 using 1
87 {
88 1 if (RI) //判断是不是收完字符
89 1 {
90 2 if (CT>3)
91 2 {
92 3 CT = 0; //收完一组数据,序列指针清零
93 3 CN[0] = 0;
94 3 CN[1] = 51;
95 3 CN[2] = 51;
96 3 CN[3] = 0;
97 3 }
98 2 CN[CT] = SBUF;
99 2 CT++;
100 2 RI = 0; //RI清零
101 2 if (CN[0]==0x61 && CN[3]==0x61) //用aXXa的简单方式保证接收的可靠性,可以满足要求
102 2 {
103 3 CSToOut(); //收到的数据格式正确时,调用控制输出函数
104 3 }
105 2 }
106 1 }
107
108 //根据全局变量输出相应的控制信号
109 void CSToOut(void)
110 {
111 1 unsigned char data a;
112 1 unsigned int data b;
113 1 switch(CN[1]) //aXXa的格式定义是第一个X为端口0为P2,1为P0,2为P1,3为关闭所用(同时要第2个X为3,XX=33)
114 1 { //XX=44为测试用,大于4则为无效数据,
115 2 case 0: //第一个X小于3时,第二个X为要输出的数据。
116 2 P2 = CN[2];
117 2 break;
C51 COMPILER V7.01 CDLE_J20_MAIN 07/06/2003 22:51:48 PAGE 3
118 2 case 1:
119 2 P0 = CN[2];
120 2 break;
121 2 case 2:
122 2 P1 = CN[2];
123 2 break;
124 2 case 3:
125 2 P0 = 0;
126 2 P1 = 0;
127 2 P2 = 0;
128 2 break;
129 2 case 4:
130 2 for (a=0; a<8; a++)
131 2 {
132 3 P2 = TS[a];
133 3 for (b=0; b<50000; b++);
134 3 }
135 2 P2 = 0;
136 2 for (a=0; a<8; a++)
137 2 {
138 3 P0 = TS[a];
139 3 for (b=0; b<50000; b++);
140 3 }
141 2 P0 = 0;
142 2 for (a=0; a<4; a++)
143 2 {
144 3 P1 = TS[a];
145 3 for (b=0; b<50000; b++);
146 3 }
147 2 P1 = 0;
148 2 break;
149 2 }
150 1 CNToOut();
151 1 }
152
153 void CNToOut(void)
154 {
155 1 ComOutChar(CN[0]);
156 1 ComOutChar(CN[1]);
157 1 ComOutChar(CN[2]);
158 1 ComOutChar(CN[3]);
159 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 483 ----
CONSTANT SIZE = 8 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 3
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 + -