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

📄 ad_da.lst

📁 40多个更新 c语言配套程序
💻 LST
字号:
C51 COMPILER V7.06   AD_DA                                                                 09/01/2009 22:58:01 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           #include<LCD1602.h>
  12          
  13           #define AddWr 0x90   //写数据地址 
  14           #define AddRd 0x91   //读数据地址
  15          
  16           
  17           sbit Sda=P1^2;       //定义总线连接端口
  18           sbit Scl=P1^1;
  19          
  20           bit ADFlag;          //定义AD采样标志位
  21          unsigned char code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数共阴码管段码表
  22          data unsigned char  Display[8];//定义临时存放数码管数值
  23          /*------------------------------------------------
  24                              延时程序
  25          ------------------------------------------------*/
  26           void mDelay(unsigned char j)
  27           {
  28   1        unsigned int i;
  29   1        for(;j>0;j--)
  30   1           {
  31   2                for(i=0;i<125;i++)
  32   2                   {;}
  33   2                }
  34   1        }
  35          /*------------------------------------------------
  36                              初始化定时器1
  37          ------------------------------------------------*/
  38          void Init_Timer1(void)
  39          {
  40   1       TMOD |= 0x10;                       
  41   1       TH1=0xff;                      /* Init value */
  42   1       TL1=0x00;
  43   1       //PT1=1;                   /* 优先级    */
  44   1       EA=1;                      /* interupt enable */
  45   1       ET1=1;                     /* enable timer1 interrupt */
  46   1       TR1=1;  
  47   1      }
  48          /*------------------------------------------------
  49                              启动IIC总线
  50          ------------------------------------------------*/
  51            void Start(void)
  52            {
  53   1         Sda=1;
  54   1         _nop_();
  55   1         Scl=1;
C51 COMPILER V7.06   AD_DA                                                                 09/01/2009 22:58:01 PAGE 2   

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

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

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

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


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    709    ----
   CONSTANT SIZE    =     10    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     52       7
   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 + -