找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 27370|回复: 28
打印 上一主题 下一主题
收起左侧

数字电位器X9C103 100级调节电路和单片机源程序

  [复制链接]
跳转到指定楼层
楼主
        数字电位器在90年代就有了,当时大学DIY HI-END顶级音响流行想用它来做音量电位器,但是价格非常昂贵.现已出来很多年价格尚可接受,但也和STM32差不多价!它在某些场合可以高可靠性地代替普通模拟电位器,如美国美信公司生产的10K欧姆的X9C103,它有100级调节,每档100欧姆.可做为音量调节电路,仪器模拟量调节及数控电源DIY什么的,其实前不久我买几块回来就是想DIY数控电源(在大虾眼中就是"假数控吧"),下面贡献买来的所有资料和原程序.       由于水平有限,专业软件的我不懂,我也没有时间测试X9C103行不行,我现在就是善良地为老师大神大虾们无条件地分享资料(美信公司20年前的东西,应该没有版权问题)谢谢!

原理图:


使用说明
一、基础部分
数字电位器 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部分):
  1. /*
  2. * 按键子函数子函数
  3. * 按键子函数共涉及两个按键检测和控制,分别对应P3^2和P3^3.两个按键每次按下分别实现10K数字
  4. * 电位器中间滑动端往上端和往下端滑动1k数值。

  5. * 数字电位器接口说明:INC接P2^0,U_D接P2^1,CS接P2^2。
  6. */

  7. #include"HEADER.h"
  8. #include"LCD1602.h"
  9. #include"BUTTON.h"

  10. volatile unsigned char FLAG_BUTTON = 0;//按键检测标志位
  11. volatile unsigned char BUTTON_DAT = 0;//按键键值变量
  12. volatile unsigned int TIME_10MS = 0;//时间变量
  13. volatile unsigned char VOLUME = 0;//电位器值
  14. void T0_Timer() interrupt 1//定时器0中断服务程序
  15. {
  16.         

  17.         TR0 = 0;
  18. //        WDT_CONTR = 0X31;                  //喂狗
  19.         TH0 =55536/256;                          //重装初值
  20.         TL0 =55536%256;                      //重装初值
  21.         TR0 = 1;                        

  22.         TIME_10MS ++;                                  //time_10ms变量累加
  23.         if(TIME_10MS == 1000)TIME_10MS = 0;//time_10ms变量清零

  24.         ButtonTest();//按键检测;
  25. }
  26. void ButtonTest(void)
  27. {
  28.         static uchar Count_ButtonDown;//静态按键按下计数
  29.         static uchar Count_ButtonUp;//静态按键松开计数
  30.         if((SW_1 == 0)||(SW_2 == 0))
  31.         {
  32.                 Count_ButtonDown++;
  33.                 Count_ButtonUp = 0;
  34.                         if(Count_ButtonDown==2)
  35.                         {
  36.                                 if(SW_1 == 0)BUTTON_DAT = 1;
  37.                                 else if(SW_2 == 0)BUTTON_DAT = 2;
  38.                                 if(BUTTON_DAT != 0)FLAG_BUTTON = 1;
  39.                         }
  40.                         if(Count_ButtonDown>=50)
  41.                         {
  42.                                 Count_ButtonDown = 0;
  43.                                 if(SW_1 == 0)BUTTON_DAT = 1;
  44.                                 else if(SW_2 == 0)BUTTON_DAT = 2;
  45.                                 if(BUTTON_DAT != 0)FLAG_BUTTON = 1;
  46.                         }
  47.         }
  48.         else
  49.         {
  50.                 if(Count_ButtonDown>2) //如果按键已经确认按下,则开始判断松开
  51.                 {
  52.                         Count_ButtonUp++;      
  53.                         if(Count_ButtonUp>=2)     
  54.                         {        
  55.                                 Count_ButtonUp = 0;
  56.                                 Count_ButtonDown = 0;        
  57.                         }
  58.                 }
  59.         }
  60. }
  61. void ButtonService(unsigned char dat)
  62. {
  63.         switch(dat)
  64.         {
  65.                 case 1:        //电位器值增加
  66.                 {
  67.                                 unsigned char n = 0;
  68.                                 CS = 0;
  69.                                 U_D = 1;
  70.                                 _nop_();
  71.                                 for(n=10;n>0;n--)
  72.                                 {
  73.                                         INC = 0;
  74.                                         _nop_();
  75.                                         _nop_();
  76.                                         INC = 1;
  77.                                 }
  78.                                 CS = 1;
  79.                                 
  80.                                 VOLUME++;
  81.                                 if(VOLUME > 10)VOLUME = 10;
  82.                                 DISPLAY[0] = VOLUME%100/10+0x30;
  83.                                 DISPLAY[1] = VOLUME%10+0x30;
  84.                                 Lcd_Set_xy(2,7);
  85.                                 Lcd_Wdat(DISPLAY[0]);
  86.                                 Lcd_Wdat(DISPLAY[1]);
  87.                 }
  88.                 break;
  89.                 case 2:        //电位器值减小
  90.                 {

  91.                                 unsigned char n = 0;
  92.                                 CS = 0;
  93.                                 U_D = 0;
  94.                                 _nop_();
  95.                                 for(n=10;n>0;n--)
  96.                                 {
  97.                                         INC = 0;
  98.                                         _nop_();
  99.                                         _nop_();
  100.                                         INC = 1;
  101.                                 }
  102.                                 CS = 1;
  103.                                 if(VOLUME == 0)VOLUME = 1;
  104.                                 VOLUME--;
  105.                                 DISPLAY[0] = VOLUME%100/10+0x30;
  106.                                 DISPLAY[1] = VOLUME%10+0x30;
  107.                                 Lcd_Set_xy(2,7);
  108.                                 Lcd_Wdat(DISPLAY[0]);
  109.                                 Lcd_Wdat(DISPLAY[1]);
  110. ……………………

  111. …………限于本文篇幅 余下代码请从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)时读取信息,负跳变时执行指令。
*/


单片机源程序如下(主程序):
  1. #include"HEADER.h"
  2. #include"LCD1602.h"
  3. #include"BUTTON.h"

  4. volatile unsigned char DISPLAY[4];//全局显示数组
  5. /*****************************初始化函数*****************************/
  6. void Init()//初始化函数
  7. {
  8.         TMOD = 0X01;//定时器0设置工作方式1
  9.         TH0 =55536/256;//定时器初值
  10.         TL0 =55536%256;//定时器初值
  11.         
  12.         EA = 1;//打开总中断
  13.         ET0 = 1;//定时器0打开
  14.         TR0 = 1;//定时器0运行
  15. //        WDT_CONTR = 0X31;//看门狗定时器在12M晶振时131ms复位        
  16. }
  17. /****************************主函数******************************/
  18. void main(void)
  19. {        
  20.         unsigned char m = 0;
  21.         Init();
  22.         Lcd_Init ();
  23.         Lcd_Clear();
  24.         
  25.         Delayms(20);
  26.         Lcd_Set_xy(1,3);
  27.         Lcd_String("Aether  Test");
  28.         Lcd_Set_xy(2,1);
  29.         Lcd_String("Value:00 K");
  30.         
  31.         //数字电位器初始化
  32.         INC = 1;
  33.         CS = 0;
  34.         U_D = 0;
  35.         _nop_();
  36.         for(m=100;m>0;m--)//电位器强制向下滑动100级到最底端
  37.         {
  38.                 INC = 0;
  39.                 _nop_();
  40.                 _nop_();
  41.                 INC = 1;
  42.         }
  43.         CS = 1;

  44.         while(1)
  45.         {        
  46.                 if(FLAG_BUTTON == 1)//按键检测
  47.                 {
  48.                         FLAG_BUTTON = 0;
  49. ……………………

  50. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
数字电位器测试程序.rar (41.8 KB, 下载次数: 465)
高精度的数字电位器X9C103.pdf (176.6 KB, 下载次数: 232)
数字电位器使用说明.pdf (52.92 KB, 下载次数: 252)
数字电位器原理图.pdf (100.01 KB, 下载次数: 277)

评分

参与人数 2黑币 +110 收起 理由
zkele + 10 很给力!
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏20 分享淘帖 顶3 踩
回复

使用道具 举报

沙发
ID:266765 发表于 2017-12-25 21:04 | 只看该作者
学习一下……。
回复

使用道具 举报

板凳
ID:284674 发表于 2018-2-21 22:14 | 只看该作者
很喜欢这个,但是又不太懂单片机!
回复

使用道具 举报

地板
ID:284674 发表于 2018-2-21 22:17 | 只看该作者
89C52可以控制6个数字电位器吗?程序又要怎么改呢

回复

使用道具 举报

5#
ID:234782 发表于 2018-3-24 11:25 | 只看该作者
楼主大才
回复

使用道具 举报

6#
ID:312448 发表于 2018-4-20 16:43 | 只看该作者
很好用
回复

使用道具 举报

7#
ID:307393 发表于 2018-4-21 16:39 | 只看该作者
学习了!!谢谢楼主
回复

使用道具 举报

8#
ID:307393 发表于 2018-4-21 16:40 | 只看该作者
学习了!!谢谢楼主
回复

使用道具 举报

9#
ID:309564 发表于 2018-4-23 10:16 | 只看该作者
天才楼主
回复

使用道具 举报

10#
ID:314892 发表于 2018-4-23 21:55 | 只看该作者
学习一下!
回复

使用道具 举报

11#
ID:366650 发表于 2018-7-7 09:45 | 只看该作者
lz辛苦!
回复

使用道具 举报

12#
ID:369597 发表于 2018-7-11 16:48 | 只看该作者

学习一下
回复

使用道具 举报

13#
ID:379259 发表于 2018-7-26 09:27 | 只看该作者
学习学习
回复

使用道具 举报

14#
ID:32650 发表于 2018-9-27 14:52 | 只看该作者
很好!
回复

使用道具 举报

15#
ID:496376 发表于 2019-3-29 11:45 | 只看该作者
好东西!!!!!
回复

使用道具 举报

16#
ID:332684 发表于 2019-4-11 16:40 | 只看该作者
很厉害
回复

使用道具 举报

17#
ID:493535 发表于 2019-7-17 09:24 | 只看该作者
VH和VL用接吗
回复

使用道具 举报

18#
ID:72951 发表于 2019-9-12 13:49 | 只看该作者
好的,谢谢。
回复

使用道具 举报

19#
ID:64765 发表于 2019-11-1 15:26 | 只看该作者
好资料,学习了,谢谢分享。
回复

使用道具 举报

20#
ID:594334 发表于 2019-11-14 16:34 | 只看该作者
好资料,学习一下,感谢楼主分享
回复

使用道具 举报

21#
ID:71549 发表于 2019-12-16 12:49 | 只看该作者
学习一下。
回复

使用道具 举报

22#
ID:610541 发表于 2020-4-8 14:23 | 只看该作者

好资料,学习一下,感谢楼主分享
回复

使用道具 举报

23#
ID:680779 发表于 2020-5-14 16:51 | 只看该作者
分享的资料很有用!
回复

使用道具 举报

24#
ID:704585 发表于 2020-5-27 14:35 | 只看该作者
感谢楼主分享
回复

使用道具 举报

25#
ID:473918 发表于 2020-6-23 09:27 | 只看该作者
很好的学习资料,谢谢分享!!!
回复

使用道具 举报

26#
ID:815563 发表于 2021-2-8 11:42 | 只看该作者
挺实用的数字电位器资料
回复

使用道具 举报

27#
ID:128334 发表于 2021-2-9 20:46 | 只看该作者
这个芯片不贵 我在身高体检机语音播报部分用过
回复

使用道具 举报

28#
ID:384552 发表于 2021-3-29 11:41 | 只看该作者
有个问题,程序和电路图不相符
回复

使用道具 举报

29#
ID:74784 发表于 2021-7-8 14:35 | 只看该作者
我做的是51遥控pga2311的电子音量,lcd显示。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表