?? 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 + -