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

📄 serial.lst

📁 8051单片机上用C写的ps/2的实验程序
💻 LST
字号:
C51 COMPILER V7.06   SERIAL                                                                07/12/2006 00:10:08 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN serial.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE serial.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*
   2          黄 clock 5 红
   3          绿 data  1 黑
   4          黑 地    3
   5          */
   6          #include <reg51.H>
   7          #include <stdio.h>
   8          #include <string.h>
   9          #include "delay.h"
  10          
  11          typedef unsigned char UCHAR;
  12          typedef unsigned long  ULONG;
  13          #define TRUE 1
  14          #define FALSE 0
  15          
  16          //UCHAR ucData = 0,i=0;
  17          UCHAR gucBuf[16] = {0};
  18          UCHAR* pBuf = gucBuf;
  19          //bit isDataReady=0;
  20          //bit canReceive=1;
  21          sbit P1_0 = P1^0;
  22          sbit P2_0 = P2^0;
  23          sbit CLK_SND = P1^1;
  24          sbit DAT_SND = P1^2;
  25          //sbit CLK_RCV = P3^2;
  26          sbit CLK_RCV = P1^3;
  27          sbit DAT_RCV = P1^0;
  28          ULONG tick = 0, prevtick = 0;
  29          #define LED P0
  30          UCHAR bitCount = 0;
  31          
  32          bit checkP(UCHAR fr);
  33          void rcvBit(UCHAR i);
  34          void exint0_isr(UCHAR i);
  35          
  36          idata UCHAR bTmp[80]={0};
  37          UCHAR frCount = 0;
  38          UCHAR rcvFrCount = 0;
  39          /*
  40          1) Set/Reset Data
  41          2) Delay 20 microseconds
  42          3) Bring Clock low
  43          4) Delay 40 microseconds
  44          5) Release Clock
  45          6) Delay 20 microseconds
  46          */
  47          void sendBit(bit b)
  48          {
  49   1              //bTmp[frCount]=b;
  50   1              //frCount++;
  51   1      
  52   1              DAT_SND=b;
  53   1              delay_u(20);
  54   1              CLK_SND=0;
  55   1              delay_u(40);
C51 COMPILER V7.06   SERIAL                                                                07/12/2006 00:10:08 PAGE 2   

  56   1              CLK_SND=1;
  57   1              delay_u(20);
  58   1      }
  59          
  60          /*
  61          1) Wait for Clock = high.
  62          2) Delay 50 microseconds.
  63          3) Clock still = high?
  64          No--goto step 1
  65          4) Data = high?
  66          No--Abort (and read byte from host)
  67          5) Delay 20 microseconds (=40 microseconds to the time Clock is pulled low in sending the start bit.)
  68          6) Output Start bit (0) \ After sending each of these bits, test
  69          7) Output 8 data bits > Clock to make sure host hasn't pulled it
  70          8) Output Parity bit / low (which would abort this transmission.)
  71          9) Output Stop bit (1)
  72          10) Delay 30 microseconds (=50 microseconds from the time Clock is released in sending the stop bit)
  73          */
  74          void sendFrame(UCHAR fr)
  75          {
  76   1              UCHAR i;
  77   1              while(!CLK_SND)
  78   1              {
  79   2                      //delay_u(50);
  80   2              }
  81   1              //if(!CLK_SND) return;
  82   1              if(!DAT_SND) return;
  83   1              delay_u(20);
  84   1              sendBit(0);
  85   1              for(i=0;i<8;i++)
  86   1              {
  87   2                      sendBit(fr&(1<<i));
  88   2              }
  89   1              sendBit(checkP(fr));
  90   1              sendBit(1);
  91   1              delay_u(30);
  92   1      }
  93          
  94          bit checkP(UCHAR fr)//奇校验
  95          {
  96   1              bit b=1;
  97   1              UCHAR i=0;
  98   1              for(;i<8;i++)
  99   1              {
 100   2                      b^=(fr&0x01);
 101   2                      fr>>=1;
 102   2              }
 103   1              return b;
 104   1      }
 105          
 106          void clock_init() reentrant using 0
 107          {
 108   1              TR0=0;
 109   1              TF0=0;
 110   1              TH0=0xDB;//10ms
 111   1              TL0=0xF0;
 112   1              //TH0=0XFC;
 113   1              //TL0=0X18;
 114   1              TR0=1;
 115   1      }
 116          
 117          bit rcvFrame(UCHAR* pucData)
C51 COMPILER V7.06   SERIAL                                                                07/12/2006 00:10:08 PAGE 3   

 118          {
 119   1              UCHAR i;
 120   1              UCHAR ucData = 0,ucDataTmp = 0;
 121   1              //while(CLK_RCV);
 122   1              //if(CLK_RCV) return FALSE;//时钟为高,表明没有数据
 123   1              //ucData = 0;
 124   1      
 125   1              //首位
 126   1              while(CLK_RCV);//等待时钟线变低
 127   1              while(!CLK_RCV);//等待时钟线变高        
 128   1      
 129   1              //8个数据位
 130   1              for(i=0;i<8;i++)
 131   1              {
 132   2                      while(CLK_RCV);//等待时钟线变低
 133   2                      ucDataTmp = ucDataTmp<<1;
 134   2                      ucDataTmp|=DAT_RCV;
 135   2                      while(!CLK_RCV);//等待时钟线变高
 136   2              }
 137   1      
 138   1              //奇校验位
 139   1              while(CLK_RCV);//等待时钟线变低
 140   1              while(!CLK_RCV);//等待时钟线变高        
 141   1      
 142   1              //末位
 143   1              while(CLK_RCV);//等待时钟线变低
 144   1              while(!CLK_RCV);//等待时钟线变高
 145   1              
 146   1              CLK_RCV = 0;//拉低时钟抑制发送,进行字节序转换
 147   1              for(i=0;i<8;i++)
 148   1              {
 149   2                      ucData=ucData<<1;
 150   2                      ucData|=(ucDataTmp&0x01);
 151   2                      ucDataTmp=ucDataTmp>>1;
 152   2              }
 153   1              *pucData = ucData;
 154   1              printf("\r\n%bu,0x%bx",ucData,ucData);
 155   1              CLK_RCV = 1;
 156   1              return TRUE;
 157   1      }
 158          /*
 159          void rcvBit(UCHAR i)
 160          {
 161                  while(CLK_RCV);//等待时钟线变低
 162                  //CLK = 0;//有数据,拉低时钟,抑制键盘发送,进行处理
 163                  //exint0_isr(i);
 164                  if(1<=i&&i<=8)
 165                  {
 166                          ucData = ucData<<1;
 167                          ucData|=DAT_RCV;
 168                  }
 169                  //CLK = 1;//处理完一位,释放时钟
 170                  while(!CLK_RCV);//等待时钟线变高        
 171          }*/
 172          
 173          void main(void)
 174          {
 175   1              //long j;
 176   1              //unsigned char a;
 177   1              //UCHAR j;
 178   1              //UCHAR ucBuf[16];
 179   1              UCHAR ucData;
C51 COMPILER V7.06   SERIAL                                                                07/12/2006 00:10:08 PAGE 4   

 180   1              bit bRet;
 181   1              
 182   1              //sendFrame(0x87);
 183   1      
 184   1              SCON = 0xD8; //串口方式1,允许接收
 185   1              TMOD |= 0x20; //定时器1 定时方式2
 186   1              TH1 = 0xFD; //12MHz 9600 波特率
 187   1              TL1 = 0xFD;
 188   1              TI = 1;
 189   1              TR1 = 1; //启动定时器
 190   1      
 191   1              //定时器0初始化
 192   1              TMOD|=0X01;
 193   1              TF0=0;
 194   1              clock_init();
 195   1              ET0=1;  
 196   1              EA = 1;
 197   1              IT0=1;
 198   1              EX0=1;
 199   1      
 200   1      
 201   1      
 202   1              while(1)
 203   1              {
 204   2                      //CLK_RCV =1;
 205   2                      bRet = rcvFrame(&ucData);
 206   2                      sendFrame(ucData);
 207   2                      //CLK_RCV = 0;
 208   2                      //if(bRet)
 209   2                      //      printf("\r\n%bu,0x%bx",ucData,ucData);
 210   2                      /*sendFrame(0x1c);
 211   2                      delay_u(200);
 212   2                      sendFrame(0xf0);
 213   2                      delay_u(200);
 214   2                      sendFrame(0x1c);
 215   2                      delay_u(200);*/
 216   2                      //while(!isDataReady);
 217   2      
 218   2                      /*
 219   2                      if(!P2_0)//50ms打印一次
 220   2                      {
 221   2                              EA=0;
 222   2                              memcpy(ucBuf,gucBuf,sizeof(ucBuf));
 223   2                              EA=1;
 224   2      
 225   2                              for(j=0;j<rcvFrCount;j++)
 226   2                              {
 227   2                                      //if(ucBuf[j]==0) break;
 228   2      
 229   2                                      printf("\r\n%bu,0x%bx",ucBuf[j],ucBuf[j]);
 230   2                                      EA=0;
 231   2                                      pBuf = gucBuf;
 232   2                                      memset(gucBuf,0,sizeof(gucBuf));
 233   2                                      rcvFrCount = 0;
 234   2                                      EA=1;
 235   2                              }
 236   2                      }*/
 237   2                      //ucData=0;
 238   2                      //isDataReady=0;
 239   2                      //i=0;//启动接收
 240   2      
 241   2      
C51 COMPILER V7.06   SERIAL                                                                07/12/2006 00:10:08 PAGE 5   

 242   2                      /*if(!P2_0) i=0;
 243   2                      P0=ucData;*/
 244   2              };
 245   1      
 246   1      }
 247          
 248          void clk_int() interrupt 1 using 0
 249          {
 250   1              EA=0;
 251   1              tick++;
 252   1              //if(0==(tick%100)) printf("1");
 253   1              clock_init();
 254   1              EA=1;
 255   1      }
 256          
 257          
 258          //idata char c[100] = {0};
 259          #if 0
              void exint0_isr(UCHAR i) //interrupt 0 using 0
              {
                      //CLK_RCV = 0;
                      EA=0;
                      bitCount++;
                      LED=bitCount;
                      //c[0]=0;
                      /*if(strlen(c)>90)
                              printf("%s",c);
                      if(tick-prevtick>5)//超过50ms,新启一帧
                      {
                              strcat(c,"\r\n");
                      }
                      if(P1_0)
                              strcat(c,"1");
                      else
                              strcat(c,"0");
                      prevtick = tick;*/
                      /*
                      if(tick-prevtick>5)//超过50ms,新启一帧
                      {
                              i=0;
                              ucData=0;
                      }
              */
                      //while(!canReceive)
                      
                      if(0==i) 
                      {       
                              //prevtick = tick;
                              //if(0!=DAT_RCV) goto RET;//首位应为0,否则返回继续等待首位
                      }
                      else if(1<=i&&i<=8)
                      {
                              if(DAT_RCV)
                              {
                                      ucData|=(1<<(i-1));
                              }
                              else
                              {
                                      ucData|=(0<<(i-1));
                              }
                              /*if(8==i)
                              {
C51 COMPILER V7.06   SERIAL                                                                07/12/2006 00:10:08 PAGE 6   

                                      printf("\r\n%bu,0x%bx",ucData,ucData);
                              }*/
                      }
                      else if(9==i)//奇偶检验位
                      {
                      }
                      else if(10==i)//停止位
                      {
                              /*if(1!=P1_0)
                              {
                                      return;
                                      //printf("\r\n接受停止位出错!");
                              }*/
                              //ucData=0;
                              //i=0;
                              //isDataReady = 1;
                              /**pBuf = ucData;
                              rcvFrCount++;
                              pBuf++;*/
                              //ucData=0;
                              //i=0;//启动接收
                              goto RET;
                      }
                      else goto RET;
                      //i++;
                      
              RET:
                      EA=1;
                      //CLK_RCV = 1;
                      return;
                      
              }
              #endif
 337          
 338          /*void delay_u(UCHAR t)
 339          {
 340                  UCHAR i;
 341                  for(i=0;i<t;i++);       
 342          }*/


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    382    ----
   CONSTANT SIZE    =     12    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     31       1
   IDATA SIZE       =     80    ----
   BIT SIZE         =   ----       3
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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