📄 iofor232.lst
字号:
C51 COMPILER V7.06 IOFOR232 06/08/2005 21:57:39 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE IOFOR232
OBJECT MODULE PLACED IN iofor232.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil20\C51\BIN\C51.EXE iofor232.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //--------------------------------------------------------------------------------------------------------
---------
2 // UART.C
3 // 通用模拟串口程序
4 // 资源需求:一个硬件计数器,两个I/O口
5 // 硬件计数器的计数时间设定为三倍波特率
6 // 定义的两个I/O口,用于发送和接收,分别用在receive()和transmit(char)中
7 // 设立了专门的接收缓冲区,用于存储接收数据
8 // 注意:必需根据波特率来设定定时器;
9 // 每次通信开始必须调用初始化函数init_uart()
10 //--------------------------------------------------------------------------------------------------------
---------
11 //----------------------------------管脚定义、库函数声明-------------------------------------------------
12 #include <reg51.h>
13 #include <stdio.h>
14 //端口定义
15 sbit RXD3=P1^0;
16 sbit TXD3=P1^1;
17 //-----------------------------------------------变量声明-------------------------------------------------
-----
18 #define IN_BUF_SIZE 10 //输入缓冲区长度定义
19 #define TRUE 1
20 #define FALSE 0
21 static unsigned char inbuf[IN_BUF_SIZE]; //输入缓冲区
22 static unsigned char qin = 0;
23 static unsigned char qout = 0;
24 static char flag_rx_waiting_for_stop_bit;
25 static char flag_rx_off;
26 static char rx_mask;
27 static char flag_rx_ready;
28 static char flag_tx_ready;
29 static char timer_rx_ctr;
30 static char timer_tx_ctr;
31 static char bits_left_in_rx;
32 static char bits_left_in_tx;
33 static char rx_num_of_bits;
34 static char tx_num_of_bits;
35 static char internal_rx_buffer;
36 static char internal_tx_buffer;
37 static char user_tx_buffer;
38 //----------------------------------与硬件有关的函数声明------------------------------------------------
39 bit get_rx_pin_status(); //1.返回接收管脚返回的值(0或1)
40 void set_tx_pin_high(void); //2. 发送管脚置高,输出1
41 void set_tx_pin_low(); //3.发送管脚置低,输出0
42 void timer_set(); //4. 设置定时器的值为波特率的三倍
43 void set_timer_interrupt(); //5. 使能定时器中断
44 void idle(); //6.等待端口输入时,执行,根据具体应用进行修改
45 //-----------------------------------声明与硬件无关的函数-------------------------------------------
46 void flush_input_buffer( void ); // 清空接收缓存区
47 char kbhit( void ); // 判断数据是否正常接收
48 char get_char( void ); // 从接收缓存区读出一个数据
49 void turn_rx_on( void ); // 启动接收函数
50 void turn_rx_off( void ); // 结束接收函数
51 extern void put_char( char ); // 向发送端发送一个数据.
52 void timer_isr(void); //中断处理函数
C51 COMPILER V7.06 IOFOR232 06/08/2005 21:57:39 PAGE 2
53 //-------------------------------------------------------------------------------------------------------
54 // 函数名称:set_tx_pin_high
55 // 功能说明: 置串口发送端口为高,与硬件有关
56 //--------------------------------------------------------------------------------------------------------
57 void set_tx_pin_high( void)
58 {
59 1 TXD3=1;
60 1 }
61 //-------------------------------------------------------------------------------------------------------
62 // 函数名称: set_tx_pin_low
63 // 功能说明: 置串口发送端口为低,与硬件有关
64 //--------------------------------------------------------------------------------------------------------
65 void set_tx_pin_low( void)
66 {
67 1 TXD3=0;
68 1 }
69 //-------------------------------------------------------------------------------------------------------
70 // 函数名称:get_rx_pin_status
71 // 功能说明: 返回接收端口的状态,高为1,低为0,与硬件有关
72 //--------------------------------------------------------------------------------------------------------
73 bit get_rx_pin_status()
74 {
75 1 return(RXD3);
76 1 }
77 //-------------------------------------------------------------------------------------------------------
78 // 函数名称: timer_set
79 // 功能说明: 设置定时器工作状态,与硬件有关
80 //--------------------------------------------------------------------------------------------------------
81 void timer_set()
82 {
83 1 TMOD=0x22; //定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装)
84 1 PCON=0x00;
85 1 TR0=0; //在发送或接收才开始使用
86 1 TF0=0;
87 1 TH0=(256-96); //9600bps 就是 1000000/9600=104.167微秒 执行的timer是
88 1 //104.167*11.0592/12= 96
89 1 TL0=TH0;
90 1 ET0=1;
91 1 }
92 //-------------------------------------------------------------------------------------------------------
93 // 函数名称: set_timer_interrupt
94 // 功能说明: 打开定时器中断允许,与硬件有关
95 //--------------------------------------------------------------------------------------------------------
96 void set_timer_interrupt()
97 {
98 1 EA=1;
99 1 }
100 //-------------------------------------------------------------------------------------------------------
101 // 函数名称: IntTimer0
102 // 功能说明: 定时器中断函数,与硬件有关,但不做处理,直接调用通用中断处理函数
103 //--------------------------------------------------------------------------------------------------------
104 void IntTimer0() interrupt 1
105 {
106 1 timer_isr(); //调用中断处理函数
107 1 }
108 //-------------------------------------------------------------------------------------------------------
109 // 函数名称: idle
110 // 功能说明: 等待定时器中断时的执行程序,与具体应用有关
111 //--------------------------------------------------------------------------------------------------------
112 void idle()
113 {
114 1
C51 COMPILER V7.06 IOFOR232 06/08/2005 21:57:39 PAGE 3
115 1 }
116 //-------------------------------------------------------------------------------------------------------
117 // 函数名称: timer_isr
118 // 功能说明: 中断处理函数,与硬件无关,通用函数
119 //--------------------------------------------------------------------------------------------------------
120 void timer_isr(void) /*中断服务程序*/
121 {
122 1 char mask, start_bit, flag_in;
123 1 //发送程序
124 1 if ( flag_tx_ready )
125 1 {
126 2 if ( --timer_tx_ctr<=0 )
127 2 {
128 3 mask = internal_tx_buffer&1;
129 3 internal_tx_buffer >>= 1;
130 3 if ( mask )
131 3 {
132 4 set_tx_pin_high();
133 4 }
134 3 else
135 3 {
136 4 set_tx_pin_low();
137 4 }
138 3 timer_tx_ctr = 3;
139 3 if ( --bits_left_in_tx<=0 )
140 3 {
141 4 flag_tx_ready = FALSE;
142 4 }
143 3 }
144 2 }
145 1 // 接收程序
146 1 if ( flag_rx_off==FALSE )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -