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

📄 ad_da.lst

📁 很实用的单片机例程
💻 LST
📖 第 1 页 / 共 2 页
字号:
 152                    {
 153   1                 unsigned char temp=0;
 154   1                 unsigned char temp1=0;
 155   1                 unsigned char BitCounter=8;
 156   1      
 157   1                 Sda=1;
 158   1                 do
 159   1                   {
 160   2                        Scl=0;
 161   2                _nop_();
 162   2                        Scl=1;
 163   2                        _nop_();
 164   2                        if(Sda)
 165   2                           temp=temp|0x01;
 166   2                        else
 167   2                           temp=temp&0xfe;
 168   2      
 169   2                        if(BitCounter-1)
 170   2                           {
 171   3                                temp1=temp<<1;
 172   3                                temp=temp1;
 173   3                                }
 174   2                                BitCounter--;
 175   2                               }
 176   1                      while(BitCounter);
 177   1                      return(temp);
 178   1                }
 179           
C51 COMPILER V8.05a   AD_DA                                                                12/06/2010 21:00:25 PAGE 4   

 180          /*------------------------------------------------
 181                              写入DA数模转换值
 182          ------------------------------------------------*/
 183                    void DAC(unsigned char Data)
 184                    {
 185   1                         Start();
 186   1                         Send(AddWr); //写入芯片地址
 187   1                         Ack();
 188   1                         Send(0x40);  //写入控制位,使能DAC输出
 189   1                         Ack();
 190   1                         Send(Data);  //写数据
 191   1                         Ack();
 192   1                         Stop();
 193   1                       
 194   1                 }
 195          
 196          /*------------------------------------------------
 197                           读取AD模数转换的值,有返回值
 198          ------------------------------------------------*/
 199                    unsigned char ReadADC(unsigned char Chl)
 200                    {
 201   1             unsigned char Data;
 202   1                         Start();        //写入芯片地址
 203   1                         Send(AddWr);
 204   1                         Ack();
 205   1                         Send(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加
 206   1                                        //Chl的值分别为0、1、2、3,分别代表1-4通道
 207   1                         Ack();
 208   1                         Start();
 209   1                         Send(AddRd);    //读入地址
 210   1                         Ack();
 211   1                         Data=Read();    //读数据
 212   1                         Scl=0;
 213   1                         NoAck();
 214   1                         Stop();
 215   1                         return Data;   //返回值
 216   1                }
 217          
 218                          void fmg(void)//fm关 
 219                  {       
 220   1              Fm=1;   //              关 fm 
 221   1              }
 222                           void cmg(void)//数码管锁存函数            关时钟DS1302
 223                  {
 224   1              dula=1;
 225   1              P0=0x00;
 226   1              dula=0;
 227   1              wela=1;
 228   1              P0=0x00;
 229   1              wela=0;
 230   1              RST=0;          //              关时钟DS1302
 231   1              }
 232          /*------------------------------------------------
 233                             主程序
 234          ------------------------------------------------*/
 235                  void main()
 236                  {
 237   1               unsigned char num;                   //DA数模输出变量
 238   1          unsigned char ADtemp;                //定义中间变量
 239   1           Init_Timer1();
 240   1               cmg();//数码管锁存
 241   1                fmg();
C51 COMPILER V8.05a   AD_DA                                                                12/06/2010 21:00:25 PAGE 5   

 242   1               while(1)
 243   1                    { 
 244   2                      
 245   2                 DAC(num);       //DA输出,可以用LED模拟电压变化
 246   2                         num++;          //累加,到256后溢出变为0,往复循环。显示在LED上亮度逐渐变化
 247   2                         mDelay(20);     //延时用于清晰看出变化
 248   2                         if(ADFlag)      //定时采集输入模拟量
 249   2                      
 250   2                 {
 251   3                      ADFlag=0;
 252   3      
 253   3                      ADtemp=ReadADC(0);
 254   3                      Display[0]=Datatab[(ReadADC(0))/50]|0x80;//处理0通道电压显示
 255   3                      Display[1]=Datatab[((ReadADC(0))%50)/10];
 256   3              
 257   3              ADtemp=ReadADC(1);
 258   3                      Display[2]=Datatab[((ReadADC(1))/50)]|0x80;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
 259   3                      Display[3]=Datatab[((ReadADC(1))%50)/10];
 260   3                      
 261   3              ADtemp=ReadADC(2);
 262   3                      Display[4]=Datatab[((ReadADC(2))/50)]|0x80;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
 263   3                      Display[5]=Datatab[((ReadADC(2))%50)/10];
 264   3                      
 265   3              ADtemp=ReadADC(3);
 266   3                      Display[6]=Datatab[((ReadADC(3))/50)]|0x80;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
 267   3                      Display[7]=Datatab[((ReadADC(3))%50)/10];
 268   3              
 269   3      
 270   3                         }
 271   2                 }
 272   1              }
 273          
 274          /*------------------------------------------------
 275                             定时器中断程序
 276          ------------------------------------------------*/
 277          void Timer1_isr(void) interrupt 3 using 1//定时器1执行数码管动态扫描
 278          {
 279   1      
 280   1       static unsigned int count,j;
 281   1       TH1=0xfb;              //重新赋值
 282   1       TL1=0x00;
 283   1       j++;
 284   1       if(j==300) 
 285   1          {j=0;ADFlag=1;} //定时置位AD采样标志位
 286   1               
 287   1          P0=Display[count];//用于动态扫描数码管
 288   1          P2=count;
 289   1          count++;
 290   1         if(count==8)     //表示扫描8个数码管
 291   1            count=0;
 292   1      
 293   1       
 294   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    503    ----
   CONSTANT SIZE    =     10    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     12       1
   IDATA SIZE       =   ----    ----
C51 COMPILER V8.05a   AD_DA                                                                12/06/2010 21:00:25 PAGE 6   

   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 + -