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

📄 +

📁 51单片机配套C程序
💻
字号:
C51 COMPILER V7.50   AD_DA                                                                 05/28/2010 15:53:28 PAGE 1   


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

line level    source

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

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

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

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

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


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    767    ----
   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 + -