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

📄 complete.lst

📁 小车单片机数据采集程序包括红外线、超声波、罗盘以及跟上位机ARM7的串口通讯。
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V6.12  COMPLETE                                                               01/19/2007 19:57:22 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE COMPLETE
OBJECT MODULE PLACED IN .\complete.OBJ
COMPILER INVOKED BY: G:\keil\C51\BIN\C51.EXE .\complete.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*
   2          * All rights reserved.
   3          * 文件名称:complete.c
   4          * 作 者:王喜勤
   5          * 完成日期:2007年1月19日
   6          */
   7          #include <reg52.h>
   8          #include <stdio.h>
   9          #include <intrins.h>
  10          #define uchar unsigned char
  11          uchar a;        
  12          uchar  bdata select;//选通道值
  13          sbit flag0=select^0;
  14          sbit flag1=select^1;
  15          sbit flag2=select^2;
  16          
  17          unsigned int count1,count2,tmp4,tmp5;   //count1,count2为超声波用
  18          float count;
  19          sbit P0_0=P0^0;
  20          sbit P0_1=P0^1;
  21          sbit P0_2=P0^2;
  22          sbit P0_3=P0^3;
  23          
  24          
  25          sbit re_de1=P0^4;
  26          sbit re_de2=P0^5;
  27          sbit re_de3=P0^6;
  28          uchar code meter_address_return[2]={0xac,0xca};    //设置RS485接口接收端所使用变量的定义与说明.      
  29          float idata array1[8]={5.142,6,7,7,8,8,8,8}; //超声波数组
  30          float idata array2[5]={6.587,256,6.78,4,5};         //红外数组.
  31          float idata array3[2]={5.148,78.09};                //码盘.
  32          float idata array4=57.1987;                         //罗盘.
  33          uchar idata transfer[8]={0};                        //sprintf函数使用的数组。 
  34          uchar idata meter_address[2]={0xac,0xca};    //设置RS485接口接收端所使用变量的定义与说明.
  35          uchar idata rs485_status=0x00;               //RS485接口在数据接收过程中所处的状态.
  36          uchar idata rs485_data;           //RS485接口所接收的数据.
  37          uchar idata m_meteraddrc=0x00;    //数据帧地址段计数器.
  38          uchar idata m_meterdatlen;   //数据帧数据段的长度.
  39          uchar idata m_meterdatbuf[8];//数据帧数据段.
  40          uchar idata m_meterdatac;    //数据帧数据段计数器.
  41          uchar idata m_metercheck=0x00;    //数据帧累加和检验码.
  42          uchar idata m_metersyscheck=0x00; //中断接收程序计算所得到的累加和校验码.
  43          uchar idata m_sendaddrcode;   //发送方地址
  44          uchar idata m_receiveaddrcode;//接收方地址.
  45          
  46          
  47          uchar d,e;
  48          uchar bdata c;     //定义C可位寻址的字节
  49          uchar z[5];   //定义一个数组用于接收5路红外线的信息
  50          sbit z0=c^0; //z0为第0路红外.
  51          sbit z1=c^1; //z1为第1路红外.
  52          sbit z2=c^2; //z2为第2路红外.
  53          sbit z3=c^3; //z3为第3路红外.
  54          sbit z4=c^4; //z4为第4路红外.
  55          sbit e1=P1^5;  
C51 COMPILER V6.12  COMPLETE                                                               01/19/2007 19:57:22 PAGE 2   

  56          sbit e2=P1^6;
  57          sbit e3=P1^7;
  58          
  59          
  60          uchar dis1,dis2;    //分别记录tmp1,tmp2有值 
  61          int count3,count4;   //count3,count4码盘计数用.
  62          #define r 0.022
  63          uchar  tmp1,tmp2;
  64          sbit P0_7=P0^7;
  65          
  66          
  67          
  68          
  69          
  70          
  71          /*超声波测距,中断处理*/
  72          void interrupt0() interrupt 0                 //外部中断int0
  73          {
  74   1      	TR0=0;                                   //停止定时器,测距
  75   1      	tmp4=TL0;tmp5=TH0;                       //读入TL0和TH0数据
  76   1       	count1=tmp4+tmp5*256;                    //读TH0,TL0中的值,
  77   1      	count=(count1-51712)*12/(11.0592*1000000)*337.57/2;//在常温为10摄氏度为337.57m/s.
  78   1          a=1;
  79   1          if(count<0.265)
  80   1          { count=-1;
  81   2      	}
  82   1      	 
  83   1                       
  84   1      }
  85          
  86          void timer0_int() interrupt 1               //定时器T0溢出中断
  87          {
  88   1      	TR0=0;       
  89   1      	count=0;                              //返回0表明无障碍物
  90   1      	a=1;
  91   1      
  92   1      }
  93          
  94          
  95          void interrupt1() interrupt 2           //  外部INT1中断.
  96          { 
  97   1           e=P1;
  98   1      	 e=e^0xff;
  99   1      	 c=e;        //把值赋给c
 100   1      	 IE1=0;      //清外部1.
 101   1      	 EX1=0;     //关闭外部中断1.
 102   1      	 z[0]=z0;   //以下把红外线信息放入到z数组中去.
 103   1      	 z[1]=z1;
 104   1      	 z[2]=z2;
 105   1      	 z[3]=z3;
 106   1      	 z[4]=z4;
 107   1       
 108   1      }
 109          
 110          //计算车轮走过的路程。 
 111          float road(int a,uchar b)     //计算车轮走过的路程。
 112          {    
 113   1           float sum=0;    //路程。
 114   1           sum=a*2*2*3.14*r+2*b*2*3.14*r/8;
 115   1      	 return(sum);
 116   1      }
 117          
C51 COMPILER V6.12  COMPLETE                                                               01/19/2007 19:57:22 PAGE 3   

 118          
 119          //数据通信用.
 120          void delayms(int ms)//采用11.0592MHZ晶振,若理论上5ms,实际检测为5.2ms
 121          // 延时程序。
 122          {						
 123   1      	unsigned char i;
 124   1      	while(ms--)
 125   1      	{
 126   2      		for(i = 0; i < 120; i++);
 127   2      	}
 128   1         
 129   1      }
 130          
 131          void send_frame()           //发送一个数据帧
 132          {
 133   1           
 134   1           uchar data i;
 135   1           re_de1=0;     //设置RS485进入发送状态.设置MAX485(3)接收
 136   1           re_de2=0;     //设置MAX485(2)接收
 137   1           re_de3=1;     //设置MAX485(1)发送.
 138   1             
 139   1           m_metercheck=0x00;   //和校验清零.
 140   1           SBUF=0xac;           //发送帧起始符.
 141   1           while(!TI);
 142   1      	 TI=0;
 143   1      	 m_metercheck+=0xac;  //更新累加和的校验信息
 144   1           SBUF=0xca;           
 145   1           while(!TI);
 146   1      	 TI=0;
 147   1      	 m_metercheck+=0xca;  //更新累加和的校验信息
 148   1           SBUF=m_sendaddrcode;      //发送发送方地址信息.
 149   1           while(!TI);
 150   1      	 TI=0;  
 151   1      	 m_metercheck+=m_sendaddrcode;     //更新累加和的校验信息
 152   1           SBUF=m_receiveaddrcode;           //发送接收方的地址信息.
 153   1           while(!TI);
 154   1      	 TI=0;
 155   1      	 m_metercheck+=m_receiveaddrcode;  //更新累加和的校验信息
 156   1           for(i=0;i<8;i++)
 157   1           {
 158   2              SBUF=transfer[i];
 159   2              while(!TI);
 160   2      	    TI=0;
 161   2      	    m_metercheck+=transfer[i];  //更新累加和的校验信息
 162   2           }
 163   1           SBUF=m_metercheck;                 //发送累加和校验码.
 164   1           while(!TI);
 165   1      	 TI=0;
 166   1      	 SBUF=0x55;                         //发送结束符号
 167   1      	 while(!TI);
 168   1      	 TI=0;
 169   1      	 re_de1=1;                          //设置MAX485进入接收状态,设置MAX485(3)发送.
 170   1           re_de2=0; 
 171   1           re_de3=0;                          //设置MAX485(1)接收.
 172   1      }
 173          
 174          
 175          void send_frameagain()     //请求重发函数.
 176          {
 177   1            m_sendaddrcode=0x20;
 178   1            m_receiveaddrcode=0x10;
 179   1            transfer[0]=0xff;
C51 COMPILER V6.12  COMPLETE                                                               01/19/2007 19:57:22 PAGE 4   

 180   1      	  transfer[1]=0xff;
 181   1      	  transfer[2]=0xff;
 182   1      	  transfer[3]=0xff;
 183   1      	  transfer[4]=0xff;
 184   1      	  transfer[5]=0xff;
 185   1      	  transfer[6]=0xff;
 186   1      	  transfer[7]=0xff;
 187   1      	  send_frame();
 188   1      }
 189          
 190          void send_ultrasonic()             //发送超声波信息函数。
 191          {
 192   1           uchar i;
 193   1      	 m_sendaddrcode=0x30;
 194   1           m_receiveaddrcode=0x10;
 195   1           for(i=0;i<8;i++)
 196   1           {
 197   2              sprintf(transfer,"%8.4f",array1[i]);  //将一路超声波信息转换为8个ASCII。
 198   2              m_sendaddrcode=0x30+i;
 199   2              send_frame();
 200   2          }
 201   1      }
 202          
 203          void send_mapan()                             //发送码盘信息函数。
 204          {
 205   1           uchar i;
 206   1      	 m_sendaddrcode=0x40;
 207   1           m_receiveaddrcode=0x10;
 208   1           for(i=0;i<2;i++)
 209   1           {
 210   2              sprintf(transfer,"%8.4f",array3[i]);  //将一路码盘信息转换为8个ASCII。
 211   2              m_sendaddrcode=0x40+i;
 212   2              send_frame();
 213   2          }
 214   1      }
 215          void send_compass()
 216          {    
 217   1            m_sendaddrcode=0x50;
 218   1            m_receiveaddrcode=0x10;
 219   1            sprintf(transfer,"%8.4f",array4);    //将罗盘信息转换为8个ASCII。
 220   1            send_frame();                                                   
 221   1      }             
 222                        
 223          
 224          
 225          
 226          void com_isp()interrupt 4 using 1  //接收RS485的接口从ARM上传来的数据.

⌨️ 快捷键说明

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