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

📄 serial.lst

📁 rs485串口通讯程序,对大家很有帮助,
💻 LST
字号:
C51 COMPILER V7.06   SERIAL                                                                06/19/2007 14:12:47 PAGE 1   


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

stmt level    source

   1          /*****************************************************************/ 
   2          /*                                                               */                                       
             -                         
   3          /*名称:             RS232通信+数码管显示程序                    */                                       
             -                                                                                                                        
             -            
   4          /*功能:           在数码管上显示串口发过来的数字                */                                       
             -             
   5          /*难度等级:                   高                                */                                       
             -                              
   6          /* 作者:                  zengrenliang                          */
   7          /* 版权:           http://www.51kaifa.com                       */
   8          /*编写日期:        2006.05.19                                   */                                       
             -                                                                                                                        
             -                                              
   9          /*****************************************************************/
  10          
  11          #include <reg52.h>
  12          #define uchar  unsigned char
  13          
  14          bit receive;  //接收标志
  15          bit re_finish;//接收一串字符完成标志
  16          sbit lck = P3^5;//HC574锁存信号
  17          sbit LED = P1^3;//串口通信指示
  18          sbit addr0 = P1^4;//系统片选地址线0
  19          sbit addr1 = P1^5;//系统片选地址线1
  20          sbit addr2 = P1^6;//系统片选地址线2
  21          sbit addr3 = P1^7;//系统片选地址线3
  22          
  23          uchar  i,buffer[8];//串口缓冲区
  24          uchar  cash[8];    //数码管显示缓冲区
  25          uchar  sbuffer,number;//发送字符个数
  26          uchar  sendFINS ;  //发送完成标志
  27          uchar  copyOK , cmd_numb ;//发送缓冲区填充完成标志
  28          
  29          //数码管位扫描数据
  30          uchar code scan[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//row0--row7
  31          
  32          //数码管数字码表
  33          
  34          uchar code table[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,//0,1,2,3,4,5
  35                                 0x82,0xf8,0x80,0x90,0x88,0x83,//6,7,8,9,a,b
  36                                 0xc6,0xa1,0x86,0x8e,0xbf,0xff};//c,d,e,f,-,空格
  37          
  38          void  delay(unsigned int loop); //延时函数声明
  39          
  40          
  41          /********************************系统初始化函数************************/
  42          
  43          void initial(void)
  44          {  uchar j;
  45   1        
  46   1         
  47   1         SCON=0x50;           //串口工作方式1,允许接收
  48   1         PCON=0x80;           //波特率翻倍
C51 COMPILER V7.06   SERIAL                                                                06/19/2007 14:12:47 PAGE 2   

  49   1         TCON=0;              
  50   1         TMOD=0x26;           //T1用于串口波特率控制
  51   1         TL1=0xfa;            //初始化T1,波特率为9600(晶振11.0592M)
  52   1         TH1=0xfa;                    
  53   1         TR1=1;               //开定时器
  54   1         EA=1;                //开总中断
  55   1         ES=1;                //开串口中断
  56   1         copyOK = 0;         //缓冲区准备好标志清零
  57   1         receive = 0;        //接收标志清零
  58   1         re_finish = 0;      //接受完成标志清零
  59   1         cmd_numb = 0;       //接受计数器清零
  60   1         P1 = 0xb0;           //RS485允许接收
  61   1        for(j=0; j<8; j++)   //串口缓冲区清空
  62   1            buffer[j] = 17;  //table[18]为空显示   
  63   1        for(j=0; j<8; j++)   //串口缓冲区清空
  64   1            cash[j] = 17;  //table[18]为空显示 
  65   1        cash[0] = 15;   
  66   1       }                        
  67          
  68          
  69          /************************向串口发送字符串*************************/
  70          
  71          void  send(void)
  72           { 
  73   1         P1 = 0xf0;
  74   1         if(copyOK)  //串口准备好且缓冲区准备好
  75   1          { 
  76   2           i = 0;                 
  77   2           REN = 0;               //发送过程中禁止接收数据
  78   2           copyOK = 0;            //清缓冲区准备好标志
  79   2           SBUF = cash[i++];      //发送字符串首字符
  80   2           number = 7;            //置发送计数器
  81   2            }
  82   1         else
  83   1             return;              //没准备好则返回
  84   1        }
  85          
  86          
  87          /*****************************串口中断响应处理函数***********************/
  88          
  89          void serial(void) interrupt 4
  90          {  uchar k;
  91   1        if(RI)//为接收中断
  92   1           {      
  93   2            RI=0;                                         //清接收中断标志
  94   2             LED = ~LED;                                  //闪串口指示LED
  95   2            sbuffer = SBUF;                               //读取串口缓冲区数据
  96   2      
  97   2            if((sbuffer == 's') && (receive == 0))       //判断是否为数据头 ,是数据头则准备接收
  98   2             {     
  99   3                 receive = 1;     //开始接收标志                         
 100   3                 cmd_numb = 0;    //清接收计数器
 101   3                 re_finish = 0;   //清接收完成标志
 102   3                }
 103   2            else if(sbuffer == 'e')   //判断数据尾     
 104   2              { 
 105   3                if(cmd_numb<8)//接收到的字符少于8个
 106   3                  for(k=cmd_numb;k<8;k++)//则空位填空显示
 107   3                    buffer[k] = 17;
 108   3                re_finish = 1;         //置接收完成标志      
 109   3                receive =0;            //清接收标志
 110   3                }
C51 COMPILER V7.06   SERIAL                                                                06/19/2007 14:12:47 PAGE 3   

 111   2            else if(receive){     //判断当前是否处于接收状态
 112   3                         
 113   3                buffer[cmd_numb++] = sbuffer-'0';  //当前字符送缓冲区
 114   3               }      
 115   2            else                    //无效命令则返回
 116   2               return;
 117   2             }
 118   1          else{ 
 119   2           TI=0;                   //为单个字符发送完中断
 120   2           if(!number)             //字符串发送完
 121   2            { REN = 1;             //单片机允许接收
 122   3              P1 = 0xbf;           //RS485允许接收
 123   3             }
 124   2           else{                  //字符串未发送完
 125   3              SBUF =  cash[i++];   //发送下一字符
 126   3                      number--;           //发送字符数减一
 127   3             }             
 128   2           }
 129   1         }
 130          
 131          /*****************************延时函数**********************/
 132          void  delay(unsigned int loop) 
 133          {  unsigned int i ;          //loop 为执行空指令的次数,改变它可一改变延时时长
 134   1        for(i=0;i<loop;i++);      //循环执行空指令loop次,达到延时目的
 135   1       }
 136          
 137          
 138          /******************************数码管显示扫描*************************/
 139          
 140          void ledscan()
 141          {  uchar i;  
 142   1      
 143   1          for(i=0;i<8;i++){
 144   2             P2 = 0xff;//关闭所有数码管
 145   2             addr3 = 0;
 146   2             addr0 = 0;
 147   2             addr1 = 1;
 148   2             addr2 = 0;//开发板上U4(74HC574)的片选地址
 149   2             P0 =table[cash[i]]; //取一行显示数据 
 150   2             addr3 = 1; 
 151   2             addr3 = 0;//在U4的11脚(锁存信号)产生上升沿
 152   2             P2 = scan[i];//取row0--row7行扫描数据
 153   2             delay(50); //延时50us
 154   2             }
 155   1       }
 156          
 157          /********************************主函数****************************/
 158          
 159          main()
 160          {
 161   1        initial(); 
 162   1        while(1){//主循环
 163   2          if(re_finish){//把串口缓冲区的内容送到显示缓冲区    
 164   3          cash[0] = buffer[0];
 165   3          cash[1] = buffer[1];
 166   3          cash[2] = buffer[2];
 167   3          cash[3] = buffer[3];
 168   3          cash[4] = buffer[4];
 169   3          cash[5] = buffer[5];
 170   3          cash[6] = buffer[6];
 171   3          cash[7] = buffer[7];
 172   3          re_finish = 0;//接收完成标志
C51 COMPILER V7.06   SERIAL                                                                06/19/2007 14:12:47 PAGE 4   

 173   3          copyOK=1;//发送缓冲区填充完成标志
 174   3          send();  //把显示缓冲区的内容发送给电脑
 175   3          }
 176   2         ledscan(); //循环扫描数码管   
 177   2         }
 178   1       }
 179          /**********************************结束****************************/


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    328    ----
   CONSTANT SIZE    =     26    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     22    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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