⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 网上收集的嵌入式操作系统后在51上写的一个简单的操作系统
💻 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 + -