www.pudn.com > 51_00_OS.rar > UART.c, change:2006-02-24,size:4774b


/******************************************************* 
本程序只供学习使用,未经作者许可,不得用于其它任何用途 
 
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,表示没有找到应删除的资源 
  } 
} 
///////////////////////////////////////////////////////////////////////////////////////////