标题:
数字电位器X9C103 100级调节电路和单片机源程序
[打印本页]
作者:
GUOXUAN
时间:
2017-12-17 10:56
标题:
数字电位器X9C103 100级调节电路和单片机源程序
数字电位器在90年代就有了,当时大学DIY HI-END顶级音响流行想用它来做音量电位器,但是价格非常昂贵.现已出来很多年价格尚可接受,但也和STM32差不多价!它在某些场合可以高可靠性地代替普通模拟电位器,如美国美信公司生产的10K欧姆的X9C103,它有100级调节,每档100欧姆.可做为音量调节电路,仪器模拟量调节及数控电源DIY什么的,其实前不久我买几块回来就是想DIY数控电源(在大虾眼中就是"假数控吧"),下面贡献买来的所有资料和原程序. 由于水平有限,专业软件的我不懂,我也没有时间测试X9C103行不行,我现在就是善良地为老师大神大虾们无条件地分享资料(美信公司20年前的东西,应该没有版权问题)谢谢!
原理图:
0.jpg
(12.15 KB, 下载次数: 192)
下载附件
2017-12-17 13:09 上传
使用说明
一、基础部分
数字电位器 X9c103 模块是一款宽电压(3V-5V)供电,10K满量程电位器。
电位器中间抽头在 0-10k 间滑动共 100 级(电位器滑动端典型阻抗 40 欧) 数字电位器 VL 和 VH 端口分别对应滑动变阻器的低端和高端,允许输入电压范围-5V 到+5V。 数字电位器模块附带测试程序,程序代码为 C 语言代码,分模块编写。代码包括:主函数、显示子函数、按键子函数以及各模块的头文件,可以采用 KEIL4 打开源代码经行测试和学习。
二、测试部分
如只需测试模块使用可不研究源代码,将测试程序中.HEX 文件下载到目标板。
1、按键子函数共涉及两个按键检测和控制,分别对应 P3^2 和P3^3.两个按键每次按下分别实现 10K 数字电位器中间滑动端往上端和往下端滑动1k数值。数字电位器接口说明:INC 接 P2^0,U_D 接P2^1,CS 接P2^2。
2、显示器接口:电源端口 VCC(2 脚) GND(1 脚)接 5V 电源。数据端口 D0-D7(7 脚到14 脚)接P0 口(P0^0 - P0^7)。对比度调节端口 VL(3 脚)为液晶显示器对比度调整端用电位器分压得到 0V-5V 中间某一电压使液晶清晰显示。控制端口 RS(4 脚)为寄存器选择,高电平1 时选择数据寄存器、低电平0 时选择指令寄存器。控制端口 RW(5 脚)为读写信号线,高电平(1)时进行读操作控制端口 EN(6 脚)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。
单片机源程序如下(key部分):
/*
* 按键子函数子函数
* 按键子函数共涉及两个按键检测和控制,分别对应P3^2和P3^3.两个按键每次按下分别实现10K数字
* 电位器中间滑动端往上端和往下端滑动1k数值。
* 数字电位器接口说明:INC接P2^0,U_D接P2^1,CS接P2^2。
*/
#include"HEADER.h"
#include"LCD1602.h"
#include"BUTTON.h"
volatile unsigned char FLAG_BUTTON = 0;//按键检测标志位
volatile unsigned char BUTTON_DAT = 0;//按键键值变量
volatile unsigned int TIME_10MS = 0;//时间变量
volatile unsigned char VOLUME = 0;//电位器值
void T0_Timer() interrupt 1//定时器0中断服务程序
{
TR0 = 0;
// WDT_CONTR = 0X31; //喂狗
TH0 =55536/256; //重装初值
TL0 =55536%256; //重装初值
TR0 = 1;
TIME_10MS ++; //time_10ms变量累加
if(TIME_10MS == 1000)TIME_10MS = 0;//time_10ms变量清零
ButtonTest();//按键检测;
}
void ButtonTest(void)
{
static uchar Count_ButtonDown;//静态按键按下计数
static uchar Count_ButtonUp;//静态按键松开计数
if((SW_1 == 0)||(SW_2 == 0))
{
Count_ButtonDown++;
Count_ButtonUp = 0;
if(Count_ButtonDown==2)
{
if(SW_1 == 0)BUTTON_DAT = 1;
else if(SW_2 == 0)BUTTON_DAT = 2;
if(BUTTON_DAT != 0)FLAG_BUTTON = 1;
}
if(Count_ButtonDown>=50)
{
Count_ButtonDown = 0;
if(SW_1 == 0)BUTTON_DAT = 1;
else if(SW_2 == 0)BUTTON_DAT = 2;
if(BUTTON_DAT != 0)FLAG_BUTTON = 1;
}
}
else
{
if(Count_ButtonDown>2) //如果按键已经确认按下,则开始判断松开
{
Count_ButtonUp++;
if(Count_ButtonUp>=2)
{
Count_ButtonUp = 0;
Count_ButtonDown = 0;
}
}
}
}
void ButtonService(unsigned char dat)
{
switch(dat)
{
case 1: //电位器值增加
{
unsigned char n = 0;
CS = 0;
U_D = 1;
_nop_();
for(n=10;n>0;n--)
{
INC = 0;
_nop_();
_nop_();
INC = 1;
}
CS = 1;
VOLUME++;
if(VOLUME > 10)VOLUME = 10;
DISPLAY[0] = VOLUME%100/10+0x30;
DISPLAY[1] = VOLUME%10+0x30;
Lcd_Set_xy(2,7);
Lcd_Wdat(DISPLAY[0]);
Lcd_Wdat(DISPLAY[1]);
}
break;
case 2: //电位器值减小
{
unsigned char n = 0;
CS = 0;
U_D = 0;
_nop_();
for(n=10;n>0;n--)
{
INC = 0;
_nop_();
_nop_();
INC = 1;
}
CS = 1;
if(VOLUME == 0)VOLUME = 1;
VOLUME--;
DISPLAY[0] = VOLUME%100/10+0x30;
DISPLAY[1] = VOLUME%10+0x30;
Lcd_Set_xy(2,7);
Lcd_Wdat(DISPLAY[0]);
Lcd_Wdat(DISPLAY[1]);
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
/*
* LCD1602显示器并行驱动子函数
* 显示器接口:电源端口VCC(2脚) GND(1脚)接5V电源。
数据端口D0-D7(7脚到14脚)接P0口(P0^0 - P0^7)。
对比度调节端口VL(3脚)为液晶显示器对比度调整端用电位器分压得到0V-5V中间某一电压使液晶清晰显示。
控制端口RS(4脚)为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
控制端口RW(5脚)为读写信号线,高电平(1)时进行读操作
控制端口EN(6脚)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。
*/
单片机源程序如下(主程序):
#include"HEADER.h"
#include"LCD1602.h"
#include"BUTTON.h"
volatile unsigned char DISPLAY[4];//全局显示数组
/*****************************初始化函数*****************************/
void Init()//初始化函数
{
TMOD = 0X01;//定时器0设置工作方式1
TH0 =55536/256;//定时器初值
TL0 =55536%256;//定时器初值
EA = 1;//打开总中断
ET0 = 1;//定时器0打开
TR0 = 1;//定时器0运行
// WDT_CONTR = 0X31;//看门狗定时器在12M晶振时131ms复位
}
/****************************主函数******************************/
void main(void)
{
unsigned char m = 0;
Init();
Lcd_Init ();
Lcd_Clear();
Delayms(20);
Lcd_Set_xy(1,3);
Lcd_String("Aether Test");
Lcd_Set_xy(2,1);
Lcd_String("Value:00 K");
//数字电位器初始化
INC = 1;
CS = 0;
U_D = 0;
_nop_();
for(m=100;m>0;m--)//电位器强制向下滑动100级到最底端
{
INC = 0;
_nop_();
_nop_();
INC = 1;
}
CS = 1;
while(1)
{
if(FLAG_BUTTON == 1)//按键检测
{
FLAG_BUTTON = 0;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
数字电位器测试程序.rar
(41.8 KB, 下载次数: 521)
2017-12-17 10:49 上传
点击文件名下载附件
下载积分: 黑币 -5
高精度的数字电位器X9C103.pdf
(176.6 KB, 下载次数: 260)
2017-12-17 10:49 上传
点击文件名下载附件
下载积分: 黑币 -5
数字电位器使用说明.pdf
(52.92 KB, 下载次数: 279)
2017-12-17 10:49 上传
点击文件名下载附件
下载积分: 黑币 -5
数字电位器原理图.pdf
(100.01 KB, 下载次数: 309)
2017-12-17 10:49 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
fangrongchuang
时间:
2017-12-25 21:04
学习一下……。
作者:
tang131
时间:
2018-2-21 22:14
很喜欢这个,但是又不太懂单片机!
作者:
tang131
时间:
2018-2-21 22:17
89C52可以控制6个数字电位器吗?程序又要怎么改呢
作者:
yulin3192
时间:
2018-3-24 11:25
楼主大才
作者:
oniy
时间:
2018-4-20 16:43
很好用
作者:
romnel2
时间:
2018-4-21 16:39
学习了!!谢谢楼主
作者:
romnel2
时间:
2018-4-21 16:40
学习了!!谢谢楼主
作者:
谢大妈哈哈哈
时间:
2018-4-23 10:16
天才楼主
作者:
418397058
时间:
2018-4-23 21:55
学习一下!
作者:
ren_919
时间:
2018-7-7 09:45
lz辛苦!
作者:
单片小白123
时间:
2018-7-11 16:48
学习一下
作者:
gogogoin
时间:
2018-7-26 09:27
学习学习
作者:
cqtrw
时间:
2018-9-27 14:52
很好!
作者:
qq444244
时间:
2019-3-29 11:45
好东西!!!!!
作者:
hanzhuang
时间:
2019-4-11 16:40
很厉害
作者:
dh981226
时间:
2019-7-17 09:24
VH和VL用接吗
作者:
em78447
时间:
2019-9-12 13:49
好的,谢谢。
作者:
lyl_420819
时间:
2019-11-1 15:26
好资料,学习了,谢谢分享。
作者:
fangzumin
时间:
2019-11-14 16:34
好资料,学习一下,感谢楼主分享
作者:
jms208
时间:
2019-12-16 12:49
学习一下。
作者:
Hcy0906
时间:
2020-4-8 14:23
好资料,学习一下,感谢楼主分享
作者:
1725489730
时间:
2020-5-14 16:51
分享的资料很有用!
作者:
zxopenljx
时间:
2020-5-27 14:35
感谢楼主分享
作者:
byhejun
时间:
2020-6-23 09:27
很好的学习资料,谢谢分享!!!
作者:
b9589
时间:
2021-2-8 11:42
挺实用的数字电位器资料
作者:
langshan
时间:
2021-2-9 20:46
这个芯片不贵 我在身高体检机语音播报部分用过
作者:
QDMLIT
时间:
2021-3-29 11:41
有个问题,程序和电路图不相符
作者:
lxa0
时间:
2021-7-8 14:35
我做的是51遥控pga2311的电子音量,lcd显示。
作者:
paul8899
时间:
2024-6-8 21:27
很好的程序及原理图
作者:
huaishang
时间:
2024-6-14 10:40
学习了!!谢谢楼主
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1