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