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

📄 7738.lst

📁 24位AD7738与89c51的接口程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V6.23a  7738                                                                  11/21/2006 20:28:16 PAGE 1   


C51 COMPILER V6.23a, COMPILATION OF MODULE 7738
OBJECT MODULE PLACED IN D:\2-7738~1\7738.OBJ
COMPILER INVOKED BY: D:\Program Files\WAVE6000\COMP51\C51.EXE D:\2-7738~1\7738.C DB SB OE

stmt level    source

   1          //--------------------------------------------------------------------------------------------
   2          //程序作用:用AD7738采集数据,由单片机将数据送往上位机
   3          //2006.3 FDY   每个通道连续采样6次,求平均数
   4          //作为本次采集的有效数据
   5          //---------------------------------------------------------------------------------------------
   6          
   7          //--------------------------------------------------------------------------------------------
   8          //头文件以及全局变量定义
   9          //---------------------------------------------------------------------------------------------
  10          #include <reg51.h>
  11          #include <intrins.h>
  12          #include <math.h>
  13          
  14          sbit SCK=P1^1;                 // 将p1.1口模拟时钟输出
  15          sbit MOSI=P1^2;                // 将p1.2口模拟主机输出
  16          sbit MISO=P1^3;                // 将p1.3口模拟主机输入
  17          sbit RDY=P3^2;                 // 数据准备好标志
  18          unsigned long tdata,a,b,c;
  19          float v,d;
  20          float pdata kk;
  21          float v0,v1,v2,v3,v4,v5,v6,v7;
  22          float m1,m2,m3,m4,m5,m6;
  23          float e[6],x;
  24          #define delayNOP(); {_nop_();_nop_();_nop_();};
  25          //---------------------------------------------------------------------------------------------
  26          // 函数名称: delay
  27          // 入口参数: N
  28          // 函数功能: 延时16*N+24
  29          //---------------------------------------------------------------------------------------------
  30          void delay(int N)
  31          {
  32   1         int i;
  33   1         for(i=0;i<N;i++);
  34   1      }
  35          //---------------------------------------------------------------------------------------------
  36          // 函数名称: Write7738
  37          // 入口参数: ch
  38          // 函数功能: 向AD7738发送一个字节
  39          //---------------------------------------------------------------------------------------------
  40          void Write7738(unsigned char ch)
  41          {
  42   1      
  43   1          unsigned char idata n=8;         // 向SDA上发送一位数据字节,共八位
  44   1          SCK = 1 ;                        //时钟置高
  45   1          while(n--)
  46   1              {
  47   2             delayNOP();
  48   2             //delay(3);
  49   2             SCK = 0 ;                     //时钟置低
  50   2             if((ch&0x80) == 0x80)         // 若要发送的数据最高位为1则发送位1
  51   2                   {
  52   3                 MOSI = 1;                 // 传送位1
  53   3                   }
  54   2              else
  55   2                {
C51 COMPILER V6.23a  7738                                                                  11/21/2006 20:28:16 PAGE 2   

  56   3                  MOSI = 0;                 // 否则传送位0
  57   3                }
  58   2                delayNOP();
  59   2                //delay(3);
  60   2              ch = ch<<1;                  // 数据左移一位
  61   2              SCK = 1 ;                    //时钟置高
  62   2              }
  63   1      }
  64          //---------------------------------------------------------------------------------------------
  65          // 函数名称: Reset7738
  66          // 入口参数: 无
  67          // 函数功能: 复位AD7738,使其恢复到向通信寄存器写状态
  68          //---------------------------------------------------------------------------------------------
  69          void Reset7738(void)
  70          {
  71   1            Write7738(0x00);
  72   1            Write7738(0xFF);
  73   1            Write7738(0xFF);
  74   1            Write7738(0xFF);
  75   1            Write7738(0xFF);
  76   1      }
  77          //---------------------------------------------------------------------------------------------
  78          // 函数名称: Comp
  79          // 入口参数:
  80          // 函数功能: 按从小到大排列
  81          //---------------------------------------------------------------------------------------------
  82          void Comp(void)
  83          {
  84   1           int j,i;
  85   1          e[0]=m1;e[1]=m2;e[2]=m3;e[3]=m4;e[4]=m5;e[5]=m6;
  86   1          for(j=0;j<=4;j++)
  87   1          {
  88   2            for(i=0;i<=5-j;i++)
  89   2            {
  90   3             if(e[i]>e[i+1])
  91   3             {x=e[i];e[i]=e[i+1];e[i+1]=x;}
  92   3            }
  93   2          }
  94   1      
  95   1      }
  96          //---------------------------------------------------------------------------------------------
  97          // 函数名称: Init7738
  98          // 入口参数: 通道数n
  99          // 函数功能: 初始化AD7738各寄存器,设置AD转换相关参数
 100          //---------------------------------------------------------------------------------------------
 101          void Init7738(int n)
 102          {
 103   1            Reset7738( );
 104   1            Write7738(0x30+n);
 105   1            Write7738(0x8F);         //设定通道n转换时间,实验中若将通转换时间设为零,则输出为满量程
 106   1            Write7738(0x01);
 107   1            Write7738(0x30);         //设置RDY引脚在任何一个通道转换结束时变低
 108   1            Write7738(0x28+n);
 109   1            Write7738(0x05);         //设置模拟输入基准为AINCOM,输入电压范围0--+2.5V,单转换模式
 110   1      }
 111          //---------------------------------------------------------------------------------------------
 112          // 函数名称: Read7738
 113          // 入口参数: 通道数z为整型,分别为0,1,2,3,4,5,6,7以表示读取相应通道的A/D转换结果
 114          // 函数功能: 启动A/D转换,读取第z通道转换值并存入单片机
 115          //---------------------------------------------------------------------------------------------
 116          void Read7738(int z)
 117          {
C51 COMPILER V6.23a  7738                                                                  11/21/2006 20:28:16 PAGE 3   

 118   1            int i,j;
 119   1            for(j=0;j<5;j++)
 120   1        {
 121   2            Write7738(0x38+z);
 122   2            Write7738(0x43);     //设置模式为单转换模式,数据为24位,启动第z通道A/D转换
 123   2            while(RDY);          //查询本通道转换是否结束,RDY=0时表明转换结束,数据可用
 124   2            Write7738(0x48+z);
 125   2            SCK=1;
 126   2            MOSI=0;
 127   2            for(i=0;i<8;i++)
 128   2            {
 129   3               delayNOP();
 130   3               SCK=0;
 131   3               delayNOP();
 132   3               tdata=tdata<<1;
 133   3               if(MISO==1)
 134   3                  tdata=tdata|0x01;
 135   3               else
 136   3                  tdata=tdata&0xFE;
 137   3               SCK=1;
 138   3      
 139   3             }
 140   2               a=tdata;          //接受高8位数据并赋给a
 141   2             for(i=0;i<8;i++)
 142   2            {
 143   3               delayNOP();
 144   3               SCK=0;
 145   3              delayNOP();
 146   3               tdata=tdata<<1;
 147   3               if(MISO==1)
 148   3                  tdata=tdata|0x01;
 149   3               else
 150   3                  tdata=tdata&0xFE;
 151   3               SCK=1;
 152   3             }
 153   2               b=tdata;          //接受中8位数据并赋给b
 154   2             for(i=0;i<8;i++)
 155   2            {
 156   3               delayNOP();
 157   3               SCK=0;
 158   3               delayNOP();
 159   3               tdata=tdata<<1;
 160   3               if(MISO==1)
 161   3                  tdata=tdata|0x01;
 162   3               else
 163   3                  tdata=tdata&0xFE;
 164   3               SCK=1;
 165   3             }
 166   2             c=tdata;          //接受低8位数据并赋给c
 167   2             d = ((a<<16)&0x00ff0000)+((b<<8)&0x0000ff00)+(c&0x000000FF);
 168   2             v=d*2.50000000/0xFFFFFF;  //注意此处0xFFFFFF若写成十进制数,则得到的最高电压值2.4999998不等于满量程
             -2.5V
 169   2             switch(j)
 170   2              {
 171   3              case 0:m1=v;break;
 172   3              case 1:m2=v;break;
 173   3              case 2:m3=v;break;
 174   3              case 3:m4=v;break;
 175   3              case 4:m5=v;break;
 176   3              case 5:m6=v;break;
 177   3              }
 178   2      
C51 COMPILER V6.23a  7738                                                                  11/21/2006 20:28:16 PAGE 4   

 179   2         }
 180   1            Comp();
 181   1            v=(e[2]+e[3]+e[4])/3;
 182   1            switch(z)
 183   1            {
 184   2              case 0:v0=v*409.6;break;
 185   2              case 1:v1=v*409.6;break;
 186   2              case 2:v2=v*409.6;break;
 187   2              case 3:v3=v*409.6;break;
 188   2              case 4:v4=v*409.6;break;
 189   2              case 5:v5=v*409.6;break;
 190   2              case 6:v6=v*409.6;break;
 191   2              case 7:v7=v*409.6;break;
 192   2            }
 193   1      
 194   1        }
 195          //---------------------------------------------------------------------------------------------
 196          // 函数名称: SbufIN()
 197          // 入口参数: 无
 198          // 函数功能: 串口初始化子程序,假设单片机晶振为12M
 199          //---------------------------------------------------------------------------------------------
 200          void SbufIN(void)
 201          {
 202   1         TMOD=0x20;   //设置波特率300,定时器1八位自动重装方式

⌨️ 快捷键说明

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