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