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

📄 adc0832电压表.lst

📁 数码管显示—ADC0832电压表PROTUES仿真
💻 LST
字号:
C51 COMPILER V9.00   ADC0832电压表                                                         09/20/2012 23:25:49 PAGE 1   


C51 COMPILER V9.00, COMPILATION OF MODULE ADC0832电压表
OBJECT MODULE PLACED IN ADC0832电压表.OBJ
COMPILER INVOKED BY: F:\keil\keil4\程序\C51\BIN\C51.EXE ADC0832电压表.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*********************************包含头文件********************************/
   2          #include <reg51.h>      
   3          #include <intrins.h> 
   4          /*********************************端口定义**********************************/
   5          sbit CS   = P3^5;
   6          sbit Clk = P3^6; 
   7          sbit DATI = P3^7;
   8          sbit DATO = P3^7; 
   9          /*******************************定义全局变量********************************/
  10          unsigned char dat = 0x00;       //AD值 .
  11                  //若dat=adc0832(CH)*500.0/255; 不可用unsigned char dat
  12                   //500不可以。用500.0 
  13                  //如 下面unsigned int disdat; 不可unsigned char disdat 
  14          unsigned char count = 0x00;      //定时器计数  
  15          unsigned char CH;                //通道变量     
  16          unsigned int dis[] = {0x00, 0x00, 0x00}; //显示数值      
  17          /*******************************共阳LED段码表*******************************/ 
  18          unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  19          char code tablewe[]={ 0xfd,0xfb,0xf7,0xef,0xdf,0xfe  };  
  20          /****************************************************************************
  21          函数功能:AD转换子程序 
  22          入口参数:CH                     
  23          出口参数:dat    
  24          ****************************************************************************/ 
  25          unsigned char adc0832(unsigned char CH)
  26          {
  27   1          unsigned char i,test,adval; 
  28   1           adval = 0x00;
  29   1           test = 0x00;
  30   1      
  31   1          Clk = 0;       //初始化
  32   1              CS=1;
  33   1          DATI = 1;     
  34   1          CS = 0;
  35   1          _nop_();
  36   1          Clk = 1;
  37   1          _nop_(); 
  38   1      
  39   1         if ( CH == 0x00 )      //通道选择
  40   1         {
  41   2             Clk = 0;           //写入10,选单极性0通道
  42   2             DATI = 1;      //通道0的第一位
  43   2             _nop_();         //clk上升沿写进去
  44   2             Clk = 1; 
  45   2             _nop_();
  46   2      
  47   2            Clk = 0;
  48   2            DATI = 0;      //通道0的第二位
  49   2            _nop_();
  50   2            Clk = 1;
  51   2            _nop_();
  52   2          } 
  53   1          else
  54   1          {                   //写入11,选单极性1通道
  55   2            Clk = 0;
C51 COMPILER V9.00   ADC0832电压表                                                         09/20/2012 23:25:49 PAGE 2   

  56   2            DATI = 1;      //通道1的第一位
  57   2             _nop_();          //clk上升沿写进去
  58   2             Clk = 1;
  59   2             _nop_();
  60   2      
  61   2            Clk = 0;
  62   2            DATI = 1;      //通道1的第二位
  63   2            _nop_();
  64   2            Clk = 1;
  65   2            _nop_();
  66   2          }
  67   1      
  68   1            Clk = 0;    //写进空闲位 //clk上升沿写进去
  69   1            DATI = 1;
  70   1                _nop_();
  71   1            Clk = 1;
  72   1                _nop_();
  73   1      
  74   1          //读取前8位的值
  75   1          for( i = 0;i < 8;i++ )      //读取前8位的值
  76   1          {                           //clk下升沿读出来
  77   2             _nop_();                  //高位先行
  78   2             adval <<= 1;
  79   2             Clk = 1;
  80   2             _nop_();
  81   2             Clk = 0;
  82   2             if (DATO)
  83   2                adval |= 0x01;
  84   2                 //else
  85   2                 // adval |= 0x00;
  86   2           }  
  87   1      
  88   1           for (i = 0; i < 8; i++)      //读取后8位的值
  89   1            {                          //clk下升沿读出来
  90   2                 test >>= 1;           //低位先行,时序图上
  91   2                 if (DATO)
  92   2                    test |= 0x80;
  93   2                    //else 
  94   2                    //test |= 0x00;
  95   2                _nop_();
  96   2                Clk = 1;
  97   2                _nop_();
  98   2                Clk = 0;
  99   2            }
 100   1      
 101   1            if (adval == test)      //比较前8位与后8位的值,如果不相同舍去。
 102   1                 dat = adval;       //若一直出现显示为零,请将该行去掉
 103   1      
 104   1             _nop_();
 105   1             CS = 1;        //释放ADC0832,关闭
 106   1             DATO = 1;
 107   1             Clk = 1;
 108   1      
 109   1            return dat;                       
 110   1      }                                                  
 111          /****************************************************************************   
 112          函数功能:延时子程序
 113          入口参数:  
 114          出口参数:
 115          ****************************************************************************/  
 116          void delay(void)                                 
 117          {
C51 COMPILER V9.00   ADC0832电压表                                                         09/20/2012 23:25:49 PAGE 3   

 118   1         unsigned int k;
 119   1          for(k=10;k<100;k++);                
 120   1      }                                                         
 121          /**************************************************************************** 
 122          函数功能:将0-255级换算成0.00-5.00的电压数值       
 123          入口参数:i                       
 124          出口参数:                                       
 125          ****************************************************************************/  
 126          void convdata(unsigned char i)   //i=dat*5/255=51,是255份; 256份误差大                                
 127          {         
 128   1           unsigned int disdat;          //不可unsigned char disdat
 129   1           disdat=i*500.0/255;                 //500不可以。用500.0        
 130   1                   /* 验证读数
 131   1                    dis[0] = i/100;     //个位
 132   1                    dis[1] = i/10%10;   //小数点后第一位
 133   1                    dis[2] = i%10;     //小数点后第二位        */      
 134   1                 
 135   1            dis[0] = disdat/100;     //个位
 136   1            dis[1] = disdat/10%10;   //小数点后第一位
 137   1            dis[2] = disdat%10;     //小数点后第二位
 138   1      }
 139          /**************************************************************************** 
 140          函数功能:数码管显示子程序
 141          入口参数: 
 142          出口参数:
 143          ****************************************************************************/
 144          void display(void)      
 145          {      
 146   1          P2=0xf1;
 147   1          P0= tab[dis[0]] & 0x7f;      //显示个位和小数点
 148   1              delay();    
 149   1          
 150   1          P2=0xf2;
 151   1          P0=tab[dis[1]];       //显示小数点后第一位
 152   1              delay();    
 153   1          
 154   1          P2=0xf4;
 155   1          P0=tab[dis[2]];       //显示小数点后第二位
 156   1              delay();    
 157   1      } 
 158          /****************************************************************************  
 159          函数功能:主程序    
 160          入口参数:               
 161          出口参数:               
 162          ****************************************************************************/ 
 163          void main(void)  
 164          {
 165   1          P1=0xff;       //端口初始化
 166   1          P0=0xff; 
 167   1              P2=0x00;   
 168   1          delay();
 169   1          CH = 0x00;    //在这里选择通道 0x00(单极性0通道)或0x01(单极性1通道)
 170   1      
 171   1          TMOD = 0x01;       //设置中断 
 172   1          TH0=(65536-50000)/256;//定时器1初值定时50ms
 173   1          TL0=(65536-50000)%256;
 174   1          IE = 0x82;
 175   1             TR0 = 1;   //中端可去
 176   1      
 177   1          while(1)       //主循环               
 178   1          { // dat=adc0832(CH); //中断读,去除偶尔闪动
 179   2                 //*500.0/255;         //500不可以。用500.0
C51 COMPILER V9.00   ADC0832电压表                                                         09/20/2012 23:25:49 PAGE 4   

 180   2             convdata(dat);      //数据转换
 181   2             display();      //显示数值
 182   2          } 
 183   1       }
 184           /****************************************************************************
 185          函数功能:定时器中断延时程序 这一段的作用时隔一段时间抽样一次
 186           否侧显示的最后一位会不稳定
 187          入口参数:  
 188          出口参数: 
 189          ****************************************************************************/ 
 190          void timer0(void) interrupt 1 
 191          {     
 192   1          TH0=(65536-50000)/256;//定时器1初值定时50ms
 193   1              TL0=(65536-50000)%256;  
 194   1         
 195   1          count++;  
 196   1          if (count == 0x01)
 197   1          {
 198   2             count = 0x00;
 199   2             dat = adc0832(CH);
 200   2          } 
 201   1      }       


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    338    ----
   CONSTANT SIZE    =     16    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      9    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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