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

📄 ad_da.lst

📁 单片机开发板配套52个程序(c语言源代码)
💻 LST
字号:
C51 COMPILER V7.06   AD_DA                                                                 09/01/2009 23:06:36 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE AD_DA
OBJECT MODULE PLACED IN AD_DA.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE AD_DA.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*-----------------------------------------------
   2            名称:IIC协议 PCF8591ADDA转换
   3            公司:上海浩豚电子科技有限公司
   4            编写:师访
   5            日期:2009.5
   6            修改:无
   7            内容:此程序通过IIC协议对DAAD芯片操作,读取电位器的电压,并输出模拟量,用LED亮度渐变指示
   8          ------------------------------------------------*/
   9           #include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  10           #include <intrins.h> //包含NOP空指令函数_nop_();
  11          
  12           #define AddWr 0x90   //写数据地址 
  13           #define AddRd 0x91   //读数据地址
  14          
  15           
  16           sbit Sda=P1^2;       //定义总线连接端口
  17           sbit Scl=P1^1;
  18          
  19           bit ADFlag;          //定义AD采样标志位
  20          unsigned char code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数共阴码管段码表
  21          data unsigned char  Display[8];//定义临时存放数码管数值
  22          /*------------------------------------------------
  23                              延时程序
  24          ------------------------------------------------*/
  25           void mDelay(unsigned char j)
  26           {
  27   1        unsigned int i;
  28   1        for(;j>0;j--)
  29   1           {
  30   2                for(i=0;i<125;i++)
  31   2                   {;}
  32   2                }
  33   1        }
  34          /*------------------------------------------------
  35                              初始化定时器1
  36          ------------------------------------------------*/
  37          void Init_Timer1(void)
  38          {
  39   1       TMOD |= 0x10;                       
  40   1       TH1=0xff;                      /* Init value */
  41   1       TL1=0x00;
  42   1       //PT1=1;                   /* 优先级    */
  43   1       EA=1;                      /* interupt enable */
  44   1       ET1=1;                     /* enable timer1 interrupt */
  45   1       TR1=1;  
  46   1      }
  47          /*------------------------------------------------
  48                              启动IIC总线
  49          ------------------------------------------------*/
  50            void Start(void)
  51            {
  52   1         Sda=1;
  53   1         _nop_();
  54   1         Scl=1;
  55   1         _nop_();
C51 COMPILER V7.06   AD_DA                                                                 09/01/2009 23:06:36 PAGE 2   

  56   1         Sda=0;
  57   1         _nop_();
  58   1         Scl=0;
  59   1        }
  60          
  61          
  62          /*------------------------------------------------
  63                              停止IIC总线
  64          ------------------------------------------------*/
  65            void Stop(void)
  66            {
  67   1         Sda=0;
  68   1         _nop_();
  69   1         Scl=1;
  70   1         _nop_();
  71   1         Sda=1;
  72   1         _nop_();
  73   1         Scl=0;
  74   1         }
  75          
  76          
  77          /*------------------------------------------------
  78                             应答IIC总线
  79          ------------------------------------------------*/
  80             void Ack(void)
  81             {
  82   1          Sda=0;
  83   1              _nop_();
  84   1              Scl=1;
  85   1              _nop_();
  86   1              Scl=0;
  87   1              _nop_();
  88   1              }
  89          
  90          
  91          /*------------------------------------------------
  92                           非应答IIC总线
  93          ------------------------------------------------*/
  94                  void NoAck(void)
  95                  {
  96   1               Sda=1;
  97   1               _nop_();
  98   1               Scl=1;
  99   1               _nop_();
 100   1               Scl=0;
 101   1               _nop_();
 102   1               }
 103          
 104          
 105          /*------------------------------------------------
 106                        发送一个字节
 107          ------------------------------------------------*/
 108                   void Send(unsigned char Data)
 109                   { 
 110   1                unsigned char BitCounter=8;
 111   1                unsigned char temp;
 112   1      
 113   1                do
 114   1                  {
 115   2                       temp=Data;
 116   2                       Scl=0;
 117   2                       _nop_();
C51 COMPILER V7.06   AD_DA                                                                 09/01/2009 23:06:36 PAGE 3   

 118   2                       if((temp&0x80)==0x80)
 119   2                          Sda=1;
 120   2                       else
 121   2                          Sda=0;
 122   2      
 123   2                              Scl=1;
 124   2                              temp=Data<<1;
 125   2                              Data=temp;
 126   2                              BitCounter--;
 127   2                        }
 128   1                while(BitCounter);
 129   1                    Scl=0;
 130   1                }
 131          
 132          
 133          /*------------------------------------------------
 134                         读入一个字节并返回
 135          ------------------------------------------------*/
 136                    unsigned char Read(void)
 137                    {
 138   1                 unsigned char temp=0;
 139   1                 unsigned char temp1=0;
 140   1                 unsigned char BitCounter=8;
 141   1      
 142   1                 Sda=1;
 143   1                 do
 144   1                   {
 145   2                        Scl=0;
 146   2                _nop_();
 147   2                        Scl=1;
 148   2                        _nop_();
 149   2                        if(Sda)
 150   2                           temp=temp|0x01;
 151   2                        else
 152   2                           temp=temp&0xfe;
 153   2      
 154   2                        if(BitCounter-1)
 155   2                           {
 156   3                                temp1=temp<<1;
 157   3                                temp=temp1;
 158   3                                }
 159   2                                BitCounter--;
 160   2                               }
 161   1                      while(BitCounter);
 162   1                      return(temp);
 163   1                }
 164           
 165          /*------------------------------------------------
 166                              写入DA数模转换值
 167          ------------------------------------------------*/
 168                    void DAC(unsigned char Data)
 169                    {
 170   1                         Start();
 171   1                         Send(AddWr); //写入芯片地址
 172   1                         Ack();
 173   1                         Send(0x40);  //写入控制位,使能DAC输出
 174   1                         Ack();
 175   1                         Send(Data);  //写数据
 176   1                         Ack();
 177   1                         Stop();
 178   1                       
 179   1                 }
C51 COMPILER V7.06   AD_DA                                                                 09/01/2009 23:06:36 PAGE 4   

 180          
 181          /*------------------------------------------------
 182                           读取AD模数转换的值,有返回值
 183          ------------------------------------------------*/
 184                    unsigned char ReadADC(unsigned char Chl)
 185                    {
 186   1             unsigned char Data;
 187   1                         Start();        //写入芯片地址
 188   1                         Send(AddWr);
 189   1                         Ack();
 190   1                         Send(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加
 191   1                                        //Chl的值分别为0、1、2、3,分别代表1-4通道
 192   1                         Ack();
 193   1                         Start();
 194   1                         Send(AddRd);    //读入地址
 195   1                         Ack();
 196   1                         Data=Read();    //读数据
 197   1                         Scl=0;
 198   1                         NoAck();
 199   1                         Stop();
 200   1                         return Data;   //返回值
 201   1                }
 202          
 203          /*------------------------------------------------
 204                             主程序
 205          ------------------------------------------------*/
 206                  void main()
 207                  {
 208   1               unsigned char num;                   //DA数模输出变量
 209   1          unsigned char ADtemp;                //定义中间变量
 210   1           Init_Timer1();
 211   1      
 212   1               while(1)
 213   1                    { 
 214   2                 DAC(num);       //DA输出,可以用LED模拟电压变化
 215   2                         num++;          //累加,到256后溢出变为0,往复循环。显示在LED上亮度逐渐变化
 216   2                         mDelay(20);     //延时用于清晰看出变化
 217   2                         if(ADFlag)      //定时采集输入模拟量
 218   2                 {
 219   3                      ADFlag=0;
 220   3      
 221   3                      ADtemp=ReadADC(0);
 222   3                      Display[0]=Datatab[(ReadADC(0))/50]|0x80;//处理0通道电压显示
 223   3                      Display[1]=Datatab[((ReadADC(0))%50)/10];
 224   3              
 225   3              ADtemp=ReadADC(1);
 226   3                      Display[2]=Datatab[((ReadADC(1))/50)]|0x80;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
 227   3                      Display[3]=Datatab[((ReadADC(1))%50)/10];
 228   3                      
 229   3              ADtemp=ReadADC(2);
 230   3                      Display[4]=Datatab[((ReadADC(2))/50)]|0x80;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
 231   3                      Display[5]=Datatab[((ReadADC(2))%50)/10];
 232   3                      
 233   3              ADtemp=ReadADC(3);
 234   3                      Display[6]=Datatab[((ReadADC(3))/50)]|0x80;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
 235   3                      Display[7]=Datatab[((ReadADC(3))%50)/10];
 236   3                      
 237   3      
 238   3                         }
 239   2                 }
 240   1              }
 241          
C51 COMPILER V7.06   AD_DA                                                                 09/01/2009 23:06:36 PAGE 5   

 242          /*------------------------------------------------
 243                             定时器中断程序
 244          ------------------------------------------------*/
 245          void Timer1_isr(void) interrupt 3 using 1//定时器1执行数码管动态扫描
 246          {
 247   1      
 248   1       static unsigned int count,j;
 249   1       TH1=0xfb;              //重新赋值
 250   1       TL1=0x00;
 251   1       j++;
 252   1       if(j==300) 
 253   1          {j=0;ADFlag=1;} //定时置位AD采样标志位
 254   1               
 255   1          P0=Display[count];//用于动态扫描数码管
 256   1          P2=count;
 257   1          count++;
 258   1         if(count==8)     //表示扫描8个数码管
 259   1            count=0;
 260   1      
 261   1       
 262   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    478    ----
   CONSTANT SIZE    =     10    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     12       1
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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