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

📄 test.lst

📁 无线双向通讯
💻 LST
字号:
C51 COMPILER V8.16   TEST                                                                  11/17/2008 15:31:21 PAGE 1   


C51 COMPILER V8.16, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN test.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE test.c ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg51.h>
   2          #include "string.h"
   3          
   4          
   5          sbit LED1 = P1^2;
   6          sbit LED2 = P1^4;
   7          sbit LED3 = P1^3;
   8          //sbit LED1 = P3^6;
   9          //sbit LED2 = P3^7;
  10          sbit W_IN = P3^2;
  11          sbit W_OUT = P3^4;
  12          
  13          unsigned char w_timer=0;
  14          unsigned int jiffies=0,x=0;
  15          void clock_timer(void) interrupt 1 using 1{
  16   1          jiffies++;
  17   1          //if(x++==500){x=0;
  18   1          w_timer++;//};
  19   1      }
  20          
  21          void clock_init(void){
  22   1          jiffies = 0;
  23   1          TMOD=0x02;
  24   1      //  TH0=TL0=0x9b;//12M
  25   1      //  TH0=TL0=0x7a;//16M
  26   1      //  TH0=TL0=0x75;//16.59M
  27   1      //  TH0=TL0=0x72;//17M
  28   1      //  TH0=TL0=0x37;//24M
  29   1          TH0=TL0=0x40;//22M
  30   1          EA=1;
  31   1          ET0=1;
  32   1      
  33   1          TR0=1;
  34   1      }
  35          void init_serialcomm(void)
  36          {
  37   1          SCON  = 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr 
  38   1          TMOD |= 0x20;       //TMOD: timer 1, mode 2, 8-bit reload 
  39   1          PCON |= 0x80;       //SMOD=1; 
  40   1          TH1   = 0xFF;       //Baud:4800  fosc=11.0592MHz  :f4
  41   1          //IE   |= 0x90;       //Enable Serial Interrupt 
  42   1          TR1   = 1;          // timer 1 run
  43   1          RI=0;
  44   1          TI=1; 
  45   1      }
  46          
  47          void serial_out(unsigned char d){
  48   1          while(!TI);
  49   1          TI=0;
  50   1          SBUF=(d);
  51   1      }
  52          
  53          //等待指定长度的串行数据到达,超时值为每两个字节之间的间隔时间而非等待整个串的时间.
  54          //超时单位为time_out * 100uS
  55          bit wait_serial(unsigned char *p, unsigned char len, unsigned char time_out){
C51 COMPILER V8.16   TEST                                                                  11/17/2008 15:31:21 PAGE 2   

  56   1          unsigned int time=jiffies;
  57   1          unsigned char n=0;
  58   1          do{
  59   2              if (RI){
  60   3                  p[n++]=SBUF;
  61   3                  RI=0;
  62   3                  if(n==len)
  63   3                      return 0;
  64   3                  time=jiffies;
  65   3              }
  66   2          }while(jiffies-time < time_out);
  67   1          return 1;
  68   1      }
  69          
  70          #define W_LP 6  //低电平/前引导
  71          #define W_HP 12 //高电平
  72          #define W_FS 18 //引导/结束
  73          #define HEAD_CODE 100   //前导码个数
  74          
  75          #define DEBUG 0
  76          
  77          #define W_BUF_LEN 24
  78          unsigned char w_buf[W_BUF_LEN];
  79          
  80          unsigned char w_recv_step=0;
  81          unsigned char w_recv_data;
  82          unsigned char w_recv_last_time; //上一次翻转的时间
  83          unsigned char w_recv_width; //脉冲宽度
  84          bit w_recv_status,w_recv_last_status;
  85          bit recv_over = 0;
  86          #define START_RECV() {w_recv_step=0; recv_over=0;}
  87          #define STOP_RECV() {recv_over=1;}
  88          void w_recv(void){
  89   1          //正式写程序时,应在调用该函数前就做检测,以节省时间.以下检测应删去.
  90   1          if(recv_over)
  91   1              return;
  92   1      
  93   1          w_recv_status=W_IN;
  94   1          LED1=!w_recv_status;
  95   1      
  96   1          if (w_recv_last_status == w_recv_status){//信号脚无变化,无信号到达,直接返回,返回前仅处理超时.
  97   2              if (w_recv_step == 0)//w_recv_step==0时无需处理超时
  98   2                  return;
  99   2              w_recv_width = w_timer - w_recv_last_time;
 100   2              if (w_recv_width > W_FS + W_LP/2){//超时处理
 101   3                  w_recv_step = 0;
 102   3      #if DEBUG
                          //serial_out(0x53);
                          //serial_out(w_recv_width);
              #endif
 106   3              }
 107   2              return;
 108   2          }
 109   1          w_recv_last_status = w_recv_status;//记下本次电平值
 110   1          w_recv_width = w_timer - w_recv_last_time;//如果上一个信号已完成,记录信号宽度,如果当前为第一个信号,该

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -