📄 tx433.lst
字号:
C51 COMPILER V7.50 TX433 10/21/2008 10:21:22 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 串口接收靠超时判断,超过20ms就认为完成接收一个数据包,
5 开始无线发送。
6
7 P06闪烁表明超时判断完成,即一个数据包接收完毕;
8 P04闪烁表明无线发送数据成功。
9
10 修改:增加"串口接收数目超过缓冲区则重新计数"
11 ******************************************/
12
13 #include <Nordic\reg9e5.h>
14
15 #define HFREQ 0 // 0=433MHz, 1=868/915MHz
16 #define POWER 3 // 0=min power...3 = max power
17 #define UART_BUFFER_SIZE 10 //串口接收缓冲区大小为 10 bytes,最大为31
18
19 unsigned char UART_BUFFER[UART_BUFFER_SIZE+1]; //串口接收数据缓冲区
20 unsigned char countt=0; //待发送数据个数
21
22 unsigned int Tnum=400; //设定超时时间
23 bit Overtime_Flag; //超时标志位
24
25
26 //延时函数
27 void Delay400us(volatile unsigned char n)
28 {
29 1 unsigned char i;
30 1 while(n--)
31 1 for(i=0;i<35;i++)
32 1 ;
33 1 }
34
35 //超时计时定时器T0初始化
36 void Time0_Init(void)
37 {
38 1 TMOD &= 0xF0; //定时器/计数器T0选为定时器模式,工作方式2,以TR0启动定时器
39 1 TMOD |= 0x02;
40 1 CKCON |= 0x08; // T0M=1 (/4 timer clock)
41 1 TH0=0x38; //16MHz下定时时间为50us
42 1 TL0=0x38;
43 1 ET0=1; //允许定时器T0中断
44 1 TR0=1; //启动定时器T0
45 1 Overtime_Flag=0; //清超时标志
46 1 }
47
48 //定时器T0中断服务子程序
49 void Timer0_ISR (void) interrupt 1
50 {
51 1 //TF0=0; //响应中断后自动清0
52 1 Tnum--; //计时20ms(中断次数计数)
53 1 if(Tnum==0) //超时20ms到?
54 1 {
55 2 TR0=0; //关闭定时器T0
C51 COMPILER V7.50 TX433 10/21/2008 10:21:22 PAGE 2
56 2 Overtime_Flag=1; //超时标志置1
57 2 P06=~P06;
58 2 }
59 1 }
60
61 //串口接收中断函数
62 void serial_ISR (void) interrupt 4
63 {
64 1 if(RI)
65 1 {
66 2 unsigned char ch;
67 2 RI = 0;
68 2 ch = SBUF;
69 2 //TR0=1;
70 2 if(Overtime_Flag==0) //未超时就接收
71 2 { //*********下面为修改***************
72 3 if(countt==UART_BUFFER_SIZE) //串口接收数目超过缓冲区则重新计数,缓冲区内数据会混乱
73 3 countt=0;
74 3 countt++;
75 3 UART_BUFFER[0]=countt;
76 3 UART_BUFFER[countt]=ch;
77 3 }
78 2 }
79 1 if(TI)
80 1 {
81 2 //TI=0;
82 2 return;
83 2 }
84 1 }
85
86 //SPI读写
87 unsigned char SpiReadWrite(unsigned char b)
88 {
89 1 EXIF &= ~0x20; // Clear SPI interrupt
90 1 SPI_DATA = b; // Move byte to send to SPI data register
91 1 while((EXIF & 0x20) == 0x00) // Wait until SPI hs finished transmitting
92 1 ;
93 1 return SPI_DATA;
94 1 }
95
96 //无线发送
97 void Transmitter(unsigned char *str,unsigned char strlen)
98 {
99 1 unsigned char j=0;
100 1 TRX_CE=0; //待机模式
101 1 //Delay400us(10);
102 1 RACSN = 0;
103 1 SpiReadWrite(WTP); //将发送数据写入SPI寄存器
104 1 for(j=0;j<strlen;j++)
105 1 {
106 2 SpiReadWrite(*(str + j));
107 2 }
108 1
109 1 RACSN = 1;
110 1 TXEN = 1;
111 1 TRX_CE = 1; //使能发送
112 1 Delay400us(2);
113 1 TRX_CE = 0; //发送完毕
114 1 P04=~P04;
115 1 // countt=0;
116 1 }
117
C51 COMPILER V7.50 TX433 10/21/2008 10:21:22 PAGE 3
118 //初始化
119 void Init(void)
120 {
121 1 unsigned char tmp,cklf,tmpa,tmpb;
122 1
123 1 TH1 = 0xE6; // 9600@16MHz (when T1M=1 and SMOD=1)
124 1 CKCON |= 0x10; // T1M=1 (/4 timer clock)
125 1 PCON = 0x80; // SMOD=1 (double baud rate)
126 1 SCON = 0x50; // Serial mode1, enable receiver
127 1 TMOD = 0x20; // Timer1 8bit auto reload
128 1 TR1 = 1; // Start timer1
129 1 // P0_ALT |= 0x06;
130 1 // P0_DIR |= 0x02; // P0.1 (RxD) is input
131 1 tmpa= P0_ALT | 0x06; // Select alternate functions on pins P0.1 and P0.2
132 1 P0_ALT = tmpa & 0x06;
133 1 tmpb = P0_DIR | 0x02; // P0.1 (RxD) is input
134 1 P0_DIR =tmpb & 0x02;
135 1
136 1 SPICLK = 0; // Max SPI clock
137 1 SPI_CTRL = 0x02; // Connect internal SPI controller to Radio
138 1
139 1 // Configure Radio:
140 1 RACSN = 0;
141 1 SpiReadWrite(WRC | 0x03); // Write to RF config address 3 (RX payload)
142 1 SpiReadWrite(0x01); // One byte RX payload
143 1 SpiReadWrite(0x01); // One byte TX payload
144 1 RACSN = 1;
145 1
146 1 RACSN = 0;
147 1 SpiReadWrite(RRC | 0x01); // Read RF config address 1
148 1 tmp = SpiReadWrite(0) & 0xf1; // PA_PWR[1:0]=00(输出电源-10dBm) HFREQ_PLL=0(433MHz) Clear the p
-ower and frequency setting bits
149 1 RACSN = 1;
150 1
151 1 RACSN = 0;
152 1 SpiReadWrite(WRC | 0x01); // Write RF config address 1
153 1 SpiReadWrite(tmp | (POWER <<2) | (HFREQ << 1)); // Change power defined by POWER and to 433 or 868/9
-15MHz defined by HFREQ above:
154 1 RACSN = 1;
155 1
156 1
157 1 // Switch to 16MHz clock:
158 1 RACSN = 0;
159 1 SpiReadWrite(RRC | 0x09);
160 1 cklf = SpiReadWrite(0) | 0x1c;
161 1 RACSN = 1;
162 1 RACSN = 0;
163 1 SpiReadWrite(WRC | 0x09);
164 1 SpiReadWrite(cklf);
165 1 RACSN = 1;
166 1
167 1 RACSN = 0;
168 1 SpiReadWrite(WTA); //写本发送器配套的接收器地址,与rx433里的配置一样才可通信
169 1 SpiReadWrite(0x18);
170 1 SpiReadWrite(0x32);
171 1 SpiReadWrite(0x40);
172 1 SpiReadWrite(0xAF);
173 1 RACSN = 1;
174 1
175 1 RACSN = 0;
176 1 SpiReadWrite(WRC | 0x04); //设置本发送器发送的数据宽度,与tx433里的配置一样才可通信
177 1 SpiReadWrite(0x20); //发送数据宽度为32个字节
C51 COMPILER V7.50 TX433 10/21/2008 10:21:22 PAGE 4
178 1 RACSN = 1;
179 1 }
180
181 void main(void)
182 {
183 1 Init();
184 1 Time0_Init(); //T0初始化
185 1 EA=1;
186 1 ES=1;
187 1 //PT0=1; //定时器T0为高优先级
188 1
189 1 while(1)
190 1 {
191 2 if(Overtime_Flag) //超时,将读到的数无线发送
192 2 {
193 3 ES=0;
194 3 //UART_BUFFER[0]=countt;
195 3 if(countt != 0) //缓冲区有接收到数据,开始发送
196 3 Transmitter(UART_BUFFER,(UART_BUFFER[0]+1));
197 3 countt=0;
198 3 Overtime_Flag=0; //复位超时标志
199 3 Tnum=400;
200 3 TL0=0x38; //重置超时计数器
201 3 TR0=1; //启动超时定时器
202 3 ES=1;
203 3 }
204 2 }
205 1
206 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 407 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 14 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 + -