📄 ds1805.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 + -