?? uart.lst
字號:
C51 COMPILER V8.08 UART 01/17/2009 15:09:00 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN UART.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE UART.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************
2 本程序只供學習使用,未經作者許可,不得用于其它任何用途
3
4 UART.c file
5
6 Created by Computer-lov
7 Date: 2005.12.12
8
9 Edit date:2006.2.24
10
11 Version V1.1
12 Copyright(C) Computer-lov 2005-2015
13 All rigths reserved
14
15 ******************************************************/
16
17 #include "STC516.h"
18 //#include<reg51.h>
19
20 #include "OS_core.h"
21
22 #include "UART.h"
23
24 #include "MAIN.h"
25
26
27 //打印機占用標志,使用打印前,設置為非0值(實際使用任務ID號+1),避免打印混亂
28 unsigned char printer_used;
29
30 //////////////////////////////串口初始化函數,9600bps波特率,使用24M晶體///////////////
31 void UART_init(void)
32 {
33 1
34 1 TMOD=(TMOD & 0x0F)|0x20; //定時器1工作在模式2
35 1
36 1 SCON=0x50; //串口工作在模式1
37 1
38 1 ES=0; //禁止串行中斷
39 1
40 1 PCON|=0x80; //串口波特率加倍
41 1
42 1 TH1=0xF4;
43 1 TL1=0xF4; //串口波特率為4800*2=9600 晶振 22.1184M
44 1
45 1 TR1=1; //啟動定時器1
46 1 REN=1; //允許接收
47 1
48 1 printer_used=0;
49 1 }
50 ////////////////////////////////////////////////////////////////////////////////////////
51
52
53 //////////////////////////////// 通過串口發送1字節數據/////////////////////////////////
54 void send_a_byte(unsigned char a_byte)
55 {
C51 COMPILER V8.08 UART 01/17/2009 15:09:00 PAGE 2
56 1 TI=0; //清TI
57 1 SBUF=a_byte; //發送數據
58 1 while(!TI); //等待發送完畢
59 1 }
60 /////////////////////////////////////////////////////////////////////////////////////////
61
62 /////////////////////////////// 從串口接收一字節數據 /////////////////////////////////
63 unsigned char get_a_byte(void)
64 {
65 1 unsigned char temp; //臨時變量
66 1 while(1) //一直等待,直到接收到數據才返回
67 1 {
68 2 OS_Enter_Critical(); //進入臨界段
69 2 if(RI) //如果串口收到數據
70 2 { //如果收到,則
71 3 temp=SBUF; //讀回數據
72 3 RI=0; //清RI
73 3 OS_Exit_Critical(); //退出臨界段
74 3 return temp; //返回數據
75 3 }
76 2 else
77 2 { //如果未收到,則
78 3 OS_Exit_Critical(); //退出臨界段
79 3 OS_Delay(1); //延遲一個時鐘節拍
80 3 }
81 2 }
82 1 }
83 /////////////////////////////////////////////////////////////////////////////////////////
84
85 ////////////////////////////// 發送一個字符串 ///////////////////////////////////////////
86 //////////////////入口參數: s-要發送的字符串的指針(字符串長度不得大于255)/////////////
87 ///////////////////////////////////// newline-是否需要換行 0-不換行 非0-換行////////
88 void prints(unsigned char * s,unsigned char newline)
89 {
90 1 unsigned char i;
91 1 i=0;
92 1 while(s[i]!=0) //判斷字符串是否結束
93 1 {
94 2 TI=0;
95 2 SBUF=s[i]; //發送一字節
96 2 while(!TI); //等待該發送完畢
97 2 i++; //移到下字節
98 2 }
99 1 if(newline) //如果需要換行
100 1 {
101 2 send_a_byte(13);
102 2 send_a_byte(10); //發送回車換行
103 2 }
104 1 }
105 ////////////////////////////////////////////////////////////////////////////////////////////
106
107 ////////////////////////////////// 請求打印機服務 ////////////////////////////////////////
108 void get_printer(void)
109 {
110 1 while(1)
111 1 {
112 2 OS_Enter_Critical(); //進入臨界段
113 2 if(printer_used==0) //如果打印機沒有被占用
114 2 {
115 3 printer_used=OS_Current_ID+1; //則占用打印機,之所以加1,是為了使0號任務也能使用打印機
116 3 //當一個任務被刪除,需要檢查是否占有資源時要特別注意,
117 3 //讀得的此號,要減1才是任務的ID號
C51 COMPILER V8.08 UART 01/17/2009 15:09:00 PAGE 3
118 3
119 3 OS_Exit_Critical(); //退出臨界段
120 3 return; //返回
121 3 }
122 2 else //如果打印機已經被占用
123 2 {
124 3 OS_Exit_Critical(); //退出臨界段
125 3 OS_Delay(1); //等待1個時鐘節拍后再檢查
126 3 }
127 2 }
128 1 }
129 ////////////////////////////////////////////////////////////////////////////////////////////
130
131 ////////////////////////// 讓出打印機的使用權 ////////////////////////////////////////////
132 void give_up_printer(void)
133 {
134 1 OS_Enter_Critical();
135 1 printer_used=0; //讓出打印機使用權
136 1 OS_Exit_Critical();
137 1 OS_Delay(1); //延遲一個時鐘,讓別的設備有機會獲取打印機
138 1 }
139 ///////////////////////////////////////////////////////////////////////////////////////////
140
141 //////////////////////////// 檢查任務是否占有該資源,如果占有,則釋放之 //////////////////
142 //////////////////////////// 入口參數:任務的ID號 /////////////////////////////////////////
143 /////////////////////// 返回:0-沒有找到應該釋放的資源 任務號ID+1:成功釋放資源 ///////////
144 unsigned char release_printer(unsigned char Task_ID)
145 {
146 1 if(printer_used==Task_ID+1) //確認資源被該任務使用中
147 1 {
148 2 printer_used=0; //釋放資源
149 2 return Task_ID+1; //返回代號
150 2 }
151 1 else
152 1 {
153 2 return 0; //返回0,表示沒有找到應刪除的資源
154 2 }
155 1 }
156 ///////////////////////////////////////////////////////////////////////////////////////////
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 226 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 3
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -