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

📄 ds1805.c

📁 12位的数字电位器,在参加电子设计大赛的时候用的.
💻 C
字号:
/********************************************************
工程:数字电位器.256级DS1805,的驱动程序
功能:使用数字电位器调整电阻让滤波器达到自动增益
      此芯片为I2C芯片
日期:07.09.05
*********************************************************/
#include <ds89c4xx.h>
#include <intrins.h>
#include<keyscan.h>
#include<LCD12864.h>
#include<max262.h>
#define uchar unsigned char
#define uint unsigned int

sbit ds1805_dat=P3^7;
sbit ds1805_clk=P3^6;
sbit t0=P3^4;

bit ack;

uchar code0[]={"全国电子设计比赛"};
uchar code1[]={"题D:程控滤波设计"};
uchar code2[]={"输入频率:00000Hz"};
uchar code3[]={"步进频率:00000Hz"};

/*********************************************************** 
函数名称:display
函数功能:显示
备    注:加入延时,能够看清楚显示的过程
***********************************************************/ 
void display()
{
   uchar i;
   send_command(0x80); //第一行显示
   for (i=0;i<16;i++)
   {
    send_data(code0[i]);
   }
 
   send_command(0x90); //第二行显示
   for (i=0; i<16; i++)
   {
    send_data(code1[i]);
   }
    
   send_command(0x88); //第三行显示
   for (i=0; i<16; i++)
   {
    send_data(code2[i]);
   } 

   send_command(0x98); //第四行显示
   for(i=0;i<16;i++)
   {
     send_data(code3[i]);
   }
}


/***************************************
延时
***************************************/
void Sdelay(void)
{
 uchar n;
 for(n=4;n>0;n--);
}

/*************************************
函数:void start_ds1805()
功能:I2C开始起动
*************************************/
void start_ds1805()
{
  ds1805_dat=1;
  ds1805_clk=1;                        //启动总线
  Sdelay();
  ds1805_dat=0;    // Tsu:start=4.7uS
  Sdelay();
  ds1805_clk=0;    // Thd:start=4uS

}
/*******************************************************************
函数原型:   void  Stop_I2c();  
功能:       结束I2C总线,即发送I2C结束条件.
********************************************************************/
void stop_ds1805()
{
 ds1805_dat=0;			                 //释放总线
 Sdelay();
 ds1805_clk=1;
 Sdelay();
 ds1805_dat=1; // Tsu:stop=4uS

}
/*******************************************************************
字节数据传送函数               
函数原型: void  SendByte(uchar c);
功能:将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
     此状态位进行操作.(不应答或非应答都使ack=0 假)     
     发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void ds1805_send8bit(uchar ch)
{
  uchar i;
  for(i=0;i<8;i++)
   {
    ds1805_dat=(bit)(ch&0x80);
	 _nop_();
    ch<<=1;
    ds1805_clk=1;
    _nop_();
    ds1805_clk=0;
    _nop_();
   }   
}

/***************************************************************
字节数据传送函数               
函数: uchar  ds1805_receive8bit();
功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
      发完后请用应答函数。  
*****************************************************************/	

uchar ds1805_receive8bit(void)
{
    uchar a, b=0;     
    for(a=0;a<8;a++)
     {
      ds1805_clk = 1;
      b=b<<1;
      if (ds1805_dat==1)
      b=b|0x01;       //按位或
      ds1805_clk = 0;
     }
   return(b);
}

/********************************************************************
                     应答子函数
原型:  bit Ack_I2c(bit a);
 
功能:主控器进行应答信号,(可以是应答或非应答信号)
********************************************************************/
bit  ds1805_ack(void)
 {
     bit  ack;
     ds1805_dat = 1;
     ds1805_clk = 1;
     if(ds1805_dat==1)	     //如果SDA为高电平表示从器件无应答
       ack = 1;
      else
       ack = 0;      //如果SDA为低电平表示从器件有应答
     ds1805_clk = 0;
     return  (ack);	  //返回应答标志
}
/*************************写入数据*********************/
void ds1805_write(uchar Address,uchar Data)
{
    do
	{				  // 启动总线
      start_ds1805();
      ds1805_send8bit(0x50);  //主器件向从器件发送地址(R/W=0为写)
    }
    while(ds1805_ack());  //从器件若无应答一直循环

     ds1805_send8bit(Address); //发送从器件内部存储的地址
     ds1805_ack();			//主器件发送应答信号
     ds1805_send8bit(Data); //主器件向从器件发送数据
     ds1805_ack();			//主器件发送应答信号
     stop_ds1805();		//释放总线
}
/*******************************
ds1805_read(地址,数据),读一个字节
***********************************/
uchar ds1805_read(uchar Address) 
{
   uchar c;
   do
   {
     start_ds1805();		  // 启动总线 
     ds1805_send8bit(0x50);//主器件向从器件发送地址(R/W=0为写)
   }
  while(ds1805_ack()); //i2c_ack()=1,表示无确认,再次发送

    ds1805_send8bit(Address);  //发送从器件内部存储的地址
    ds1805_ack();			 //发送应答信号

  do
   {
    start_ds1805();	   // 再次启动总线
    ds1805_send8bit(0x51);//主器件向从器件发送地址(R/W=1为读)
   }
  while(ds1805_ack());	//从器件若无应答一直循环
    c=ds1805_receive8bit();  //从器件数据输出
    ds1805_ack();		 //发送应答信号
   stop_ds1805();		//释放总线
    return(c);
}
/***************中断函数***********************/
void time_0() interrupt 1
{
  t0=~t0;
}
/*****************************************************
主函数
******************************************************/
void main()
{
  PMR=0x11;	                         //4x(0x11)/2x(0x10)  内部CLK为晶振的n倍频
  CKMOD=0x08;                            // 定时器0周期为内部CLK   
  EA=1;
  ET0=1;
  EX0=1;
  IT0=1;                       //开INT0中断,设定负跳沿触发方式
  TMOD=0x22;                         //设定T0 T1为16位方式		 
  TH0=TL0=0xf4;                 //T0装初值(50ms)
  TR0=1; 			                 //启动T0
  lni_lcd();                         //初始化lcd
  while(1)
   {
     ds1805_send8bit(0xf0);
	 display();
   }
}

⌨️ 快捷键说明

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