📄 tx433.lst
字号:
C51 COMPILER V7.50 TX433 10/21/2008 13:28:16 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE TX433
OBJECT MODULE PLACED IN tx433.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE tx433.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************
2 无线接收的发送收端程序:
3 将从串口接收到的字符发送出去。
4
5 ******************************************/
6
7 #include <Nordic\reg24e1.h>
8
9 struct RFConfig
10 {
11 unsigned char n;
12 unsigned char buf[15];
13 };
14
15 typedef struct RFConfig RFConfig;
16
17 #define ADDR_INDEX 8 // Index to address bytes in RFConfig.buf
18 #define ADDR_COUNT 4 // Number of address bytes
19
20 #define UART_BUFFER_SIZE 4 //定义串口接收缓冲区大小 8 bytes,最大为31
21
22 unsigned char UART_BUFFER[UART_BUFFER_SIZE+1]; //定义串口接收数据缓冲区
23 unsigned char countt=0; //
24 bit Overtime_Flag=0;
25
26 unsigned int Tnum=2000;
27
28 const RFConfig txconf =
29 {
30 15,
31 0x28, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
32 0x12, 0x34, 0x56, 0x78, 0x83, 0x6c, 0x04
33 };
34
35 /*
36 0x28 :通道2数据接收包的位数(此处为40bit即5个字节)
37
38 0x28 :通道1数据接收包的位数
39
40 0x00, 0x00, 0x00, 0x00, 0x00:CH2地址
41 发射地址在发射时再设置。
42 0x00, 0x12, 0x34, 0x56, 0x78:CH1地址(高于设定的地址宽度补0,即本行的第一个字节)
43
44 0x83=100000 11 前6位:四个字节(32位)地址宽度(CH1及CH2);
45 后2位:CRC使能且为16bit
46
47 0x6C=0 1 1 011 00 B7最高位:0表示一通道(1表示2通道)
48 B6 :1表示收发子系统处于ShockBurst模式(0表示直接模式)
49 B5 :1表示1Mbps(0为250kbps)
50 B4-B2 :011表示外部的晶振为16M
51 B1-B0 :00表示发射功率为-20dBm
52
53 0x04=0000010 0 B7-B1 :表示发射频率 和 CH1接收频率
54 B0 :0表示发射模式(1为接收模式)
55 */
C51 COMPILER V7.50 TX433 10/21/2008 13:28:16 PAGE 2
56
57
58 const RFConfig rxconf =
59 {
60 15,
61 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
62 0x87, 0x65, 0x43, 0x21, 0x83, 0x6c, 0x05
63 };
64
65
66 //延时函数
67 void Delay100us(volatile unsigned char n)
68 {
69 1 unsigned char i;
70 1 while(n--)
71 1 for(i=0;i<35;i++)
72 1 ;
73 1 }
74
75
76 unsigned char SpiReadWrite(unsigned char b)
77 {
78 1 EXIF &= ~0x20; // Clear SPI interrupt
79 1 SPI_DATA = b; // Move byte to send to SPI data register
80 1 while((EXIF & 0x20) == 0x00) // Wait until SPI hs finished transmitting
81 1 ;
82 1 return SPI_DATA;
83 1 }
84
85
86 void Transmitter(unsigned char *str,unsigned char strlen)
87 {
88 1 unsigned char i;
89 1
90 1 CE = 1;
91 1 Delay100us(0);
92 1 for(i=0;i<ADDR_COUNT;i++) // Start with the address of the receiver:
93 1 SpiReadWrite(rxconf.buf[ADDR_INDEX+i]);
94 1 for(i=0;i<strlen;i++)
95 1 SpiReadWrite(*(str + i));
96 1 CE = 0;
97 1 T1 = ~T1; //发送闪烁
98 1 Delay100us(3); // Wait ~300us
99 1 }
100
101 //超时计时定时器T0初始化
102 void Time0_Init(void)
103 {
104 1 TMOD &= 0xF0; //定时器/计数器T0为定时器,工作于方式2,以TR0启动定时器
105 1 TMOD |= 0x02;
106 1 CKCON |= 0x08; // T0M=1 (/4 timer clock)
107 1 TL0=0x38; //16MHz下定时时间为50us
108 1 TH0=0x38;
109 1 Overtime_Flag=0; //清除超时标志
110 1 }
111
112 //2401子系统初始化
113 void Init(void)
114 {
115 1 unsigned char j;
116 1 // P0_ALT |= 0x06; // Select alternate functions on pins P0.1 and P0.2
117 1 // P0_DIR = 0xA2; // 方向要设对,P0.1(RxD) ,P0.5,P0.7为输入,P0.4,P0.6为输出
C51 COMPILER V7.50 TX433 10/21/2008 13:28:16 PAGE 3
118 1 PWR_UP=1;
119 1 Delay100us(30); // Wait > 3ms
120 1
121 1 SPICLK = 0; // Max SPI clock (XTAL/8)
122 1 SPI_CTRL = 0x02; // Connect internal SPI controller to Radio
123 1
124 1 CE = 0; // Configure Radio:
125 1 CS = 1;
126 1 Delay100us(0);
127 1 for(j=0;j<txconf.n;j++)
128 1 {
129 2 SpiReadWrite(txconf.buf[j]);
130 2 }
131 1 CS = 0;
132 1 }
133 //串口初始化
134 void Uart_init(void)
135 {
136 1 TH1 = 0xE6; // 9600@16MHz (when T1M=1 and SMOD=1)
137 1 CKCON |= 0x10; // T1M=1 (/4 timer clock)
138 1 PCON = 0x80; // SMOD=1 (double baud rate)
139 1 SCON = 0x50; // Serial mode1, enable receiver
140 1 TMOD = 0x20; // Timer1 8bit auto reload
141 1 TR1 = 1; // Start timer1
142 1 P0_ALT |= 0x06; // Select alternate functions on pins P0.1 and P0.2
143 1 P0_DIR = 0xA2; // P0.1 (RxD) is an input
144 1 }
145
146
147 void main(void)
148 {
149 1 Init();
150 1 Uart_init();
151 1 Time0_Init(); //超时定时器T0初始化
152 1 EA=1;
153 1 ES=1;
154 1 ET0=1; //允许定时器T0中断
155 1 TR0=1; //启动超时定时器T0
156 1 //PT0=1; //定时器T0为高优先级
157 1 while(1)
158 1 {
159 2 if(Overtime_Flag) //如果取数标志已置位,就将读到的数无线发送
160 2 {
161 3 ES=0;
162 3 Overtime_Flag=0; //取数标志清0
163 3 if(countt != 0)
164 3 Transmitter(UART_BUFFER,(UART_BUFFER[0]+1));
165 3
166 3 countt=0;
167 3 Tnum=2000;
168 3 TL0=0x38; //16MHz下定时时间为50us
169 3 TR0=1;
170 3 ES=1;
171 3 }
172 2
173 2 }
174 1 }
175
176 //定时器T0中断服务子程序
177 void Timer0_ISR (void) interrupt 1
178 {
179 1 Tnum--; //计时100ms(中断次数计数),实际需34ms
C51 COMPILER V7.50 TX433 10/21/2008 13:28:16 PAGE 4
180 1 if(Tnum == 0) //超时?
181 1 {
182 2 TR0 = 0; //关闭定时器T0
183 2 Overtime_Flag = 1; //置位超时标志,开始发送
184 2 INT1 = ~INT1; //超时闪烁
185 2 }
186 1 }
187
188 //串口接收中断函数
189 void serial_ISR (void) interrupt 4
190 {
191 1 if(RI)
192 1 {
193 2 unsigned char ch;
194 2 RI = 0;
195 2 ch = SBUF;
196 2 //TR0=1;
197 2 if(Overtime_Flag==0) //未超时就接收
198 2 {
199 3 if(countt==UART_BUFFER_SIZE)
200 3 countt=0;
201 3 countt++;
202 3 UART_BUFFER[countt]=ch;
203 3 UART_BUFFER[0]=countt;
204 3 }
205 2 }
206 1 if(TI)
207 1 {
208 2 // TI=0;
209 2 return;
210 2 }
211 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 316 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 40 5
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -