📄 uart.c
字号:
/*******************************************************
本程序只供学习使用,未经作者许可,不得用于其它任何用途
UART.c file
Created by Computer-lov
Date: 2005.12.12
Edit date:2006.2.24
Version V1.1
Copyright(C) Computer-lov 2005-2015
All rigths reserved
******************************************************/
#include "at89x52.h"
#include "OS_core.h"
#include "UART.h"
#include "MAIN.h"
//打印机占用标志,使用打印前,设置为非0值(实际使用任务ID号+1),避免打印混乱
unsigned char printer_used;
//////////////////////////////串口初始化函数,9600bps波特率,使用24M晶体///////////////
void UART_init(void)
{
TMOD=(TMOD & 0x0F)|0x20; //定时器1工作在模式2
SCON=0x50; //串口工作在模式1
ES=0; //禁止串行中断
PCON|=0x80; //串口波特率加倍
TH1=0xF3;
TL1=0xF3; //串口波特率为9600
TR1=1; //启动定时器1
REN=1; //允许接收
printer_used=0;
}
////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////// 通过串口发送1字节数据/////////////////////////////////
void send_a_byte(unsigned char a_byte)
{
TI=0; //清TI
SBUF=a_byte; //发送数据
while(!TI); //等待发送完毕
}
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////// 从串口接收一字节数据 /////////////////////////////////
unsigned char get_a_byte(void)
{
unsigned char temp; //临时变量
while(1) //一直等待,直到接收到数据才返回
{
OS_Enter_Critical(); //进入临界段
if(RI) //如果串口收到数据
{ //如果收到,则
temp=SBUF; //读回数据
RI=0; //清RI
OS_Exit_Critical(); //退出临界段
return temp; //返回数据
}
else
{ //如果未收到,则
OS_Exit_Critical(); //退出临界段
OS_Delay(1); //延迟一个时钟节拍
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////// 发送一个字符串 ///////////////////////////////////////////
//////////////////入口参数: s-要发送的字符串的指针(字符串长度不得大于255)/////////////
///////////////////////////////////// newline-是否需要换行 0-不换行 非0-换行////////
void prints(unsigned char * s,unsigned char newline)
{
unsigned char i;
i=0;
while(s[i]!=0) //判断字符串是否结束
{
TI=0;
SBUF=s[i]; //发送一字节
while(!TI); //等待该发送完毕
i++; //移到下字节
}
if(newline) //如果需要换行
{
send_a_byte(13);
send_a_byte(10); //发送回车换行
}
}
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////// 请求打印机服务 ////////////////////////////////////////
void get_printer(void)
{
while(1)
{
OS_Enter_Critical(); //进入临界段
if(printer_used==0) //如果打印机没有被占用
{
printer_used=OS_Current_ID+1; //则占用打印机,之所以加1,是为了使0号任务也能使用打印机
//当一个任务被删除,需要检查是否占有资源时要特别注意,
//读得的此号,要减1才是任务的ID号
OS_Exit_Critical(); //退出临界段
return; //返回
}
else //如果打印机已经被占用
{
OS_Exit_Critical(); //退出临界段
OS_Delay(1); //等待1个时钟节拍后再检查
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////// 让出打印机的使用权 ////////////////////////////////////////////
void give_up_printer(void)
{
OS_Enter_Critical();
printer_used=0; //让出打印机使用权
OS_Exit_Critical();
OS_Delay(1); //延迟一个时钟,让别的设备有机会获取打印机
}
///////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////// 检查任务是否占有该资源,如果占有,则释放之 //////////////////
//////////////////////////// 入口参数:任务的ID号 /////////////////////////////////////////
/////////////////////// 返回:0-没有找到应该释放的资源 任务号ID+1:成功释放资源 ///////////
unsigned char release_printer(unsigned char Task_ID)
{
if(printer_used==Task_ID+1) //确认资源被该任务使用中
{
printer_used=0; //释放资源
return Task_ID+1; //返回代号
}
else
{
return 0; //返回0,表示没有找到应删除的资源
}
}
///////////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -