📄 uart.lst
字号:
C51 COMPILER V7.06 UART 02/25/2006 14:24:59 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN UART.OBJ
COMPILER INVOKED BY: f:\Keil\C51\BIN\C51.EXE UART.c BROWSE DEBUG OBJECTEXTEND
stmt 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 "at89x52.h"
18
19 #include "OS_core.h"
20
21 #include "UART.h"
22
23 #include "MAIN.h"
24
25
26 //打印机占用标志,使用打印前,设置为非0值(实际使用任务ID号+1),避免打印混乱
27 unsigned char printer_used;
28
29 //////////////////////////////串口初始化函数,9600bps波特率,使用24M晶体///////////////
30 void UART_init(void)
31 {
32 1
33 1 TMOD=(TMOD & 0x0F)|0x20; //定时器1工作在模式2
34 1
35 1 SCON=0x50; //串口工作在模式1
36 1
37 1 ES=0; //禁止串行中断
38 1
39 1 PCON|=0x80; //串口波特率加倍
40 1
41 1 TH1=0xF3;
42 1 TL1=0xF3; //串口波特率为9600
43 1
44 1 TR1=1; //启动定时器1
45 1 REN=1; //允许接收
46 1
47 1 printer_used=0;
48 1 }
49 ////////////////////////////////////////////////////////////////////////////////////////
50
51
52 //////////////////////////////// 通过串口发送1字节数据/////////////////////////////////
53 void send_a_byte(unsigned char a_byte)
54 {
55 1 TI=0; //清TI
C51 COMPILER V7.06 UART 02/25/2006 14:24:59 PAGE 2
56 1 SBUF=a_byte; //发送数据
57 1 while(!TI); //等待发送完毕
58 1 }
59 /////////////////////////////////////////////////////////////////////////////////////////
60
61 /////////////////////////////// 从串口接收一字节数据 /////////////////////////////////
62 unsigned char get_a_byte(void)
63 {
64 1 unsigned char temp; //临时变量
65 1 while(1) //一直等待,直到接收到数据才返回
66 1 {
67 2 OS_Enter_Critical(); //进入临界段
68 2 if(RI) //如果串口收到数据
69 2 { //如果收到,则
70 3 temp=SBUF; //读回数据
71 3 RI=0; //清RI
72 3 OS_Exit_Critical(); //退出临界段
73 3 return temp; //返回数据
74 3 }
75 2 else
76 2 { //如果未收到,则
77 3 OS_Exit_Critical(); //退出临界段
78 3 OS_Delay(1); //延迟一个时钟节拍
79 3 }
80 2 }
81 1 }
82 /////////////////////////////////////////////////////////////////////////////////////////
83
84 ////////////////////////////// 发送一个字符串 ///////////////////////////////////////////
85 //////////////////入口参数: s-要发送的字符串的指针(字符串长度不得大于255)/////////////
86 ///////////////////////////////////// newline-是否需要换行 0-不换行 非0-换行////////
87 void prints(unsigned char * s,unsigned char newline)
88 {
89 1 unsigned char i;
90 1 i=0;
91 1 while(s[i]!=0) //判断字符串是否结束
92 1 {
93 2 TI=0;
94 2 SBUF=s[i]; //发送一字节
95 2 while(!TI); //等待该发送完毕
96 2 i++; //移到下字节
97 2 }
98 1 if(newline) //如果需要换行
99 1 {
100 2 send_a_byte(13);
101 2 send_a_byte(10); //发送回车换行
102 2 }
103 1 }
104 ////////////////////////////////////////////////////////////////////////////////////////////
105
106 ////////////////////////////////// 请求打印机服务 ////////////////////////////////////////
107 void get_printer(void)
108 {
109 1 while(1)
110 1 {
111 2 OS_Enter_Critical(); //进入临界段
112 2 if(printer_used==0) //如果打印机没有被占用
113 2 {
114 3 printer_used=OS_Current_ID+1; //则占用打印机,之所以加1,是为了使0号任务也能使用打印机
115 3 //当一个任务被删除,需要检查是否占有资源时要特别注意,
116 3 //读得的此号,要减1才是任务的ID号
117 3
C51 COMPILER V7.06 UART 02/25/2006 14:24:59 PAGE 3
118 3 OS_Exit_Critical(); //退出临界段
119 3 return; //返回
120 3 }
121 2 else //如果打印机已经被占用
122 2 {
123 3 OS_Exit_Critical(); //退出临界段
124 3 OS_Delay(1); //等待1个时钟节拍后再检查
125 3 }
126 2 }
127 1 }
128 ////////////////////////////////////////////////////////////////////////////////////////////
129
130 ////////////////////////// 让出打印机的使用权 ////////////////////////////////////////////
131 void give_up_printer(void)
132 {
133 1 OS_Enter_Critical();
134 1 printer_used=0; //让出打印机使用权
135 1 OS_Exit_Critical();
136 1 OS_Delay(1); //延迟一个时钟,让别的设备有机会获取打印机
137 1 }
138 ///////////////////////////////////////////////////////////////////////////////////////////
139
140 //////////////////////////// 检查任务是否占有该资源,如果占有,则释放之 //////////////////
141 //////////////////////////// 入口参数:任务的ID号 /////////////////////////////////////////
142 /////////////////////// 返回:0-没有找到应该释放的资源 任务号ID+1:成功释放资源 ///////////
143 unsigned char release_printer(unsigned char Task_ID)
144 {
145 1 if(printer_used==Task_ID+1) //确认资源被该任务使用中
146 1 {
147 2 printer_used=0; //释放资源
148 2 return Task_ID+1; //返回代号
149 2 }
150 1 else
151 1 {
152 2 return 0; //返回0,表示没有找到应删除的资源
153 2 }
154 1 }
155 ///////////////////////////////////////////////////////////////////////////////////////////
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 + -