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

📄 ds1805.lst

📁 12位的数字电位器,在参加电子设计大赛的时候用的.
💻 LST
字号:
C51 COMPILER V7.50   DS1805                                                                09/05/2007 09:35:03 PAGE 1   


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

line level    source

   1          /********************************************************
   2          工程:数字电位器.256级DS1805,的驱动程序
   3          功能:使用数字电位器调整电阻让滤波器达到自动增益
   4                此芯片为I2C芯片
   5          日期:07.09.05
   6          *********************************************************/
   7          #include <ds89c4xx.h>
   8          #include <intrins.h>
   9          #include<keyscan.h>
  10          #include<LCD12864.h>
  11          #include<max262.h>
  12          #define uchar unsigned char
  13          #define uint unsigned int
  14          
  15          sbit ds1805_dat=P3^7;
  16          sbit ds1805_clk=P3^6;
  17          sbit t0=P3^4;
  18          
  19          bit ack;
  20          
  21          uchar code0[]={"全国电子设计比赛"};
  22          uchar code1[]={"题D:程控滤波设计"};
  23          uchar code2[]={"输入频率:00000Hz"};
  24          uchar code3[]={"步进频率:00000Hz"};
  25          
  26          /*********************************************************** 
  27          函数名称:display
  28          函数功能:显示
  29          备    注:加入延时,能够看清楚显示的过程
  30          ***********************************************************/ 
  31          void display()
  32          {
  33   1         uchar i;
  34   1         send_command(0x80); //第一行显示
  35   1         for (i=0;i<16;i++)
  36   1         {
  37   2          send_data(code0[i]);
  38   2         }
  39   1       
  40   1         send_command(0x90); //第二行显示
  41   1         for (i=0; i<16; i++)
  42   1         {
  43   2          send_data(code1[i]);
  44   2         }
  45   1          
  46   1         send_command(0x88); //第三行显示
  47   1         for (i=0; i<16; i++)
  48   1         {
  49   2          send_data(code2[i]);
  50   2         } 
  51   1      
  52   1         send_command(0x98); //第四行显示
  53   1         for(i=0;i<16;i++)
  54   1         {
  55   2           send_data(code3[i]);
C51 COMPILER V7.50   DS1805                                                                09/05/2007 09:35:03 PAGE 2   

  56   2         }
  57   1      }
  58          
  59          
  60          /***************************************
  61          延时
  62          ***************************************/
  63          void Sdelay(void)
  64          {
  65   1       uchar n;
  66   1       for(n=4;n>0;n--);
  67   1      }
  68          
  69          /*************************************
  70          函数:void start_ds1805()
  71          功能:I2C开始起动
  72          *************************************/
  73          void start_ds1805()
  74          {
  75   1        ds1805_dat=1;
  76   1        ds1805_clk=1;                        //启动总线
  77   1        Sdelay();
  78   1        ds1805_dat=0;    // Tsu:start=4.7uS
  79   1        Sdelay();
  80   1        ds1805_clk=0;    // Thd:start=4uS
  81   1      
  82   1      }
  83          /*******************************************************************
  84          函数原型:   void  Stop_I2c();  
  85          功能:       结束I2C总线,即发送I2C结束条件.
  86          ********************************************************************/
  87          void stop_ds1805()
  88          {
  89   1       ds1805_dat=0;                                   //释放总线
  90   1       Sdelay();
  91   1       ds1805_clk=1;
  92   1       Sdelay();
  93   1       ds1805_dat=1; // Tsu:stop=4uS
  94   1      
  95   1      }
  96          /*******************************************************************
  97          字节数据传送函数               
  98          函数原型: void  SendByte(uchar c);
  99          功能:将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
 100               此状态位进行操作.(不应答或非应答都使ack=0 假)     
 101               发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
 102          ********************************************************************/
 103          void ds1805_send8bit(uchar ch)
 104          {
 105   1        uchar i;
 106   1        for(i=0;i<8;i++)
 107   1         {
 108   2          ds1805_dat=(bit)(ch&0x80);
 109   2               _nop_();
 110   2          ch<<=1;
 111   2          ds1805_clk=1;
 112   2          _nop_();
 113   2          ds1805_clk=0;
 114   2          _nop_();
 115   2         }   
 116   1      }
 117          
C51 COMPILER V7.50   DS1805                                                                09/05/2007 09:35:03 PAGE 3   

 118          /***************************************************************
 119          字节数据传送函数               
 120          函数: uchar  ds1805_receive8bit();
 121          功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
 122                发完后请用应答函数。  
 123          *****************************************************************/      
 124          
 125          uchar ds1805_receive8bit(void)
 126          {
 127   1          uchar a, b=0;     
 128   1          for(a=0;a<8;a++)
 129   1           {
 130   2            ds1805_clk = 1;
 131   2            b=b<<1;
 132   2            if (ds1805_dat==1)
 133   2            b=b|0x01;       //按位或
 134   2            ds1805_clk = 0;
 135   2           }
 136   1         return(b);
 137   1      }
 138          
 139          /********************************************************************
 140                               应答子函数
 141          原型:  bit Ack_I2c(bit a);
 142           
 143          功能:主控器进行应答信号,(可以是应答或非应答信号)
 144          ********************************************************************/
 145          bit  ds1805_ack(void)
 146           {
 147   1           bit  ack;
 148   1           ds1805_dat = 1;
 149   1           ds1805_clk = 1;
 150   1           if(ds1805_dat==1)       //如果SDA为高电平表示从器件无应答
 151   1             ack = 1;
 152   1            else
 153   1             ack = 0;      //如果SDA为低电平表示从器件有应答
 154   1           ds1805_clk = 0;
 155   1           return  (ack);       //返回应答标志
 156   1      }
 157          /*************************写入数据*********************/
 158          void ds1805_write(uchar Address,uchar Data)
 159          {
 160   1          do
 161   1              {                                 // 启动总线
 162   2            start_ds1805();
 163   2            ds1805_send8bit(0x50);  //主器件向从器件发送地址(R/W=0为写)
 164   2          }
 165   1          while(ds1805_ack());  //从器件若无应答一直循环
 166   1      
 167   1           ds1805_send8bit(Address); //发送从器件内部存储的地址
 168   1           ds1805_ack();                      //主器件发送应答信号
 169   1           ds1805_send8bit(Data); //主器件向从器件发送数据
 170   1           ds1805_ack();                      //主器件发送应答信号
 171   1           stop_ds1805();             //释放总线
 172   1      }
 173          /*******************************
 174          ds1805_read(地址,数据),读一个字节
 175          ***********************************/
 176          uchar ds1805_read(uchar Address) 
 177          {
 178   1         uchar c;
 179   1         do
C51 COMPILER V7.50   DS1805                                                                09/05/2007 09:35:03 PAGE 4   

 180   1         {
 181   2           start_ds1805();              // 启动总线 
 182   2           ds1805_send8bit(0x50);//主器件向从器件发送地址(R/W=0为写)
 183   2         }
 184   1        while(ds1805_ack()); //i2c_ack()=1,表示无确认,再次发送
 185   1      
 186   1          ds1805_send8bit(Address);  //发送从器件内部存储的地址
 187   1          ds1805_ack();                        //发送应答信号
 188   1      
 189   1        do
 190   1         {
 191   2          start_ds1805();        // 再次启动总线
 192   2          ds1805_send8bit(0x51);//主器件向从器件发送地址(R/W=1为读)
 193   2         }
 194   1        while(ds1805_ack());  //从器件若无应答一直循环
 195   1          c=ds1805_receive8bit();  //从器件数据输出
 196   1          ds1805_ack();                //发送应答信号
 197   1         stop_ds1805();               //释放总线
 198   1          return(c);
 199   1      }
 200          /***************中断函数***********************/
 201          void time_0() interrupt 1
 202          {
 203   1        t0=~t0;
 204   1      }
 205          /*****************************************************
 206          主函数
 207          ******************************************************/
 208          void main()
 209          {
 210   1        PMR=0x11;                              //4x(0x11)/2x(0x10)  内部CLK为晶振的n倍频
 211   1        CKMOD=0x08;                            // 定时器0周期为内部CLK   
 212   1        EA=1;
 213   1        ET0=1;
 214   1        EX0=1;
 215   1        IT0=1;                       //开INT0中断,设定负跳沿触发方式
 216   1        TMOD=0x22;                         //设定T0 T1为16位方式               
 217   1        TH0=TL0=0xf4;                 //T0装初值(50ms)
 218   1        TR0=1;                                         //启动T0
 219   1        lni_lcd();                         //初始化lcd
 220   1        while(1)
 221   1         {
 222   2           ds1805_send8bit(0xf0);
 223   2               display();
 224   2         }
 225   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    941    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     88    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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