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

📄 0831.lst

📁 adc0831用数码管显示测电压0~5v
💻 LST
字号:
C51 COMPILER V8.05a   0831                                                                 04/09/2009 19:29:20 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE 0831
OBJECT MODULE PLACED IN 0831.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 0831.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /****使用ADC0831测电压;并用数码管显示电压的数值***/
   2          /****注意:测量的电压范围:0-5V********************/
   3          #include <reg51.h>
   4          #include <intrins.h>
   5          
   6          sbit CLK=P1^3;          //CLK--7脚       //时钟I/O端口
   7          sbit DO=P1^4;           //DO---6脚       //数据I.O端口
   8          sbit CS=P1^6;           //CS---1脚       //片选I/O端口
   9          sbit RST = P1^5;// DS1302片选,因这两芯片采用同一数据脚(SDA,SCL),所以我们要定义它,将DS1302片选关掉,否
             -则发生冲突
  10          
  11          code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xbf,0x86,0xdb,
  12                                                                  0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x40,0x3e,0x00};//共阴数码管显示数的组成是 "0-9""0-9有小数点的" 
             -"-" "U" "空 表"
  13                                                                                  
  14          unsigned char l_tmpdate[]={0,0,0,0};    //定义数组变量
  15          void delay();                                                   //延时子函数,5个空指令
  16          void display(unsigned char *lp,unsigned char lc);//数字的显示函数;lp为指向数组的地址,lc为显示的个数
  17          unsigned char ad0831read(void);                 //定义该函数为读取ADC0831的数据
  18          
  19          void main(void)                                         //主函数;
  20          {
  21   1              unsigned int i=254,tmp;
  22   1              RST=0;  
  23   1              while(1)
  24   1              {
  25   2                      i++;
  26   2                      if(i==255)                                              //这里为循环255个周期读取一次0831,因CPU运行比较快,没必要每次循环都去读取
  27   2                      {                       
  28   3                              tmp=ad0831read()*100;           //这里乘上100的意思是保留两位小数
  29   3                              tmp=tmp/51;                                     //这里为什么除以51呢,分析如下:模数转换IC是8位ADC,转换回来的数值是0-255
  30   3                                                                                      //0V时是0,5V时是255,他相应的倍数就是255/5=51,因此,我们的将转换回来的
  31   3                                                                                      //数除以51,就得到相应的电压值了,
  32   3                              i=0;            
  33   3                              l_tmpdate[0]=tmp/100;       //得到百位,其实是个位,因为我们刚才乘上100了
  34   3                              l_tmpdate[0]+=10;                       //这里是加上小数点,带小数点的数在表中是后10位
  35   3                              tmp=tmp%100;                    
  36   3                              l_tmpdate[1]=tmp/10;            //十位  即小数点后第一位
  37   3                              l_tmpdate[2]=tmp%10;            //个位  //即小数点后第二位
  38   3                              l_tmpdate[3]=21;                        //加上单位U,伏
  39   3                      }
  40   2                      display(l_tmpdate,4);                   //输出显示
  41   2              }
  42   1      }
  43          void display(unsigned char *lp,unsigned char lc)//显示
  44          {
  45   1              unsigned char i;                //定义变量
  46   1              P2=0;                                   //端口2为输出
  47   1              P1=P1&0xF8;                             //将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管
  48   1              for(i=0;i<lc;i++){              //循环显示
  49   2              P2=table[lp[i]];                //查表法得到要显示数字的数码段
  50   2              delay();                                //延时5个空指令 
  51   2              if(i==7)                                //检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据
  52   2                      break;
  53   2              P2=0;                                   //清0端口,准备显示下位
C51 COMPILER V8.05a   0831                                                                 04/09/2009 19:29:20 PAGE 2   

  54   2              P1++;                                   //下一位数码管
  55   2              }
  56   1      }
  57          void delay(void)                        //空5个指令
  58          {
  59   1              _nop_();_nop_();_nop_();_nop_();_nop_();
  60   1      }
  61          
  62          unsigned char ad0831read(void)//请先了解ADC0831模数转换器的串口协议,再来读本函数,主要是对应时序图来理解
  63          {                                                               //本函数是模拟0831的串口协议进行的,当你了解用软件去模拟一个端口的协议
  64   1                                                                      //以后,对于一个硬件这样的端口就简单多了
  65   1              unsigned char i=0,tmp=0;
  66   1                      DO=1;
  67   1                      CS=0;
  68   1                      _nop_();
  69   1                      _nop_();
  70   1                      CLK=0;
  71   1                      _nop_();
  72   1                      _nop_();
  73   1                      CLK=1;
  74   1                      _nop_();
  75   1                      _nop_();
  76   1                      CLK=0;
  77   1                      _nop_();
  78   1                      _nop_();
  79   1                      CLK=1;
  80   1                      _nop_();
  81   1                      _nop_();
  82   1                      CLK=0;
  83   1                      _nop_();
  84   1                      _nop_();
  85   1                      for(i=0;i<8;i++)
  86   1                      {
  87   2                              tmp<<=1;
  88   2                              if(DO)         //使DO端输出加入temp中
  89   2                                      tmp++;                  
  90   2                              CLK=1;
  91   2                              _nop_();
  92   2                              _nop_();
  93   2                              CLK=0;
  94   2                              _nop_();
  95   2                              _nop_();
  96   2                      }
  97   1                      CS=1;
  98   1              return tmp;
  99   1      }
 100          
 101          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    244    ----
   CONSTANT SIZE    =     23    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4       7
   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 + -