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

📄 93c46.lst

📁 8051 SPI_93c46 c语言程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.06   93C46                                                                 06/19/2007 13:22:16 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE 93C46
OBJECT MODULE PLACED IN 93c46.OBJ
COMPILER INVOKED BY: E:\Program Files\C51\BIN\C51.EXE 93c46.C BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          
   2          /*****************************************************************/ 
   3          /*                                                               */                                       
             -                         
   4          /*名称:                   93C46读写程序                         */                                       
             -                                                                                                                        
             -            
   5          /*功能:           接收串口发来的数据,写到93C46里面             */
   6          /*                 再从93C46里读出刚写进的数据,由串口发出       */                               
   7          /*难度等级:                   高                                */                                       
             -                              
   8          /* 作者:                  zengrenliang                          */
   9          /* 版权:           http://www.51kaifa.com                       */
  10          /*编写日期:        2006.05.21                                   */                                       
             -                                                                                                                        
             -                                              
  11          /*****************************************************************/
  12          
  13          #include <reg52.h>
  14          #define uchar  unsigned char
  15          #define uint unsigned int
  16          sbit SK=P1^0;//SPI时钟线
  17          sbit DI=P1^5;
  18          sbit DO=P1^6;//SPI数据线
  19          sbit LCK = P3^5;
  20          bit receive;//接收标志
  21          bit re_finish;//接收一串字符完成标志
  22          sbit LED = P1^2;//LED指示灯
  23          
  24          uchar  i,buffer[8],cbuffer[8];//串口缓冲区
  25          uchar  sbuffer,number;//发送字符个数
  26          uchar  sendFINS ;//发送完成标志
  27          uchar  copyOK , cmd_numb ;//发送缓冲区填充完成
  28          
  29          void  send(void);
  30          void  vGet_Send(void);
  31          void  delay(unsigned int loop);
  32          void ReadString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number);
  33          void WriteString(unsigned char data *RamAddress,unsigned char RomAddress,unsigned char Number);
  34          
  35          /*******************************系统初始化***********************/
  36          void initial()
  37          {  unsigned char j;
  38   1        
  39   1         SCON=0x50;           //串口工作方式1,允许接收
  40   1         PCON=0x80;           //波特率翻倍
  41   1         TCON=0;              
  42   1         TMOD=0x26;           //T1用于串口波特率控制
  43   1         TL1=0xfa;            //初始化T1,波特率为9600(晶振11.0592M)
  44   1         TH1=0xfa;                    
  45   1         TR1=1;               //开定时器
  46   1         EA=1;                //开总中断
  47   1         ES=1;                //开串口中断
  48   1         copyOK = 0;         //缓冲区准备好标志清零
  49   1         receive = 0;        //接收标志清零
C51 COMPILER V7.06   93C46                                                                 06/19/2007 13:22:16 PAGE 2   

  50   1         re_finish = 0;      //接受完成标志清零
  51   1         cmd_numb = 0;       //接受计数器清零
  52   1         LCK = 0;
  53   1         P0 = 0xf7;//关闭所有指示灯
  54   1         LCK = 1;
  55   1      
  56   1        for(j=0; j<8; j++)   //串口缓冲区清空
  57   1            buffer[i] = 0xff;  //table[18]为空显示    
  58   1       }                        
  59          
  60          /******************************主函数**************************/
  61          
  62          main()
  63          { 
  64   1        initial();
  65   1        while(1){
  66   2          if(re_finish){//接收一串字符完成
  67   3            re_finish = 0;  
  68   3            vGet_Send();
  69   3             }
  70   2          }
  71   1       }
  72          
  73          /*****************************保存和串口发送**************************/
  74          void  vGet_Send(void)
  75          { uchar i;       
  76   1         
  77   1        WriteString(buffer,0x10,6);//数据存放初始地址为0x10
  78   1      
  79   1         delay(1000);  
  80   1      
  81   1        for(i=0;i<8;i++)
  82   1            buffer[i] = 0x5f; //用0xff填充发送缓冲区
  83   1      
  84   1        ReadString(buffer,0x10,6);//读数据
  85   1        copyOK = 1;           //置准备好标志
  86   1        send();               //向串口发送
  87   1      }
  88          
  89          /*****************************串口发送***************************/
  90          
  91          void  send(void)//向串口发送字符串
  92           { 
  93   1         
  94   1         if(copyOK)  //串口准备好且缓冲区准备好
  95   1          { 
  96   2           i = 0;                 
  97   2           REN = 0;               //发送过程中禁止接收数据
  98   2           copyOK = 0;            //清缓冲区准备好标志
  99   2           SBUF = cbuffer[i++];      //发送字符串首字符
 100   2           number = 7;            //置发送计数器
 101   2            }
 102   1         else
 103   1             return;              //没准备好则返回
 104   1        }
 105          
 106          
 107          /***************************串口中断响应*************************/
 108          
 109          void serial(void) interrupt 4//串口中断响应
 110          {  
 111   1        if(RI)//为接收中断
C51 COMPILER V7.06   93C46                                                                 06/19/2007 13:22:16 PAGE 3   

 112   1           {      
 113   2            RI=0;                                         //清接收中断标志
 114   2            LED = ~LED;                                   //闪串口指示LED
 115   2            sbuffer = SBUF;                               //读取串口缓冲区数据
 116   2      
 117   2            if((sbuffer == 's') && (receive == 0))       //判断是否为数据头 ,是数据头则准备接收
 118   2             {     
 119   3                 receive = 1;     //开始接收标志                         
 120   3                 cmd_numb = 0;    //清接收计数器
 121   3                 re_finish = 0;   //清接收完成标志
 122   3                }
 123   2            else if(sbuffer == 'e')   //判断数据尾     
 124   2              { 
 125   3                re_finish = 1;         //置接收完成标志      
 126   3                receive =0;            //清接收标志
 127   3                }
 128   2            else if(receive){     //判断当前是否处于接收状态
 129   3                         
 130   3                cbuffer[cmd_numb++] = sbuffer;  //当前字符送缓冲区
 131   3               }      
 132   2            else                    //无效命令则返回
 133   2               return;
 134   2             }
 135   1          else{ 
 136   2           TI=0;                   //为单个字符发送完中断
 137   2           if(!number)             //字符串发送完
 138   2            { REN = 1;             //允许接收
 139   3             }
 140   2           else{                  //字符串未发送完
 141   3              SBUF =  cbuffer[i++];   //发送下一字符
 142   3                      number--;           //发送字符数减一
 143   3             }             
 144   2           }
 145   1         }
 146          
 147          /*****************************延时函数**************************/
 148          void  delay(unsigned int loop) 
 149          {  unsigned int i ;          //loop 为执行空指令的次数,改变它可一改变延时时长
 150   1        for(i=0;i<loop;i++);//循环执行空指令loop次,达到延时目的
 151   1       }
 152          
 153          
 154          
 155          // **************************允许写入****************************
 156          void Ewen(void) {
 157   1      unsigned char temp,InData;
 158   1         LCK = 0;
 159   1         P0 = 0xf6;
 160   1         LCK = 1;//CS=0;
 161   1      
 162   1         SK=0;
 163   1      
 164   1         LCK = 0;
 165   1         P0 = 0x40;
 166   1         LCK = 1;//CS=1;
 167   1      
 168   1         InData=0x98; // 10011XXXX
 169   1          for(temp=9;temp!=0;temp--) { // 9
 170   2            DI=InData&0x80;
 171   2            SK=1; SK=0;//产生时钟

⌨️ 快捷键说明

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