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

📄 lesson8.lst

📁 51光电编码器实现
💻 LST
字号:
C51 COMPILER V8.08   LESSON8                                                               04/10/2009 16:18:05 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE LESSON8
OBJECT MODULE PLACED IN lesson8.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE lesson8.c DEBUG OBJECTEXTEND

line level    source

   1          /*-------------------------------------------------------------/
   2          //                  51接收光电旋钮信号 发送键值编码 
   3          //按键中断  int0,1     
   4          // 扫描旋钮扭动  
   5          /*------------------------------------------------------------*/
   6          
   7          
   8          #include<reg52.h>
   9          #define uchar unsigned char
  10          #define uint unsigned int
  11          #define ulint unsigned long int
  12          
  13          
  14          //键盘以及PS2接口   
  15          sbit PS_DATA=P0^0;  //用P0。0   Z做数据线
  16          sbit PS_CLK=P0^1;  //用p0.1做时钟线     
  17          
  18          
  19          sbit key_an=P3^2;       //确定键 
  20          sbit key_down=P3^3;      //向上旋动 
  21          sbit key_up=P3^4;        //向下旋动 
  22          
  23          sbit beep=P2^3;  //蜂鸣器指示  
  24          
  25          uint En_num; //按键时间间隔计数 
  26          uchar key_flag;          //按键时间差标志 循环次数标志   
  27          
  28          uchar num,count,send_flag;
  29          uint  n_flag,AD_count;
  30          
  31          
  32          uchar  Plus_send();      //发送脉冲  
  33          
  34          
  35          void delayus(unsigned int us)   
  36          {
  37   1          while(--us) ;
  38   1      }
  39          
  40          void Delay1ms(unsigned int x)//延时1ms
  41           {
  42   1         unsigned char j;
  43   1         while(x--)
  44   1          {
  45   2           for(j=0;j<125;j++)
  46   2            {;}
  47   2          }
  48   1        }              
  49          
  50          
  51          //液晶初始化+++定时器+++中断  初始化  
  52          void init()
  53          {       
  54   1          send_flag=0;
  55   1          AD_count=0;
C51 COMPILER V8.08   LESSON8                                                               04/10/2009 16:18:05 PAGE 2   

  56   1              n_flag=18;               //脉宽量程 标志 
  57   1      
  58   1              num=0;
  59   1              count=0;
  60   1              key_flag=1;                             
  61   1              En_num=0;       
  62   1      
  63   1         // 定时器+++中断  初始化  
  64   1      
  65   1         TMOD=0x22;//设置定时器1为工作方式2   (做串口波特率发生器  )    定时器T0工作方式 2(按键时间间隔)              
  66   1              TH1=0xfd;       //初值  波特率9600
  67   1              TL1=0xfd;
  68   1              TH0=0;          //计数256us  
  69   1              TL0=0;
  70   1              TR1=1;     //启动定时器
  71   1              TR0=1;     //启动定时器
  72   1              
  73   1      
  74   1              ET0=1;  
  75   1              EA=1;   //所有中断  允许          
  76   1              EX0=1;   //允许INT 0
  77   1              EX1=1;   //允许INT 0
  78   1        
  79   1      }
  80          
  81          
  82          /****************************************************/
  83          //PS/2发送函数 
  84          // 发送一个编码  
  85          /****************************************************/            
  86          void  PS_send(uchar x)
  87          {
  88   1       
  89   1        uchar i,temp,char_temp;
  90   1        bit flag_check=1;              //奇数偶校验位     
  91   1        Delay1ms(3);
  92   1        temp=x;
  93   1        
  94   1        for(i=0;i<8;i++)
  95   1        {
  96   2                char_temp=temp&0x01;
  97   2                if(char_temp==0x01)
  98   2                 {
  99   3                       flag_check=!flag_check; //获得奇偶校验位
 100   3                 
 101   3                 }
 102   2                 temp=temp>>1;
 103   2        }
 104   1        PS_CLK=1;
 105   1        while(!PS_CLK)
 106   1         {
 107   2         ;
 108   2         }
 109   1        PS_CLK=1;
 110   1        PS_DATA=1;
 111   1        if(PS_CLK==1)
 112   1        {
 113   2              delayus(30);
 114   2        
 115   2        }
 116   1        ////提示发送开始
 117   1         if(PS_CLK==1&&PS_DATA==1)
C51 COMPILER V8.08   LESSON8                                                               04/10/2009 16:18:05 PAGE 3   

 118   1        {
 119   2          PS_DATA=0;                             //起始位为0
 120   2              delayus(10);
 121   2              PS_CLK=0;
 122   2              delayus(5);
 123   2              temp=x;                                 
 124   2              for(i=0;i<8;i++)                   //发送8位数据位
 125   2              {
 126   3              
 127   3                PS_CLK=1;
 128   3                delayus(5);
 129   3                char_temp=temp&0x01;
 130   3      
 131   3                      if(char_temp==0x01)
 132   3                      {PS_DATA=1;}
 133   3                      else
 134   3                      {PS_DATA=0;}
 135   3              
 136   3               delayus(10);
 137   3               PS_CLK=0;
 138   3               delayus(5);
 139   3               temp=temp>>1;  
 140   3         }
 141   2        
 142   2        PS_CLK=1;
 143   2        delayus(5);
 144   2        PS_DATA=flag_check;     //发送奇偶校验    
 145   2        delayus(10);
 146   2        PS_CLK=0;
 147   2        delayus(5);
 148   2        PS_CLK=1;
 149   2        delayus(5);
 150   2        PS_DATA=1;                            //发送停止位
 151   2        delayus(10);
 152   2        PS_CLK=0;
 153   2        delayus(5);
 154   2        PS_CLK=1;
 155   2        }
 156   1        delayus(30);
 157   1        PS_CLK=1;PS_DATA=1;
 158   1        if(PS_CLK==1&&PS_DATA==0)
 159   1        {
 160   2               return;     
 161   2        
 162   2        }
 163   1                  
 164   1       }
 165          void main()
 166          {
 167   1              init();   
 168   1              while(1)
 169   1              { 
 170   2                      if(key_up==1&key_down==1)
 171   2                       {
 172   3                          while(key_up);
 173   3                              if(key_down==1)
 174   3                              {
 175   4                                      PS_send(0xE0);   
 176   4                               PS_send(0x75);
 177   4                          }
 178   3                              else
 179   3                              {
C51 COMPILER V8.08   LESSON8                                                               04/10/2009 16:18:05 PAGE 4   

 180   4                              
 181   4                                      PS_send(0xE0);   
 182   4                               PS_send(0x72);
 183   4                                
 184   4                              }
 185   3      
 186   3                       }
 187   2      
 188   2              }          
 189   1              
 190   1      }                               
 191          /**********************************/
 192          //        发送负脉冲   
 193          //      n_flag 设定发送的量程    
 194          /**********************************/
 195           void timer0() interrupt 1   //定时器0中断为中断1 
 196          {
 197   1            
 198   1               En_num++;
 199   1               if(En_num>=1000) //1秒 
 200   1               {
 201   2                      En_num=0;
 202   2                      key_flag=0;//表示超过了时间差   
 203   2               }               
 204   1      
 205   1      }
 206          
 207          
 208          //脉宽增加--按键中断  
 209          void int_key_up() interrupt 0//外部中断0为中断0
 210          { 
 211   1      
 212   1        EX0=EX1=0;//先关外部中断0                
 213   1        Delay1ms(10); 
 214   1        if(key_an==0) //延时消抖 key_up是按键 应管脚 。               
 215   1        {       
 216   2              if(key_flag==0)    //时间间隔超过0.5S
 217   2              { 
 218   3               PS_send(0x0D);                   //发送Tab
 219   3                 key_flag=1;
 220   3                 En_num=0;    
 221   3      
 222   3              } 
 223   2              else
 224   2              {               
 225   3               PS_send(0x5A);                    //发送enter    5a 29
 226   3               En_num=0;        
 227   3                
 228   3               }
 229   2        }             
 230   1        while(!key_an);         
 231   1         EX0=EX1=1;//重新开外部中断   
 232   1        }
 233          
 234          //脉宽减少-按键中断  
 235          void int_key_down() interrupt 2//外部中断1是中断2
 236          {       
 237   1              
 238   1      
 239   1       
 240   1      }       
 241          
C51 COMPILER V8.08   LESSON8                                                               04/10/2009 16:18:05 PAGE 5   



MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    402    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     10    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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