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

📄 0507新从机.lst

📁 受人之托制作的单片机抢答器。很稳定。但成本高些。
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.50   0507新从籣                                                            05/07/2008 17:57:40 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE 0507新从籣
OBJECT MODULE PLACED IN 0507新从机.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 0507新从机.c BROWSE DEBUG OBJECTEXTEND CODE

line level    source

   1          #include<REG2051.H>
   2          //#include <absacc.h>
   3          #include <intrins.h>
   4          //#define debug
   5          #define uchar unsigned char
   6          sbit ANS= P3^3;  //抢答按键
   7          sbit REQ= P3^4; //发送中断请求。0请求中断
   8          sbit LIGHT= P3^7;//从机抢答灯1灭;0亮
   9          sbit  R_T=P3^5; //控制485接收或发送状态1发送0接收 
  10          
  11          #define SETMODE 0X10
  12          #define STARTMODE 0X20
  13          #define TESTMODE 0X30
  14          #define SWAITMODE 0X80
  15          #define OVERMODE 0X00
  16          
  17          #define RESETCOMMAND 0X01
  18          #define STARTCOMMAND 0X02
  19          #define STOPCOMMAND 0X03
  20          #define TESTCOMMAND 0X04
  21          #define ASKCOMMAND 0X06
  22          #define LAMPCOMMAND 0X09
  23          #define ANSWERCOMMAND 0XA0
  24          
  25          #define NOP {_nop_();_nop_();_nop_();}
  26          //变量定义
  27          uchar data SendData[5]={0x7e,0x00,0x00,0x00,0x7f};//向外发送的数据。0x7E+命令+机器编号+数据+0x7F
  28          uchar data ReceiveData[5]={0x00,0x00,0x00,0x00,0x00};//接收的数据。0x7E+命令+机器编号+数据+0x7F
  29          uchar data mcuWorkState[2]={0x00,0x00};            //从机的工作状态        命令+数据   change可能用不到 删除
  30          uchar data bianhao; //机器编号
  31          uchar data time_5ms;
  32          bit ReceiveEndF=0;//接收命令标志0未接收;1已经接收等待处理。
  33          bit key_enable_bit=0; //键盘锁。1响应键盘;0不响应
  34          bit key=0; 
  35          bit ERR;
  36          
  37          
  38          void iniMCU(void)
  39                  {
  40   1              /*与初始化有关的寄存器
  41   1              
  42   1              计时控制寄存器  TCON    TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
  43   1              与中断相关                              TF1     TF0     IE1 IT1 IE0 IT0
  44   1              定时器相关寄存器        //TH0 //TL0 //TH1 //TL1 
  45   1              计时工作方式    TMOD    GATE C/T M1 M0 GATE C/T M1 M0
  46   1              中断允许寄存器  IE              EA          ES  ET1 EX1 ET0 EX0
  47   1              串口中断寄存器  SCON    SM0 SM1 SM2 REN TB8 RB8 TI  RI
  48   1              中断优先级              IP                          PS  PT1 PX1 PT0 PX0
  49   1              特殊功能寄存器  PCON    SMOD
  50   1              */
  51   1              EA=0;
  52   1              TMOD=0x21;  //置定时器1为方式2,定时器0为方式1
  53   1              SCON=0x50;  //MODE 1  ,ALLOW RECEIVE
  54   1              
  55   1              TL0=0x00;TH0=0xee;
C51 COMPILER V7.50   0507新从籣                                                            05/07/2008 17:57:40 PAGE 2   

  56   1              TR0=1;  //TCON^4 定时器0开始运行
  57   1              ET0=1;
  58   1              
  59   1              TH1=TL1=0x0Fd;//9600 TH1=TL1=0X0FA;//4800
  60   1              TR1=1;  //定时器1开始运行
  61   1      
  62   1              ES=1;   //串口中断允许
  63   1              PS=1;   //串行通信中断优先级
  64   1              TI=0;
  65   1              REN=1; //允许串口接收数据
  66   1              //TB8=1;//在模式2 和模式3 中将被发送数据的第9 位
  67   1              IT0=1;  //外部中断0为边沿触发方式。
  68   1              IE0=0;  //中断请求位清零
  69   1              EX0=0;// 禁止int0
  70   1              LIGHT=1;
  71   1              R_T=0;//接收状态
  72   1              ANS=1;  //抢答按键
  73   1              INT0=1;////中断脚INT0
  74   1              REQ=1;  //发送中断请求。0请求中断
  75   1              EA=1;  //IE= 0x80;中断使能
  76   1              bianhao=P1&0x0f;
  77   1              P1=(~(P1<<4))|0x0f;
  78   1      }
  79          void delay(uchar Wait_time)
  80          {
  81   1      uchar i,j;
  82   1         for (j=0;j<Wait_time;j++)
  83   1                 for (i=0; i<250; i++)   // 1ms
  84   1                     _nop_();
  85   1      }                                 
  86          //发送5字节数据。数据格式见抢答器协议 
  87          void Send_Data(void)
  88          {
  89   1      uchar i;
  90   1              R_T=1;
  91   1              delay(1);
  92   1              NOP;
  93   1              TI=0;
  94   1              for(i=0;i<5;i++)
  95   1                      {
  96   2                      SBUF=SendData[i];
  97   2                      while(TI==0) ;
  98   2                      TI=0;
  99   2                      NOP  //change 
 100   2                      }
 101   1              R_T=0;
 102   1              NOP;
 103   1      }        
 104          //接收数据处理
 105          void RdataCode(void)
 106          {
 107   1      uchar i;
 108   1              if(ReceiveEndF)
 109   1              {
 110   2                      switch(ReceiveData[1])
 111   2                      {
 112   3                              case RESETCOMMAND:
 113   3                                      LIGHT=1;
 114   3                                      NOP
 115   3                                      REQ=1; //关中断请求
 116   3                                      IE0=0;
 117   3                                      EX0=0;//关中断0
C51 COMPILER V7.50   0507新从籣                                                            05/07/2008 17:57:40 PAGE 3   

 118   3                                      key_enable_bit=0;       //**不响应键盘
 119   3                                      NOP
 120   3                                      key=0;    //按键值清零,
 121   3                                      break;
 122   3                              case ASKCOMMAND://轮询命令(主机响应通讯请求后发给从机要求返回数据的命令)
 123   3                                      if (ReceiveData[2]==bianhao)
 124   3                                              {
 125   4                                              key_enable_bit=0;//不再扫描键盘
 126   4                                              REQ=1;//停止通讯请求
 127   4                                              IE0=0;                  
 128   4                                              EX0=0;
 129   4                                              SendData[1]=ANSWERCOMMAND;SendData[2]=bianhao;
 130   4                                              if(key)   SendData[3]=0x01;     
 131   4                                              else   SendData[3]=0x00; 
 132   4                                              Send_Data();
 133   4                                              }
 134   3                                              
 135   3                              break;
 136   3                              case STARTCOMMAND://开始抢答
 137   3                                      if (bianhao>7)    i= (ReceiveData[2]>>(bianhao-8))&0x01;
 138   3                                      else                    i=(ReceiveData[3]>>bianhao)&0x01;        //判断有无此从机号
 139   3                                      if (i==1)                 
 140   3                                              {
 141   4                                              REQ=1; //关中断请求
 142   4                                              LIGHT=1; //灯灭
 143   4                                              IE0=0;
 144   4                                              EX0=1;//开中断0
 145   4                                              key_enable_bit=1;//响应键盘
 146   4                                              key=0;
 147   4                                              }
 148   3                                      break;
 149   3                              case TESTCOMMAND:         //测试模式
 150   3                                      if (ReceiveData[2]==bianhao)
 151   3                                              {
 152   4                                              LIGHT=0;
 153   4                                              NOP
 154   4                                              IE0=0;
 155   4                                              EX0=0;//关中断0
 156   4                                              key_enable_bit=1;//响应键盘
 157   4                                              key=0;
 158   4                                              }
 159   3                              break;
 160   3                              case LAMPCOMMAND://控制从机灯状态
 161   3                                      REQ=1;
 162   3                                      IE0=0;
 163   3                                      EX0=0;//关中断0
 164   3                                      key_enable_bit=0;       //禁止响应键盘
 165   3                                      key=0;
 166   3                                      if (ReceiveData[2]==bianhao)
 167   3                                              {
 168   4                                              if (ReceiveData[3]==0x00)
 169   4                                                      {       LIGHT=1;NOP     }
 170   4                                              else if (ReceiveData[3]==0x01)
 171   4                                                      { LIGHT=0;      NOP     }
 172   4                                              }
 173   3                              break;
 174   3                              default:
 175   3                              break;
 176   3                      }
 177   2                      ReceiveEndF=0;
 178   2              }
 179   1      }  
C51 COMPILER V7.50   0507新从籣                                                            05/07/2008 17:57:40 PAGE 4   

 180          
 181          //按键处理
 182          keycode(void)
 183          {
 184   1      //根据拨码开关点亮lcd
 185   1              bianhao=  P1&0x0f;
 186   1              if (bianhao<1||bianhao>10) 
 187   1                      {
 188   2                      ERR=1;
 189   2                      REQ=1;
 190   2                      IE0=0;
 191   2                      EX0=0;//关中断0
 192   2                      key_enable_bit=0;       //禁止响应键盘
 193   2                      key=0;
 194   2                      P1=0xf0|0x0f;    //黑灯,
 195   2                      LIGHT=1;
 196   2                      NOP
 197   2                      }
 198   1              else    
 199   1                      {
 200   2                      P1=(~(bianhao<<4))|0x0f;
 201   2                      ERR=0;
 202   2                      }
 203   1      //扫描抢答按键
 204   1              if(key_enable_bit&&ERR==0)
 205   1                      {
 206   2                              if(!ANS)
 207   2                              {
 208   3                              if (time_5ms>10)//延时50ms
 209   3                                      {
 210   4                                      IE0=0;
 211   4                                      EX0=0;    //**禁止本机中断
 212   4                                      REQ=0;//通讯请求
 213   4                                      key_enable_bit=0;        //按键完成,申请中断,不再扫按键。
 214   4                                      key=1;                  
 215   4                                      }
 216   3                              }
 217   2                              else {time_5ms=0;}
 218   2                      }
 219   1              else {time_5ms=0;}
 220   1              //return(0);                    
 221   1      }                
 222          void main()
 223          {
 224   1              iniMCU();
 225   1              for(;;){
 226   2              keycode();
 227   2              if (ERR==0)             RdataCode();            
 228   2              }
 229   1      }
 230          
 231          
 232          
 233          
 234          //接收中断
 235          void int0() interrupt 0  using 1
 236          {
 237   1              key_enable_bit=0;
 238   1              key=0; //**禁止本机键盘
 239   1              IE0=0;
 240   1              EX0=0;
 241   1      }
C51 COMPILER V7.50   0507新从籣                                                            05/07/2008 17:57:40 PAGE 5   

 242          //接收数据
 243          void serial() interrupt 4  using 2
 244          {
 245   1              if(RI){
 246   2                      RI=0;
 247   2                      if(ReceiveEndF==0)
 248   2                      {
 249   3                              ReceiveData[0]=ReceiveData[1];
 250   3                              ReceiveData[1]=ReceiveData[2];
 251   3                              ReceiveData[2]=ReceiveData[3];
 252   3                              ReceiveData[3]=ReceiveData[4];
 253   3                              ReceiveData[4]=SBUF;
 254   3                              if(ReceiveData[0]==0x7e&&ReceiveData[4]==0x7f)
 255   3                                      {
 256   4                                      if (ReceiveData[1]<ANSWERCOMMAND)       //if(((bianhao)==ReceiveData[2]) || ReceiveData[2]==0xff)
 257   4                                              { 
 258   5                                              ReceiveEndF=1;
 259   5                                              } 
 260   4                                      }
 261   3                      }                       
 262   2              }
 263   1      }
 264          void timer0() interrupt 1 using 3
 265          {

⌨️ 快捷键说明

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