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

📄 uart.lst

📁 实时系统的正确性不仅依耐系统计算的逻辑结果
💻 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 + -