数字电位器程序

合集下载

数字电位器x9241与pic单片机的接口及程序设计 (1)

数字电位器x9241与pic单片机的接口及程序设计 (1)

数字电位器X9241与PIC单片机的接口及程序设计1、 X9241概述X9241是XICOR公司生产的、把4个E2POT数字电位器集成在单片的CMOS 集成电路上的一种数字电位器。

它包含4个电阻阵列,每个阵列包含63个电阻单元,在每个单元之间和2个端点之间都有被滑动单元访问的抽头点。

滑动单元在阵列中的位置由用户通过2线串行总线接口控制。

每个电阻阵列与1个滑动端计数寄存器(WCR)和4个8位数据寄存器联系在一起。

这4个数据寄存器可由用户直接写入和读出。

WCR的内容控制滑动端在电阻阵列中的位置,其功能框图如图1所示。

2、 X9241工作原理X9241支持双向总线的定向规约,是一个从属器件。

它的高4位地址为0101(器件类型辨识符),低4位地址由A3~A0输入端状态决定。

在SDA线上的数据只有在SCL为低期间才能改变状态。

当SCL为高时,SDA状态的改变用来表示开始和终止条件(开始条件:SCL为高时,SDA由高至低的跳变;终止条件:SCL 为高时,SDA由低至高的跳变)。

送给X9241的所有命令都由开始条件引导,在其后输出X9241从器件的地址。

X9241把串行数据流与该器件的地址比较,若地----------专业最好文档,专业为你服务,急你所急,供你所需-------------址比较成功,则作出一个应答响应。

送到X9241的下一个字节包括指令及寄存器指针的信息,高4位为指令,低4位用来指出4个电位器中的1个及4个辅助寄存器中的1个,其格式为:I3 I2 I1 I0 P1 P0 R1 R0指令电位器选择寄存器选择9条指令中的4条以发送指令字节作为结束。

这些二字节指令在WCR与数据寄存器中的1个之间交换数据;4条指令为三字节指令,这些指令在主机与X9241之间传输数据(包括主机与1个数据寄存器和主机与WCR之间);还有1条指令1。

为增加/减少指令。

三类指令的指令序列及说明见图2及表----------专业最好文档,专业为你服务,急你所急,供你所需-------------X9241包括4个WCR,每个E2POT电位器各1个,WCR可以被认为是一个6位并行和串行装载的带有输出译码的计数器,用来选择电阻阵列的64选1的开关。

数字电位器的原理与应用

数字电位器的原理与应用

数字电位器的原理与应用1. 什么是数字电位器数字电位器(Digital Potentiometer)是一种可编程的电阻器,它可以模拟传统的机械电位器,但具有更高的精度和可编程功能。

数字电位器提供了一种数字控制方式来改变电阻值,使得电路调节更加灵活和精确。

2. 数字电位器的原理数字电位器的原理基于模拟信号转换为数字信号的思想。

简单来说,数字电位器由电压调节器、控制逻辑和电阻网络组成。

2.1 电压调节器电压调节器是数字电位器的关键组成部分,它可以将输入的电压信号转换为有效的控制信号。

电压调节器可以将输入电压分成多个离散的电平,并通过控制逻辑来选择输出。

这种方式可以实现电阻值的精确调节。

2.2 控制逻辑控制逻辑是数字电位器中的控制中心,它接收外部的数字控制信号,并将其转换为电阻值的变化。

控制逻辑通常由微控制器或FPGA实现,可以根据需要编程,实现各种功能和算法。

2.3 电阻网络电阻网络是数字电位器的核心组成部分,它由一系列离散的电阻单元组成。

电阻网络可以通过调整电阻单元的开关状态来改变总的电阻值。

通过控制逻辑的指令,电阻网络可以实现电阻值的调节。

3. 数字电位器的应用数字电位器由于其可编程性和精确性,在各种领域得到了广泛的应用。

以下是几个常见的应用领域:3.1 模拟信号调节数字电位器可以用于模拟电路中的信号调节,如音频放大器、滤波器等。

通过调整数字电位器的电阻值,可以实现对信号的增益、频率响应等参数的调节,从而实现音频信号的精确控制。

3.2 数字控制电路数字电位器可以用于数字控制电路中,如数字电源、自动控制系统等。

通过数字电位器的电阻值调节,可以精确控制电路的参数,实现高精度的数字控制。

3.3 数字电位器阻值校准数字电位器可用于阻值的校准和测试。

在一些测量系统中,数字电位器可以用来调节信号源的输出,以完成对测量设备的校准。

数字电位器的可编程性保证了校准过程的精确性和稳定性。

3.4 数据传输数字电位器也可用于数据传输中,如数字通信、存储器等。

数字电位器与控制

数字电位器与控制

数字电子电路课程设计:数字电位器与控制一、实验目的根据时序图和真值表设计按钮控制数字电位器控制电路:1基本要求:按住控制键,数字电位器阻值连续变化。

2扩展要求:可使用Protues等软件进行仿真设计。

3扩展电路要求:按住控制键,数字电位器阻值连续变化且变化速度递增/递减。

二、实验仪器74LS132 2输入端与非门NE555X9C103 数字电位器二极管,电容,电阻,开关等三、实验原理(1)、X9C103一般说明X9C103 E2POT TM非易失性数控电位器,端电压±5V,100个抽头X9C13是固态非易失性电位器,把它用做数字控制的微调电阻器是理想的..X9C13是一个包含有99个电阻单元的电阻阵列.在每个单元之间和二个端点都有可以被滑动单元访问的抽头点.滑动单元的位置CS,U/D和INC三个输入端控制.滑动端的位置可以被贮存在一个非易失性存贮器中,因而在下一次上电工作时可以被重新调用. X9C103的分辨率等于最大的电阻值被99除.例如X9C503(50千欧)的每个抽头间的阻值为505欧母.所有的Xicor非易失性存贮器都设计成并经过测试能够用于持久的保存数据的应用场合.特点:*低功耗CMOS——VCC=3V至5.5V——工作电流最大3mA——等待电流最大500µA*99个电阻单元——有温度补偿——±20%端点到端点阻值范围*100个滑抽头点——滑动端的位置取决于三线接口——类似于TTL升/降计数器——滑动端位置贮存于非易失性存贮器中。

可在上电时重新调用*滑动端位置数据可保存100年*X9C103==10KΩ数控电位器控制时序图如下:CSINCU/D图1.1引脚配置及引脚说明从555电路的内部结构可知,这个控制端UC 电压是取自3只分压电阻R 1与R 2间,即取自比较器A 1的同相输入端。

UC 端的固定电压即比较器A 1的参考电压,由电路内的3只分压电阻决定,为固定的2U CC /3。

高分辨率数字电位器 X9241 的软件实现

高分辨率数字电位器 X9241 的软件实现

高分辨率数字电位器X9241 的软件实现
引言
与机械电位器相比,数字电位器有许多优点。

但是在有些应用场合,数
字电位器的分辨率往往达不到设计要求,通常最大抽头数为1 024。

以X9241 为例,内部包括一个I2C 接口和4 个64 抽头的数字电位器,可独立使用,也
可串联使用,如按常规方法使用,其分辨率较低,即使4 个电位器串联,也只
能达到256 个抽头。

本文提出了一种软件、硬件结合的方法,可使电位器的中
间抽头数达到8 001 个,分辨率达到0.008%。

1 设计原理
1.1 基本原理
高分辨率数字电位器POT 由4 个电位器组成,如图1 所示,4 个数字电
位器POT0、POT1、POT2、POT3 均为64 抽头数字电位器。

POTO、POT3 的固定端并联,滑动端分别接POT12 的固定端。

POT12 由POT1、POT2 串联,组成一个127 抽头的电位器。

4 个独立电位器阻值相等,可根据需要选取。


分辨率数字电位器的固定端为VH、VL,滑动端为VW,VW 由POT1、POT2
的2 个滑动端并连。

假设POT0、POT1、POT2、POT3、POT12 的滑动端位置分别为
x0、x1、x2、x3、y,POT 的滑动端位置为z。

现采取以下控制策略:
①若POT3 的滑动端位置为x,则POTO 的滑动端位置同步调节到
x+1,即两电位器始终保持1 的间隔,相当于粗调节;
②调节POTl2 滑动端位置y,相当于把间隔为1 的区间再细分若干等分,。

基于MSP430的X9C102、103、103、503等数字电位器的驱动程序

基于MSP430的X9C102、103、103、503等数字电位器的驱动程序
#define X9_Port_OUT P1OUT
BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ
do
{
IFG1&=~OFIFG; //清除震荡标志
for(i=0;i<100;i++)
_NOP(); //延时等待
void SYS_Init();
****************************************x9.c************************************
#include "initial.h"
#include "X9.h"
/******************************************************************************
函数名称:X9_Init()
函数功能:数控电位器初始化,包括对其复位,具体见函数体。
函数参数:无
函数返回值:无
******************************************************************************/
void X9_Init()
****************************************main.c************************************
#include "initial.h"
#include "X9.h"
void main()
{
SYS_Init();

数字电位器工作原理

数字电位器工作原理

数字电位器工作原理嘿,你知道数字电位器吗?这小玩意儿可神奇啦!就像一个魔法盒子,能精准地控制电路中的电阻值。

数字电位器,听起来就很有科技感。

它到底是怎么工作的呢?其实啊,它就像是一个电子世界里的小管家,负责调节电阻的大小。

打个比方吧,数字电位器就像是一个可以精确调节水量的水龙头。

你想要多少水,就可以通过调节水龙头的开关来控制。

数字电位器也是一样,你想要多大的电阻值,就可以通过数字信号来控制它。

数字电位器主要由数字控制部分和电阻阵列组成。

数字控制部分就像是大脑,负责接收指令并控制电阻阵列。

电阻阵列呢,就像是身体,由许多电阻单元组成。

这些电阻单元可以通过数字信号来连接或断开,从而改变整个电位器的电阻值。

当你给数字电位器发送一个数字信号时,它就会根据这个信号来选择电阻阵列中的电阻单元。

如果信号是“0”,它可能会选择一个较小的电阻单元;如果信号是“1”,它可能会选择一个较大的电阻单元。

这样,通过不同的数字信号组合,就可以得到不同的电阻值。

数字电位器的精度非常高,可以精确到很小的电阻值变化。

这就像是一个超级精确的天平,可以准确地测量出很小的重量变化。

而且,数字电位器还可以通过编程来实现自动化控制。

你可以把它连接到微控制器或计算机上,通过软件来控制它的电阻值。

这就像是给电子设备装上了一个智能遥控器,可以随时随地控制它的性能。

数字电位器的应用非常广泛。

在音频设备中,它可以用来调节音量;在电子仪器中,它可以用来校准测量仪器;在工业自动化中,它可以用来控制电机的速度。

可以说,数字电位器是电子世界里的一个小明星,到处都有它的身影。

数字电位器的优点可不少呢!它体积小、重量轻、功耗低,非常适合在小型电子设备中使用。

而且,它的可靠性高,使用寿命长,可以长时间稳定地工作。

这就像是一个忠诚的小伙伴,一直陪伴着你的电子设备。

那么,数字电位器有没有什么缺点呢?嗯,可能它的价格相对较高一些。

但是,考虑到它的高性能和广泛应用,这点价格也不算什么啦!毕竟,好东西总是值得付出一些代价的。

数字电位器的工作原理

数字电位器的工作原理

数字电位器的工作原理
嘿,朋友们!今天咱来聊聊数字电位器这玩意儿的工作原理,可有意思啦!
你看啊,数字电位器就像是一个超级灵活的电阻小管家。

它里面有好多小小的电阻单元,就像一群排列整齐的小士兵。

想象一下,电流就像是一个着急赶路的人,它要通过这些电阻。

而数字电位器呢,就可以决定让电流走哪条路,走多少电阻。

它是怎么做到的呢?其实啊,数字电位器有个聪明的控制部分,就好像是这个小管家的大脑。

我们通过一些外部的信号,比如按钮啊、电脑指令啊之类的,来告诉这个大脑我们想要的电阻值。

然后呢,这个大脑就开始指挥那些小电阻单元啦!它可以把一些电阻单元接入电路,让电流通过;也可以把一些电阻单元给隔离开,不让电流走那儿。

这不就像我们开关家里的灯一样嘛,想开就开,想关就关,多方便呀!
而且哦,数字电位器的精度还挺高呢!它能很精确地控制电阻值,就像是一个很会拿捏分寸的大师傅。

这样一来,我们在各种电路里就能得到我们想要的准确的效果啦。

比如说,在音频设备里,数字电位器可以帮我们调节音量大小,让声音听起来刚刚好,不大也不小,多棒啊!或者在一些测量仪器里,它能帮忙调整测量的精度,让数据更准确可靠。

你说这数字电位器是不是很神奇呀?它就像一个默默工作的小能手,在各种电路里发挥着重要的作用呢!虽然它个头不大,但是本事可不小哟!
总之呢,数字电位器就是通过它聪明的控制部分和那些小电阻单元的配合,实现对电阻值的精确控制。

它让我们的电路变得更加智能、更加好用。

以后我们再看到那些有着各种奇妙功能的电子设备,可别忘了里面可能就有数字电位器这个小家伙在默默奉献呢!。

X9241控制程序

X9241控制程序

/****************************************************标题:单片机控制T类功放实现功能:1:通过单片机控制X9241数字电位器四个电位器的阻值大小,从而调节功放前级处理芯片LM4610的音量、低音、高间、平衡音。

2:通过扫描功放芯处TA2020过载标志位,自动减少放大倍数,从而减少因输入信号过大而导致的失真。

3:通过控制功放TA2020的SLEEP和MUTE,消除功放在开机、关机时的冲击噪声。

4:通过控制继电器,从而控制环形变压器,保护芯片,减少待机功耗。

5:显示设备为12864液晶显示器。

可显示当前音量、低音、高音、平衡音的相对值,6:输入设备有按键(采用行列式键盘:分8个:低音+、-,音量+-,平衡音+-,高音+-.7;可设置3D、金属音音效(通过短路帽连接)编写人:涂俊华2010年11月10日于湖南工学院***************************************************//*****************************************///#include <reg52.h>#include <intrins.h>#include <LCD12864.h>#define uchar unsigned char#define uint unsigned int#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};#define OP_READ 0xa1 // 器件地址以及读取操作#define OP_WRITE 0xa0 // 器件型号及地址1010 A2 A1 A0 读/写控制#define MAX_ADDR 0x7f // AT24C02最大地址uchar code yejingtable[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x20,0x2e,0x0f};//0--9 灭小数点星号sbit OVERLOAD = P2^2;sbit SCL = P2^3;sbit SDA = P2^4;void start();void stop();uchar shin();bit shout(uchar write_data);uchar read_random(uchar random_addr);void write_byte( uchar addr, uchar write_data);void fill_byte(uchar fill_data);void delayms(uchar ms);void delay(uint m);uchar table[10];uchar keyscan();uchar bass,volume,balance,treble,time;//即四个电位器的相对值VR0,VR1,VR2,VR3void lcd_set();void write_cmd(uchar command);void write_data(uchar data0);void lcd_clear();void readall();void c_bass(uchar bass);void c_volume(uchar volume);void c_balance(uchar balance);void c_treble(uchar treble);void main(void){uchar m;EA=1;TMOD=0x01;ET0=1; //采用中断方式进行工作TH0=0X3C,TL0=0XB0; //采用定时器0开计时TR0=1;delayms(2000);/* c_bass(0x2f);c_volume(0x3f);c_balance(0x1f);c_treble(0x2f); */readall(); //读出当前各种相对值lcd_clear();lcd_set();display(1,3,"敬请聆听");display(2,3,"T 类音效");display(3,1,"制作团队:");display(4,6,"北斗星");//*******************while(1){if(OVERLOAD==0){volume--;c_volume(volume);readall();}switch(keyscan()){case 'c':bass--;time=0;if(bass==0) bass=1;c_bass(bass);readall();break;case 'd':bass++;time=0;if(bass==64) bass=63;c_bass(bass);readall();break;case 'e':volume--;time=0;if(volume==0) volume=1;c_volume(volume);readall();break;case 'f': volume++;time=0;if(volume==64) volume=63;c_volume(volume);readall();break;case 8: balance--;time=0;if(balance==0) balance=1;c_balance(balance);readall();break;case 9: balance++;time=0;if(balance==64) balance=63;c_balance(balance);readall();break;case 'a': treble--;time=0;if(treble==0) treble=1;c_treble(treble);readall();break;case 'b': treble++;time=0;if(treble==64) treble=63;c_treble(treble);readall();break;default : break;}}}void start()// 开始位{SDA = 1;SCL = 1;_nop_();_nop_();_nop_();SDA = 0;_nop_();_nop_();_nop_();_nop_();SCL = 0;}void stop()// 停止位{SDA = 0;SCL = 1;_nop_();_nop_();_nop_();SDA = 1;_nop_();_nop_();_nop_();_nop_();SDA = 0;}uchar shin()// 从AT24Cxx移入数据到单片机{uchar i,read_data;SDA=1;for(i = 0; i < 8; i++){read_data <<= 1;SCL = 1;_nop_();_nop_();_nop_();read_data |= (uchar)SDA;SCL = 0;}return(read_data);}bit shout(uchar write_data) // 从单片机移出数据到AT24Cxx,已包含应答信号{uchar i;bit ack_bit;for(i = 0; i < 8; i++) // 循环移入8个位{SDA = (bit)(write_data & 0x80);_nop_();_nop_();_nop_();SCL = 1;_nop_();_nop_();_nop_();SCL = 0;write_data <<= 1;}SDA = 1; // 读取应答_nop_();_nop_();_nop_();_nop_();SCL = 1;_nop_();_nop_();_nop_();_nop_();_nop_();ack_bit = SDA;SCL = 0;return ack_bit; // 返回A T24Cxx应答位}void write_byte(uchar addr, uchar write_data)// 在指定地址addr处写入数据write_data{start();shout(OP_WRITE);shout(addr);shout(write_data);stop();delayms(10); // 写入周期}void fill_byte(uchar fill_data)// 填充数据fill_data到EEPROM内{uchar i;for(i = 0; i < MAX_ADDR; i++){write_byte(i, fill_data);}}uchar read_current()// 在当前地址读取{unsigned char read_data;start();shout(OP_READ);read_data = shin();stop();return read_data;}uchar read_random(uchar random_addr)// 在指定地址读取{start();shout(OP_WRITE);shout(random_addr);return(read_current());}void delayms(uint count){uint j;while(count--!=0){for(j=0;j<82;j++);}}//****************************************************** uchar keyscan(){uchar temp,num='z';P1=0xfe;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delayms(15);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xee:num=0; break;case 0xde:num=1; break;case 0xbe:num=2; break;case 0x7e:num=3; break;}while(temp!=0xf0) //等待键松开{temp=P1;temp=temp&0xf0;}}}P1=0xfd;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delayms(15);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xed:num=4; break;case 0xdd:num=5; break;case 0xbd:num=6; break;case 0x7d:num=7; break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xfb;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delayms(15);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xeb:num=8; break;case 0xdb:num=9; break;case 0xbb:num='a'; break;case 0x7b:num='b'; break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}P1=0xf7;temp=P1;temp=temp&0xf0;while(temp!=0xf0){delayms(15);temp=P1;temp=temp&0xf0;while(temp!=0xf0){temp=P1;switch(temp){case 0xe7:num='c'; break;case 0xd7:num='d'; break;case 0xb7:num='e'; break;case 0x77:num='f'; break;}while(temp!=0xf0){temp=P1;temp=temp&0xf0;}}}return num;}//********************************************** /*****************写指令程序********************/ void write_cmd(uchar command){delay(100);rs=0;rw=0;P0=command;en=1;_nop_();_nop_();en=0;}void write_data(uchar data0) {delay(100);rs=1;rw=0;P0=data0;en=1;_nop_();_nop_();en=0;}void lcd_set(){write_cmd(0x34);write_cmd(0x30);write_cmd(0x01);write_cmd(0x06);write_cmd(0x0c);}void lcd_clear(){write_cmd(0x01);write_cmd(0x34);write_cmd(0x30);}void delay(uint m){while(--m);}void readall(){lcd_clear();start();shout(0x50); //发送器件型号0101及地址0000shout(0x90); //发送读WCR命令1001 VR0 00 **bass=shin(); //读取bass值stop();start();shout(0x50); //发送器件型号0101及地址0000shout(0x94); //发送读WCR命令1001 VR1 01 **volume=shin(); //读取volume值stop();start();shout(0x50); //发送器件型号0101及地址0000shout(0x98); //发送读WCR命令1001 VR2 10 **balance=shin(); //读取balance值stop();start();shout(0x50); //发送器件型号0101及地址0000shout(0x9c); //发送读WCR命令1001 VR3 11 **treble=shin(); //读取treble值stop();display(1,1,"低音相对值");display(2,1,"音量相对值");display(3,1,"平衡音相对值");display(4,1,"高音相对值");write_cmd(0x87);write_data(yejingtable[bass/10]);write_data(yejingtable[bass%10]);write_cmd(0x97);write_data(yejingtable[volume/10]);write_data(yejingtable[volume%10]);write_cmd(0x8f);write_data(yejingtable[balance/10]);write_data(yejingtable[balance%10]);write_cmd(0x9f);write_data(yejingtable[treble/10]);write_data(yejingtable[treble%10]); //利用单片机显示数值}///////////////////////////////////////////////////////////void c_bass(uchar bass){start();shout(0x50); //发送器件型号0101及地址0000 shout(0xc0); //写数据shout(bass); //送一个中间值stop();delayms(100);start();shout(0x50); //发送器件型号0101及地址0000 shout(0x10); //将VR0的阻值送给WCRstop();}void c_volume(uchar volume){start();shout(0x50); //发送器件型号0101及地址0000 shout(0xc4); //写数据shout(volume); //送一个中间值stop();delayms(100);start();shout(0x50); //发送器件型号0101及地址0000 shout(0x14); //将VR0的阻值送给WCRstop();}void c_balance(uchar balance){start();shout(0x50); //发送器件型号0101及地址0000 shout(0xc8); //写数据shout(balance); //送一个中间值stop();delayms(100);start();shout(0x50); //发送器件型号0101及地址0000 shout(0x18); //将VR0的阻值送给WCRstop();}void c_treble(uchar treble){start();shout(0x50); //发送器件型号0101及地址0000 shout(0xcc); //写数据shout(treble); //送一个中间值stop();delayms(100);start();shout(0x50); //发送器件型号0101及地址0000 shout(0x1c); //将VR0的阻值送给WCRstop();readall();}//////////////////////////////////////////////////////////////////////void timer0()interrupt 1{TH0=0X3C,TL0=0XB0;time++;if(time==250){time=0;lcd_clear();lcd_set();display(1,3,"敬请聆听");display(2,3,"T 类音效");display(3,1,"制作团队:");display(4,6,"北斗星");}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

sbit X_CS_1=P1^0; //
sbit X_INC=P1^1;//
sbit X_UD=P1^2; //
sbit X_CS_2=P1^4; //
//有关电位器的宏定义
#define SETB_X9C103_CS1 X_CS_1=1
#define CLRB_X9C103_CS1 X_CS_1=0
#define SETB_X9C103_INC X_INC=1
#define CLRB_X9C103_INC X_INC=0
#define SETB_X9C103_UD X_UD=1
#define CLRB_X9C103_UD X_UD=0
#define SETB_X9C103_CS2 X_CS_2=1
#define CLRB_X9C103_CS2 X_CS_2=0
void X9C103_Inc_N_Step(unsigned char Sel,unsigned char N);
void X9C103_Dec_N_Step(unsigned char Sel,unsigned char N);
void Delay(unsigned int t) ;
void X9C103_Init(unsigned char Sel);//初始化至中间位置
//延时us子程序
void Delay(unsigned int t)
{
unsigned int i;
for(i=0;i&lt;t;i++) ;
}
//************************************************************************ // 数字电位器向上调一步
// 数字电位器100个抽头,相当于99步
//************************************************************************ void X9C103_Inc_N_Step(unsigned char Sel,unsigned char N)
{
unsigned char i=0;
SETB_X9C103_UD; // U/D 拉高则下面的INC下沿,执行UP操作
Delay(3); // 延时大约2us
switch(Sel)
{
case 1:
CLRB_X9C103_CS1;
break;
case 2:
CLRB_X9C103_CS2;
break;
default:break;
}
// CLRB_X9C103_CS; // CS 拉低
for(i=N;i&gt;0;i--)
{
SETB_X9C103_INC; // 拉高INC 因为INC的下沿有效
Delay(2); // 延时2us左右
CLRB_X9C103_INC; // INC 拉低; // 产生一个下沿
Delay(600); // 延时大约500us, Rw等待输出稳定
}
SETB_X9C103_INC;//保存模式
switch(Sel)
{
case 1:
SETB_X9C103_CS1;
break;
case 2:
SETB_X9C103_CS2;
break;
default:break;
} // 完毕CS拉高 //store
}
//************************************************************************ // 数字电位器向下调一步
// 数字电位器100个抽头,相当于99步
//************************************************************************ void X9C103_Dec_N_Step(unsigned char Sel,unsigned char N)
{
unsigned char i=0;
CLRB_X9C103_UD; // U/D 清0,则下面的INC下沿,执行Down操作
Delay(3); // 延时大约2us
switch(Sel)
case 1:
CLRB_X9C103_CS1;
break;
case 2:
CLRB_X9C103_CS2;
break;
default:break;
}
for(i=N;i&gt;0;i--)
{
SETB_X9C103_INC; // 拉高INC 因为INC的下沿有效Delay(2); // 延时2us左右
CLRB_X9C103_INC; // INC 拉低; // 产生一个下沿Delay(600); // 延时大约500us, Rw等待输出稳定}
SETB_X9C103_INC;//保存模式
switch(Sel)
{
case 1:
SETB_X9C103_CS1;
break;
case 2:
SETB_X9C103_CS2;
break;
default:break;
} // 完毕CS拉高 // store
}
void X9C103_Init
(unsigned char Sel)
{
X9C103_Dec_N_Step(Sel,99);
X9C103_Inc_N_Step(Sel,49);
}。

相关文档
最新文档