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

📄 nmr.lst

📁 TLV2544程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V6.12  NMR                                                                    06/11/2006 11:23:04 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE NMR
OBJECT MODULE PLACED IN .\NMR.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\NMR.c ROM(COMPACT) DEBUG OBJECTEXTEND

stmt level    source

   1          /*本程序为核磁共振找水仪下位机程序*/
   2          
   3          #include"my.h"
   4          union u {unsigned int word;
   5                   struct{unsigned char high;unsigned char low;}bytes;//字节顺序为高位在前的2byte结构
   6          		 };
   7          
   8          union w { ulong dwords;
   9                    struct {unsigned int high;unsigned int low;}words;
  10          		  struct {unsigned char byte3;unsigned char byte2;unsigned char byte1;unsigned char byte0;}bytes;
  11                 };
  12          //逻辑
  13          #define FALSE  0
  14          #define TRUE   1
  15          #define H      1
  16          #define L      0    
  17          
  18          /* 引脚定义*/
  19          
  20          //	AD:本设计采用TI公司的TLV2544ID,12bit,四通道,200ksps
  21          sbit SDO    =   P1^0;		   	// TLV2544片选
  22          sbit CS     =   P1^1;           // TLV2544控制模拟输入采样的开始和启动转换
  23          sbit SDI    =   P1^2;           // TLV2544A/D转换结果的三态串行输出端
  24          sbit SCLK   =   P1^3;           // TLV2544串行数据输入
  25          sbit INT    =   P1^4;           // TLV2544串行时钟输入
  26          sbit CSTART =   P1^5;           // TLV2544转换结束或主处理器中断
  27          // DA:本设计采用TI公司的TLV5636,12bit,单通道
  28          sbit DIN   =    P0^3;		   	// TLV5636数据输入
  29          sbit DSCLK =    P0^4;           // TLV5636时钟输入
  30          sbit FS    =    P0^5;           // TLV5636片选
  31          // LED
  32          sbit LEDCLK  =  P0^0;		   	// LED时钟
  33          sbit LEDDATA =  P0^1;           // LED数据
  34          sbit LEDCLR  =  P0^2;           // LED清零
  35          //control
  36          sbit powercon = p0^6;
  37          sbit es485    = p1^6;
  38          sbit STATE    = P0^7;
  39          sbit trstate  = p1^7;
  40          /*协议命令字定义*/
  41          //
  42          #define BEGIN 0x09     //起始码
  43          #define SOH 0x0a     //起始码
  44          #define END 0x0d     //结束码
  45          //标志号
  46          #define NMRTYPE 'A'  //标志号
  47          //设备号
  48          #define EQU  'P'     //电源模块标志
  49          //功能码
  50          #define AD  'A'   //AD采集
  51          #define DA  'D'   //DA输出
  52          #define EC  'E'   //设备检测
  53          #define CLOSEDC 'C' //关闭电源逆变器
  54          //返回命令
  55          #define OK  'S'     //操作成功
C51 COMPILER V6.12  NMR                                                                    06/11/2006 11:23:04 PAGE 2   

  56          #define ERRBCC 'B'
  57          #define ERRF 'W'
  58          #define ERRC 'C'
  59          
  60          // ADC:TLV2544操作命令
  61          #define CHA0 '0'
  62          #define CHA1 '1'
  63          #define CHA2 '2'
  64          #define CHA3 '3'
  65          
  66          /*变量定义*/
  67          
  68          unsigned char data ch;      //ad通道号 
  69          unsigned char  data mode;   //mode 是模式 0为读,1为写 */
  70          unsigned char data n;       //数据长度,字节
  71          
  72          //ad[chl:各通道采集完成数据;ch:各通道采集过程换算数据]
  73          
  74          unsigned int idata chl0,ch0;
  75          unsigned int idata chl1,ch1;
  76          unsigned int idata chl2,ch2;
  77          unsigned int idata chl3,ch3;
  78          
  79          bit flag;//电压采集完成标志
  80          bit kk;//校验正确与否标志
  81          unsigned char idata command[20] _at_  0x48;  //串口的发送缓冲区
  82          
  83          /*码定义*/
  84          
  85          const unsigned char code asci[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0
             -x45,0x46};//ASCII
  86          const uchar code ledcode[11]={0xEE,0x28,0xCD,0x6D,0x2B,0x67,0xE7,0x2C,0xEF,0x6F,0xFF};//LED字型
  87          
  88          //函数声明
  89          
  90          void serial_init(void);    				 //串口初始化
  91          void bcc(void);            				 //校验
  92          void sendcommand(void);  				 //发送命令或返回命令数据
  93          void proc_command(void);   				 //接收命令后处理
  94          unsigned int adx(unsigned char ch);      //
  95          void Delay_10_uS(void);                  //10us延时
  96          unsigned int adrdwr(unsigned int par);   //ad读写
  97          void senderrbcc(void);                   //错误发送
  98          void adinit(void);                       //ad初始化
  99          void delay_ms(unsigned char i);         
 100          void writeda(unsigned int k);            //写da,中断调用
 101          void writedam(unsigned int k);           //写da,主程序调用
 102          void dainit(void);                       //da初始化
 103          void LEDinitial(void);                   //led初始化,检测数码管
 104          void ledout(void);                       //led显示
 105          void sendequok(void);
 106          void system_init(void);
 107          void close(void);
 108          
 109          void main(void)
 110          {  
 111   1      unsigned int idata command1,command2;
 112   1      unsigned char data i,j;
 113   1      SP=0x60;
 114   1      system_init();
 115   1      serial_init();
 116   1      adinit();
C51 COMPILER V6.12  NMR                                                                    06/11/2006 11:23:04 PAGE 3   

 117   1      dainit();
 118   1      LEDinitial();
 119   1      
 120   1      flag=1; //未采集完成,禁止上位机读取ad数据
 121   1      while(1)
 122   1      {
 123   2      //
 124   2      STATE=~STATE;
 125   2      for (j=0;j<5;j++){//一个显示过程
 126   3      
 127   3      ch0=0x0000;
 128   3      for(i=0;i<16;i++)//一个采集过程
 129   3      {
 130   4      command1=0x0000;
 131   4      command2=adrdwr(command1);
 132   4      while(INT==1);
 133   4      CS=H;
 134   4      delay_ms(1);
 135   4      command2=adrdwr(command1);
 136   4      while(INT==1);
 137   4      CS=H;
 138   4      command2=command2>>4;
 139   4      ch0=ch0+command2;
 140   4      }
 141   3      //
 142   3      ch1=0x00;
 143   3      for(i=0;i<16;i++)
 144   3      {
 145   4      command1=0x2000;
 146   4      command2=adrdwr(command1);
 147   4      while(INT==1);
 148   4      CS=H;
 149   4      delay_ms(1);
 150   4      command2=adrdwr(command1);
 151   4      while(INT==1);
 152   4      CS=H;
 153   4      command2=command2>>4;
 154   4      ch1=ch1+command2;
 155   4      }
 156   3      //
 157   3      ch2=0x00;
 158   3      for(i=0;i<16;i++)
 159   3      {
 160   4      command1=0x4000;
 161   4      command2=adrdwr(command1);
 162   4      while(INT==1);
 163   4      CS=H;
 164   4      delay_ms(1);
 165   4      command2=adrdwr(command1);
 166   4      while(INT==1);
 167   4      CS=H;
 168   4      command2=command2>>4;
 169   4      ch2=ch2+command2;
 170   4      }
 171   3      ///
 172   3      ch3=0x00;
 173   3      for(i=0;i<16;i++)
 174   3      {
 175   4      command1=0x6000;
 176   4      command2=adrdwr(command1);
 177   4      while(INT==1);
 178   4      CS=H;
C51 COMPILER V6.12  NMR                                                                    06/11/2006 11:23:04 PAGE 4   

 179   4      delay_ms(1);
 180   4      command2=adrdwr(command1);
 181   4      while(INT==1);
 182   4      CS=H;
 183   4      command2=command2>>4;
 184   4      ch3=ch3+command2;
 185   4      }
 186   3      flag=1;
 187   3      chl0=ch0;
 188   3      chl1=ch1;
 189   3      chl2=ch2;
 190   3      chl3=ch3;
 191   3      flag=0;
 192   3      }
 193   2      ledout();//显示通道1和2电压
 194   2      }
 195   1      }
 196          
 197          
 198          void system_init(void)
 199          {
 200   1      powercon = H;
 201   1      es485=L;
 202   1      STATE=L;
 203   1      trstate=H;
 204   1      }
 205          //led初始化子函数,点亮全部数码管及其各码段
 206          void LEDinitial(void)
 207          {
 208   1      unsigned char data k,i,wordC;
 209   1      LEDCLR=0;
 210   1      LEDCLR=1;
 211   1      LEDCLK=1;
 212   1      for(k=0;k<6;k++)
 213   1      {   
 214   2         wordC=ledcode[10];
 215   2         for(i=0;i<8;i++){
 216   3      		LEDCLK=0;
 217   3      		Delay_10_uS();
 218   3      		if ((wordC&0x80)==0x80) LEDDATA=1;
 219   3      		else LEDDATA=0;
 220   3      		wordC=wordC<<1;	
 221   3      		LEDCLK=1;
 222   3      		Delay_10_uS();
 223   3      	}
 224   2        }
 225   1        delay_ms(500);
 226   1      }
 227          
 228          void close(void) using 1
 229          {
 230   1      powercon=H;
 231   1      command[0]=SOH;
 232   1      command[1]=NMRTYPE;
 233   1      command[2]=EQU;
 234   1      command[4]=OK;
 235   1      command[7]=END;
 236   1      mode=1;n=8;
 237   1      bcc();
 238   1      sendcommand();
 239   1      }
 240          //led显示,左数码管显示通道1,右数码管显示通道2;
C51 COMPILER V6.12  NMR                                                                    06/11/2006 11:23:04 PAGE 5   

 241          void ledout(void) using 1
 242          {
 243   1      unsigned long idata V1;
 244   1      unsigned char data tmp,i,j,k,wordC,ledword[6];
 245   1      LEDCLR=0;
 246   1      LEDCLR=1;
 247   1      LEDCLK=1;
 248   1      V1=chl0;
 249   1      V1=V1>>4;
 250   1      tmp=V1/1000;
 251   1      ledword[0]=tmp&0x0f;
 252   1      V1=V1-tmp*1000;
 253   1      tmp=V1/100;
 254   1      ledword[1]=tmp&0x0f;
 255   1      V1=V1-tmp*100;
 256   1      tmp=V1/10;
 257   1      ledword[2]=tmp&0x0f;
 258   1      //
 259   1      V1=chl1;
 260   1      V1=V1>>4;
 261   1      tmp=V1/1000;
 262   1      ledword[3]=tmp&0x0f;
 263   1      V1=V1-tmp*1000;
 264   1      tmp=V1/100;
 265   1      ledword[4]=tmp&0x0f;
 266   1      V1=V1-tmp*100;
 267   1      tmp=V1/10;
 268   1      ledword[5]=tmp&0x0f;
 269   1      for(i=0;i<6;i++)//依次显示六个数码管
 270   1      	{
 271   2      	k=ledword[5-i];
 272   2      	wordC=ledcode[k];
 273   2          for(j=0;j<8;j++){//依次发送各数码管码段
 274   3      		LEDCLK=0;  
 275   3      		if ((wordC&0x80)==0x80) LEDDATA=1;
 276   3      	    else LEDDATA=0;
 277   3      		wordC=wordC<<1;
 278   3      		LEDCLK=1;
 279   3      	    Delay_10_uS();
 280   3      	}
 281   2        }
 282   1      }
 283          
 284          void  Delay_10_uS(void) using 1
 285          {
 286   1      unsigned char data  i=10;
 287   1      while(i--);
 288   1      }
 289          
 290          void delay_ms(unsigned char ms_number)
 291          { 
 292   1      unsigned int  idata i;
 293   1      unsigned char data j;
 294   1      for(j=0;j<ms_number;j++)
 295   1      for(i=0;i<229;i++);
 296   1      }
 297          /*********************************************/
 298          //向上位机发送数据
 299          void sendcommand(void) using 1
 300          {
 301   1        unsigned char data j=0;
 302   1        unsigned char data tmp=0;
C51 COMPILER V6.12  NMR                                                                    06/11/2006 11:23:04 PAGE 6   

 303   1      es485 =H;
 304   1      trstate=L;
 305   1      TH0=0xa0;  TL0=0x00;  TF0=0;
 306   1      TR0=1;
 307   1      while(TF0==0) {  }
 308   1      
 309   1      tmp=command[j];
 310   1      TI=0;
 311   1      while(tmp!=0x0d)
 312   1      {
 313   2      tmp=command[j];
 314   2      SBUF=tmp;
 315   2      j=j+1;
 316   2      while(!TI);
 317   2      TI=0;
 318   2      }
 319   1      //
 320   1      es485 =L;
 321   1      trstate=H;
 322   1      TH0=0xa0;  TL0=0x00;  TF0=0;
 323   1      TR0=1;
 324   1      
 325   1      while(TF0==0) {  }
 326   1      //
 327   1      
 328   1      }	
 329          /*********************************************/
 330          
 331          //串口初始化:晶振采用22。1184M,波特率38400,方式一
 332          void serial_init()

⌨️ 快捷键说明

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