x9c104数字电位器的台阶数

x9c104数字电位器的台阶数,第1张

100阶。

x9c104数字电位器下载商家给的文件一个程序和一个手册:下载程序 按照程序内接线vcc,gnd,Inc,u/d,cs、用电压表侧量rw和rl之间的电阻、用高电平触碰P06降低电阻、触碰P07上高电阻。这个芯片的输出电阻最小是40欧姆,最大是100K,有100阶每阶1040欧姆。

这个芯片利用1(INC)、2(U/D)、7(CS)与单片机通讯,根据这3条引脚所接收到的有规律的高低电平来实现内部可变电阻的调节功能。第3脚:Vh/Rh 是内部滑动电阻的上端 (对应传统电位器的音频信号输入脚)第5脚:Vw/Rw 是内部滑动电阻的可变中端(对应传统电位器的滑臂引脚)第6脚:Vl/Rl 是内部滑动电阻的下端(对应传统电位器的GND引脚)

X9C103这款数字电位器没有数字接口,不能通过单片机直接读出其导通抽头的位置,也不能直接设置其位置。如果换用X9221W可以解决这一问题,X9221(还有X9241)有数字接口可以和单片机通信(以脉冲数来读出或设置其导通抽头的位置)。

#include"reg52h"

#include"intrinsh"

#define uchar unsigned char

sbit inc=P0^0; //脉冲输出端

sbit ud=P0^1; //方向端

sbit cs=P0^2; //片选端

sbit led=P2^0; //指示灯

/以下是函数声明/

void x9c104s_inc(uchar number);

void x9c104s_dec(uchar number);

void x9c104s_set(uchar number);

/设定初始值/

void x9c104s_set(uchar number)

{

uchar i;

inc=1;

_nop_();

_nop_();

cs=0;

_nop_();

_nop_();

ud=0; //方向为减

_nop_();

_nop_();

for(i=0;i<100;i++) /因为该芯片为100抽头 所以先清零/

{

inc=1;

_nop_();

_nop_();

inc=0;

_nop_();

_nop_();

}

ud=1; //方向朝上

_nop_();

_nop_();

for(i=0;i<number;i++) //设定初始值

{

inc=1;

_nop_(); //下降沿有效

_nop_();

inc=0;

_nop_();

_nop_();

}

inc=1; //以下为保存设定值

_nop_();

_nop_();

cs=1;

_nop_();

_nop_();

ud=1;

_nop_();

_nop_();

inc=1;

}

/函数为重新增加阻值/

void x9c104s_inc(uchar number)

{

uchar i;

inc=1;

_nop_();

_nop_();

cs=0;

_nop_();

_nop_();

ud=1;

_nop_();

_nop_();

for(i=0;i<number;i++) //设定阻值

{

inc=1;

_nop_();

_nop_();

inc=0;

_nop_();

_nop_();

}

inc=1; //以下为保存设定值

_nop_();

_nop_();

cs=1;

_nop_();

_nop_();

ud=1;

_nop_();

_nop_();

inc=1;

}

/函数为阻值减小/

void x9c104s_dec(uchar number)

{

uchar i;

inc=1; //选中该芯片

_nop_();

_nop_();

cs=1;

_nop_();

_nop_();

ud=0; //方向为减小

_nop_();

_nop_();

for(i=0;i<number;i++)

{

inc=1;

_nop_();

_nop_();

inc=0;

_nop_();

_nop_();

}

inc=1; //保存设定值

_nop_();

_nop_();

cs=1;

_nop_();

_nop_();

ud=1;

_nop_();

_nop_();

inc=1;

}

void main()

{

led=0;

x9c104s_set(10);

x9c104s_inc(60); //三个函数都使用一下 防止警告

x9c104s_dec(10);

}

这个芯片是一个数字电位器的芯片,淘宝上也挺多的,不同的型号主要是最大阻值不同,有模块但是我看模块好像就是加了几个去耦电容,所以理论上用芯片也是可以直接用的。然后后缀是p开头的是直插的,s开头的是贴片的

数据手册在这里

总的来说就是一个可以用单片机控制的电位器,电位器的三个引脚分别对应Rl、Rh、Rw

这里有中文版本的引脚定义

搜了下github好像有人写这个芯片的arduino库,不过这个库的作者有点奇怪是,在h文件里不仅写了声明还写了实现。。。

>

我来说一下我的方案,这个我验证过,方法如下:

其实用一个定时器就够了,外部中断接按键,一个用来频率加,一个用来频率减,即做调节频率用,8路频率从P0口输出,定时器产生中断,比如1us,那么我到1us时对P00取反,同时中断里在定义一个变量t1,那么t1计中断次数,假如计到5时我让P10取反,儿至于计到几有外部中断来定义,比如定义一个全局变量f,INT0按一次则f++,INT1S按一次f- -,如此频率得以控制,定时器处理如下:

void TIME0_ISR(void) interrupt 2

{

t1++;

if(t1==f) p00=~p00;

if(t1==f) p01=~p01;

if(t1==f) p02=~p02;

if(t1==f) p03=~p03;

if(t1==f) p04=~p04;

if(t1==f) p05=~p05;

if(t1==f) p06=~p06;

if(t1==f) {p07=~p07; f=0;}

}

当然这只是简单的用51本身资源产生而已,还可以用专门的外围电路来实现,我给你一个四路频率产生程序,思想如上,已验证过

/四路频率产生器/

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

/常量定义/

sbit pwm1=P1^0; //第一路频率 1s内产生5000个脉冲

sbit pwm2=P1^1; //第二路频率 1s内产生1000个脉冲

sbit pwm3=P1^2; //第三路频率 1s内产生2500个脉冲

sbit pwm4=P1^3; //第四路频率 1s内产生500个脉冲

uchar cout1,cout2; //分别用来定义时间宽度

uchar t0_max=10,t1_max=100;

/定时器0初始化函数/

void time0_ini() //定时0初始化

{

TMOD=0X02; //采用定时器0,选择模式2

TH0=0xA3; //01ms定时

TL0=0Xa3;

ET0=1; //允许定时器溢出中断

TR0=1; //启动定时器

}

/外部中断0初始化/

void INT0_ini()

{

EX0=1; //外部中断0允许

IT0=1; //选择边沿触发方式

}

/定时器1初始化/

void time1_ini()

{

TMOD=0X20; //采用定时器1,选择模式2

TH1=0XA3 ; //定时01ms

TL1=0XA3;

ET1=1; //允许定时器中断

TR1=1; //启动定时器1

}

/主函数/

void main()

{

time0_ini(); //调用定时器0初始化函数

time1_ini(); //调用定时器1初始化函数

INT0_ini();

cout1=0;

cout2=0;

pwm1=0; //没一路频率都从低电平开始

pwm2=0;

pwm3=0;

pwm4=0;

EA=1; //打开总中断

while(1); //一直停留在主函数中

}

/定时器中断服务程序/

void tim0_ISR() interrupt 1 //定时0中断服务程序

{

cout1++; //计数变量加1

if(cout1==t0_max)

{

pwm1=~pwm1; //每当到了1ms时取反一次电平,即周期为2ms,1s内产生500个脉冲

}

if(cout1==(t0_max+10))

{

cout1=0; //每当到了2ms时取反一次电平,即周期为4ms,1s内产生250个脉冲

pwm2=~pwm2;

}

}

/定时器1中断服务程序/

void time1_ISR() interrupt 3 //定时器3中断服务程序

{

cout2++;

if(cout2==t1_max)

{

pwm3=~pwm3; //每当到了10ms时取反一次电平,即周期为20ms,1s内产生50个脉冲

}

if(cout2==(t1_max+150))

{

cout2=0; //每当到了25ms时取反一次电平,即周期为50ms,1s内产生20个脉冲

pwm4=~pwm4;

}

}

/外部中断0服务程序/

void INT0_ISR() interrupt 0

{

if(t0_max>200) t0_max=10; //清楚上限

if(t1_max>2000) t1_max=100;

t0_max=t0_max+10;

t1_max=t1_max+100;

}

以上就是关于x9c104数字电位器的台阶数全部的内容,包括:x9c104数字电位器的台阶数、我的X9C103有时候会随机出现一个阻值,不按照程序来,请问你是怎么解决的呀望告知,谢谢、51单片机如何控制x9c104p数字电位器等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9353881.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存