矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 36376|回复: 89

6位半表头制作完成

  [复制链接]
     
发表于 2011-7-13 18:01:06 | 显示全部楼层 |阅读模式
本帖最后由 xjw01 于 2011-7-14 09:00 编辑

花了一整天时间,把这个表头制作完成,推荐给大家。
由于手上器件限制,所以有的元件使用不太合理,有条件的,多加改进。
当时做7135时的单片机电路,只安装了6个数码管,所以有1位显示不下,需使用开关切换才能显示出来。本想再加一位数码管,后来觉得麻烦,再者,位数多了,读数时眼花,所以放弃增加数码管。
电路图.PNG

评分

4

查看全部评分

     
 楼主| 发表于 2011-7-13 18:02:55 | 显示全部楼层
本帖最后由 xjw01 于 2011-7-13 18:13 编辑
  1. /*************************************
  2. 6位半LTC2400驱动程序
  3. xjw01 于莆田 2011.7
  4. **************************************/
  5. //====================================
  6. #define uchar unsigned char
  7. #define uint  unsigned int
  8. #define ulong  unsigned long
  9. #include <reg52.h>
  10. #include <math.h>

  11. void delay(uint loop) { uint i; for(i=0;i<loop;i++); } //延时函数
  12. //void delay2(uint k){ for(;k>0;k--) delay(10000); } //长延时,k=100大约对应1秒



  13. /**********
  14. 字形编码图
  15.    32
  16.    -
  17. 64| | 128
  18.    -  16
  19. 1| | 8
  20.    _. 4
  21.    2
  22. **********/
  23. uchar code zk[20]={235,136,179,186,216,122,123,168,251,250}; //字库

  24. uchar disp[6]={168,251,250,186,179,136};
  25. sfr P1M1=0x91; //P1端口设置寄存器
  26. sfr P1M0=0x92; //P1端口设置寄存器
  27. sfr P0M1=0x93; //P0端口设置寄存器
  28. sfr P0M0=0x94; //P0端口设置寄存器
  29. sfr P2M1=0x95; //P2端口设置寄存器
  30. sfr P2M0=0x96; //P2端口设置寄存器
  31. sfr P3M1=0xB1; //P3端口设置寄存器
  32. sfr P3M0=0xB2; //P3端口设置寄存器

  33. sbit ds0=P2^2; //数码管扫描口
  34. sbit ds1=P2^3; //数码管扫描口
  35. sbit ds2=P2^4; //数码管扫描口
  36. sbit ds3=P2^5; //数码管扫描口
  37. sbit ds4=P2^6; //数码管扫描口
  38. sbit ds5=P2^7; //数码管扫描口





  39. //功能程序开始


  40. void cls(){ char i; for(i=0;i<6;i++) disp[i]=0; } //清屏
  41. void showDig(long f){ //显示数字
  42. uchar i;
  43. cls();
  44. for(i=0;i<6;i++) { disp[i]=zk[f%10], f/=10; if(!f) break; }
  45. }


  46. sbit P_SCK=P1^0; //时钟
  47. sbit P_SDO=P1^1; //数据
  48. sbit P_CS =P1^2; //片选
  49. sbit P_s6 =P3^5; //6位显示
  50. #define en 5     //平均次数
  51. ulong pv=0;  //AD转换均值
  52. void get_adc(){
  53. char i,plo=0; //符号位
  54. ulong v=0;    //AD转换结果
  55. if(P_SDO) return;
  56. v = 0, plo = 0;
  57. for(i=0;i<32;i++){
  58.    P_SCK = 1; delay(1);
  59.    v = (v<<1);
  60.    if(P_SDO) { if(i==2)  plo=1; else v++; }
  61.    P_SCK = 0; delay(1);
  62. }
  63. if(!plo) v = 0x20000000 - v;
  64. v = 5000000.0*v/0x10000000;

  65. if(abs(v-pv/en)>50) pv = v*en;
  66. else                pv = v + pv - pv/en;
  67. v = pv/en;
  68. if(P_s6) showDig(v/10);
  69. else     showDig(v);
  70. if(!plo) disp[5] += 16;
  71. }



  72. void zd0(void) interrupt 0 {//int0中断(下降沿)
  73. }



  74. void timerInter(void) interrupt 1 {//T0中断
  75. }



  76. main(){
  77. uchar dispN=0; //显示扫描索引

  78. TCON=0, TMOD=0x09; //将T0置为16位内部计数,并由外部启动计数。
  79. IT0=1; //使int0下降沿中断有效。
  80. TH0=0, TL0=0;
  81. TR0=1;  //T0启动计数
  82. EX0=1;  //开int0外部中断
  83. ET0=1;  //T0开中断
  84. EA=1;   //开总中断
  85. PT0=1;  //中断优先


  86. P2M0 = 0xFC;    //P2.234567置为推勉输出
  87. //P1M0 = 0x05;    //P1.02置为推勉输出
  88. //P1M1 = 0x02;  //P1.1置为高阻抗
  89. //P3M0 = 0x0C;    //P3.23置为推勉输出口

  90. delay(4000);
  91. P_CS=1; delay(1);
  92. P_SCK=0;delay(1);
  93. P_CS=0;


  94. while(1){
  95.   //显示disp
  96.   get_adc();
  97.   dispN=(++dispN)%6; //扫描器移动
  98.   ds0=ds1=ds2=ds3=ds4=ds5=0;
  99.   if(dispN==0) ds0=1;
  100.   if(dispN==1) ds1=1;
  101.   if(dispN==2) ds2=1;
  102.   if(dispN==3) ds3=1;
  103.   if(dispN==4) ds4=1;
  104.   if(dispN==5) ds5=1;
  105.   P0=~disp[dispN]; //显示
  106.   delay(4000);
  107. }//while end
  108. }

复制代码

评分

2

查看全部评分

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2011-7-13 18:10:05 | 显示全部楼层
回复 支持 反对

使用道具 举报

     
发表于 2011-7-13 18:27:59 | 显示全部楼层
不错!祝贺一下!
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2011-7-13 19:41:32 | 显示全部楼层
电源还有点问题。9V变压器输出电压不够,吃饭时,用电量大,电压输出不足,纹波大,电路工作不正常。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2011-7-13 22:17:41 | 显示全部楼层
该表头在5V基准时,我实测的非线性误差40字左右。约8ppm,数据手册是3ppm
回复 支持 反对

使用道具 举报

     
发表于 2011-7-13 22:54:47 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
发表于 2011-7-13 23:06:17 | 显示全部楼层
该表头在5V基准时,我实测的非线性误差40字左右。约8ppm,数据手册是3ppm
xjw01 发表于 2011-7-13 22:17



   
所以说你是如何测试的,我对此存疑。
kt_503.jpg
回复 支持 反对

使用道具 举报

     
发表于 2011-7-13 23:27:01 | 显示全部楼层
可以把他移置到普通万用表上代替原来的显示吗?
bigradio 发表于 2011-7-13 22:54



   
问题:
1、LTC2400 不是差分输入,一般万用表是差分输入的(可以用差分 ADC 的 LTC2440 解决)
2、如果普通万用表的模拟输入电路不好,噪声太大,那么替换上之后后面几位数就不停乱跳而已
回复 支持 反对

使用道具 举报

     
发表于 2011-7-14 00:09:28 | 显示全部楼层
等待成品。。。。。。。。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2011-7-14 05:45:09 | 显示全部楼层
本帖最后由 xjw01 于 2011-7-14 06:09 编辑
所以说你是如何测试的,我对此存疑。
washu 发表于 2011-7-13 23:06



    手上没有精密的DA转换器,所以这些参数不易测量。
   有一种简单的方法:
   DIY一个精密的电压源。然后用精密电阻分压。用电压累加法测定线性度。绘制输入与输出之间的曲线关系。把头尾两点连成直线,这外就可外推中点电压,然后实测中点电压与外推中点电压的差值,这便是中点的非线性误差。
   坛上许多是用高位来比对,这种方法,可靠性较差。因为,要在6位半这个级别上校对,对高位表要求很高。我查看了一些二手高位的参数,本身都有好几个字的误差,甚至几百字。
   这个芯片,对电容敏感,昨天在5位半时,用了一些大电容,非线性误差只有1字(用3V测定),现在简化为小容量电容,非线性误差大了两三倍。
   我常使用电池来测定线性度,不过,电池的电压稳定性还不够,得在很短的时间内完成测试。手上没有精密电池,也只得将就。

   我实测定,用3V信号测定1.5V处一非线性误差
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2011-7-14 06:03:03 | 显示全部楼层
本帖最后由 xjw01 于 2011-7-14 06:04 编辑

另外,ICL2400测量结果的有效比特数约为20字左右,并没有达到24bit,我只是做了一些滤波处理,才免强可读24bit。做成5位半表头更合适。要得一更好的滤波效果,最好采集到电脑后,再使用软件滤波,做数据分析更容易。
数据手册中的那些指标,很免强,做个参考吧,实际应用,得降级处理。
回复 支持 反对

使用道具 举报

发表于 2011-7-14 07:43:46 | 显示全部楼层
太好了,元件好找吗,有意仿制。
回复 支持 反对

使用道具 举报

     
发表于 2011-7-14 08:56:21 | 显示全部楼层
手上没有精密的DA转换器,所以这些参数不易测量。
   有一种简单的方法:
   DIY一个精密的电压 ...
xjw01 发表于 2011-7-14 05:45

试试看我的简易基准分压源,输出不确定度+3.3ppm/C和-5ppm/C。
也许对你有用,你可以改成适合你的形式。现在我正在做一个配合它的高压扩展插件。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2011-7-14 09:02:56 | 显示全部楼层
电源电路已作了改进,原来使用9V/800mA变压器(实测11V),当电源电压低220V时,电路出现严重纹波。
后更换为12V(空载实测13.5V),电路不稳,会自激,于是又在电路中加了几个滤波电容,消除自激。
电路图已更新。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-28 23:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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