📄 pca_uart_device.lst
字号:
C51 COMPILER V7.06 PCA_UART_DEVICE 02/25/2009 10:34:59 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE PCA_UART_DEVICE
OBJECT MODULE PLACED IN PCA_UART_Device.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE PCA_UART_Device.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2
3 #include <reg52.h>
4
5 #define BAUD_RATE 70000 // 用户定义的SW_UART波特率
6 #define SYSCLK 24014772 // 系统时钟取自外部18.432MHz晶体
7 #define TIMER_INI 0X49 //比较定时器初始化,也就是设置为软件定时器
8 #define NEG_CAP_INT 0x11 //下降沿捕捉中断
9 #define DISABLED_MODE 0x00 //禁止下降沿捕捉模式
10 #define FOSC12_MOD 0x09 //系统时钟的12分频
11 #define RELOAD 0xf3 //此为串口1,串口波特率重装数值。晶振:24M,12T模式,SMOD=0,
12 //串口波特率基准采用4800bps.
13
14 sbit RXD_PIN = P1^3; //接收数据端
15 sbit TXD_PIN = P1^4; //发送数据端
16
17 /*--------------------模块0的各种状态---------------*/
18
19 uint8 idata Rx_state;//接收状态
20 uint8 idata Rx_buffer;//接收缓存寄存器
21 uint8 idata Rx_shift;//作为接收使用的移位寄存器
22 uint8 idata Rx_count;//状态计数器
23 uint8 idata Rx_data_ready;//数据接收准备
24 uint8 idata Rx_data_error;//接收数据错误标志
25 uint16 idata Rx_time; //接收时的临时时间参数
26 //接收的4种状态
27 #define S_RX_START_EDGE 0X01//数据边缘状态
28 #define S_RX_START_BIT 0X02//数据起始接收状态
29 #define S_RX_DATA_BIT 0x03//数据状态
30 #define S_RX_STOP_BIT 0x04//停止位
31
32 #define RX_FULL_BIT SYSCLK/BAUD_RATE//此为接收一位时的计数次数,可以由用户自定义
33 #define RX_HALF_BIT (RX_FULL_BIT / 2) //1/2位的时间
34
35 /*--------------------模块1的各种状态---------------*/
36
37 uint8 idata Tx_state;//发送状态
38 uint8 idata Tx_buffer;//发送缓存寄存器
39 uint8 idata Tx_shift;//作为发送使用的移位寄存器
40 uint8 idata Tx_count;//发送状态计数器
41 uint8 idata Tx_data_ready;//发送数据准备标志
42 uint8 idata Tx_timer_en;//发送时间允许位
43 uint16 idata Tx_time; //接收时的临时时间参数
44
45 #define S_TX_START_BIT 0x01//发送起始状态
46 #define S_TX_DATA_BIT 0x02//发送数据状态
47 #define S_TX_STOP_BIT 0x03//发送停止位
48 #define S_TX_STOP_END 0x04//结束位
49
50 #define TX_FULL_BIT SYSCLK/BAUD_RATE //此为发送一位时的计数次数,可以由用户自定义,
51 //为了要和硬件串口(即串口1和串口2)实现发送和接收数据
52
53 /*--------------------函数原型---------------*/
54
55 void Transmit(void);
C51 COMPILER V7.06 PCA_UART_DEVICE 02/25/2009 10:34:59 PAGE 2
56 uint8 Rx_get_char(void); //接收处理函数
57 void Tx_put_char(uint8 idata send_data); //发送处理函数
58 void Rx_enable(void);
59 void Rx_disable(void);
60 void Pca_init(void);
61 void Receive(void);
62 void Display_LED(void);
63 void Delays(void);
64 void Serial_Port_Initial(void); //串口初始化原型
65 void Send_UART(uint8); //发送数据原型
66 void UART_Interrupt_Receive(void); //中断接收
67 void delay(uint16 idata In,uint16 idata Out);
68
69 /******************************************************************************
70 函数:main()
71 功能:程序开始执行位置
72 ******************************************************************************/
73
74 void main(void)
75 {
76 1
77 1 Serial_Port_Initial();//初始化串口
78 1 Pca_init(); //初始化pca
79 1 Rx_disable(); //接收禁止
80 1 Rx_enable(); //接收使能
81 1 Rx_buffer=0x20;//发送一个字节数据
82 1 while(1)
83 1 {
84 2 if( 0x01 == Rx_get_char())
85 2 {
86 3 Tx_put_char(Rx_buffer); //发送处理函数
87 3 delay(10,5);
88 3 }
89 2 Delays();
90 2 }
91 1 }
92
93 /******************************************************************************
94 函数:Display_LED()
95 功能:LED灯闪烁
96 说明:LED灯闪烁,作为接收成功数据之后进行的闪烁
97 ******************************************************************************/
98 void Display_LED(void)//LED灯闪烁
99 {
100 1 uint8 i=0;
101 1 for(i=0;i<5;i++)
102 1 {
103 2 P4_0=1;
104 2 Delays();
105 2 P4_0=0;
106 2 Delays();
107 2 }
108 1 }
109
110
111 /******************************************************************************
112 函数:Pca_init()
113 功能:PCA各个寄存器初始化
114 说明:进行PCA模块的初始化,这样对于之后的数据发送有一个准备过程,PCA初始为一切状态
115 ******************************************************************************/
116 void Pca_init(void)
117 {
C51 COMPILER V7.06 PCA_UART_DEVICE 02/25/2009 10:34:59 PAGE 3
118 1 Rx_time = 0;//清0时间
119 1 Tx_time = 0;
120 1
121 1 CMOD = FOSC12_MOD;//采用12分频
122 1 CCON = 0X00;//清0,为初始状态
123 1 CL = 0X00;//计数器清0
124 1 CH = 0X00;
125 1
126 1 Rx_data_ready = 0;
127 1 Rx_data_error = 0;
128 1 CCAPM0 = DISABLED_MODE; //模块全为0,无此功能
129 1
130 1 Tx_data_ready = 1;//准备发送数据
131 1 Tx_timer_en = 0;//发送时间允许标志位
132 1 Tx_state = S_TX_START_BIT;//开始位
133 1 CCAPM1 = DISABLED_MODE; //模块全为1,无此功能
134 1
135 1 // EC = 1;
136 1 EA = 1;//开中断
137 1 CR = 1;//开始计数
138 1 }
139
140 /******************************************************************************
141 函数:Rx_get_char()
142 功能:接收处理函数
143 说明:此函数进行的接收处理,0时表示没有收到数据,1时为收到数据
144 ******************************************************************************/
145 uint8 Rx_get_char(void) //接收处理函数
146 {
147 1 if( Rx_data_ready == 0 )//是否接收到数据
148 1 {
149 2 return 0; //没有收到数据
150 2 }
151 1 else
152 1 {
153 2 Rx_data_ready = 0;
154 2 return 1; //收到数据
155 2 }
156 1 }
157
158 /******************************************************************************
159 函数:Serial_Port_Initial()
160 功能:串口初始化
161 说明:串口采用串口1,方式1来传送接收数据,使用独立波特率发生器作为波特率发生器
162 采用4800bps传输速率。
163 ******************************************************************************/
164
165 void Serial_Port_Initial(void)//串口初始化
166 {
167 1 SCON=0x50; //采用串口方式1。
168 1 BRT=RELOAD; //装入重装数
169 1 //AUXR 8Eh Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS
170 1 AUXR|=0x11; //00010001;开启BRTR即启动Serial,开启S1BRS即使用独立波特率发生器作
171 1 //为波特率发生器
172 1 ES=1; //允许串口中断
173 1 EA=1; //开启总中断
174 1
175 1 }
176 /******************************************************************************
177 函数:Send_UART()
178 功能:串口发送数据
179 说明:串口采用串口1,方式1来传送接收数据,使用独立波特率发生器作为波特率发生器
C51 COMPILER V7.06 PCA_UART_DEVICE 02/25/2009 10:34:59 PAGE 4
180 采用4800bps传输速率。
181 ******************************************************************************/
182
183 void Send_UART(uint8 i)//发送数据
184 {
185 1 ES=0;
186 1 TI=0;
187 1 SBUF=i;
188 1 while(TI==0);
189 1 TI=0;
190 1 ES=1;
191 1 }
192 /******************************************************************************
193 函数:UART_Interrupt_Receive()
194 功能:串口接收数据
195 说明:串口采用串口1,方式1来传送接收数据,使用独立波特率发生器作为波特率发生器
196 采用4800bps传输速率。
197 ******************************************************************************/
198
199 void UART_Interrupt_Receive(void) interrupt 4//中断接收
200 {
201 1 uint8 k=0;
202 1 if(RI==1)
203 1 {
204 2 RI=0;
205 2 k=SBUF;
206 2 Send_UART(k+1);
207 2 }
208 1 else TI=0;
209 1 }
210
211
212 /******************************************************************************
213 函数:Delays()
214 功能:软件延时
215 说明:本函数采用软件延时一定的时间
216 ******************************************************************************/
217
218 void Delays(void)//延时
219 {
220 1 unsigned short j=0;
221 1 unsigned short g=0;
222 1 for(j=0;j<100;j++)
223 1 {
224 2 for(g=0;g<5000;g++)
225 2 {
226 3 ;
227 3 }
228 2 }
229 1 }
230
231 /******************************************************************************
232 函数:Tx_put_char()
233 功能:发送处理函数
234 说明:进行发送前的准备,以进行数据发送,目的就是定时一段时间得到中断,之后进行数据发送
235 当然也可以强制进入中断,不过有一个过渡过程更为自然。
236 ******************************************************************************/
237 void Tx_put_char(uint8 idata send_data) //发送处理函数
238 {
239 1 while( Tx_data_ready == 0 ) //等待准备发送数据
240 1 {
241 2 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -