矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 9513|回复: 14

7135实现5位半分辨率

  [复制链接]
     
发表于 2011-6-30 09:28:30 | 显示全部楼层 |阅读模式
/*************************************
5位半ICL7135驱动程序
使用32MHz晶振,单片机STC12C5AS60
P1.0接7135的时钟脚
P1.1接7135的正负半断脚
p1.2接7135的溢出识别脚
P3.2接7135的BUSY脚
读数未减去零点值。约12字。
xjw01 于莆田 2011.6
**************************************/
//====================================
#define uchar unsigned char
#define uint  unsigned int
#define ulong  unsigned long
#include <reg52.h>
#include <math.h>

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



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

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

sbit ds0=P2^2; //数码管扫描口
sbit ds1=P2^3; //数码管扫描口
sbit ds2=P2^4; //数码管扫描口
sbit ds3=P2^5; //数码管扫描口
sbit ds4=P2^6; //数码管扫描口
sbit ds5=P2^7; //数码管扫描口
sbit plo=P1^1; //正负输入口
sbit ORg=P1^2; //溢出识别口





//功能程序开始


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


#define fso 32000000 // 时钟频率
#define bp 10  //倍频数
#define bk 320 //计数速度比(时钟速度比),需是2*bp的倍数
#define en 3   //电压加权平均个数
uchar tr0 = 256 - bk/2;      //常速时钟的定时器初值
uchar tr1 = 256 - bk/(2*bp); //倍速时钟的定时器初值

sfr WAKE_CLKO = 0x8F;
sfr AUXR      = 0x8E; //定时器1T模式设置相关的寄存器
sfr BRT       = 0x9C;

long na=0,n0=1e9,pv=0;
void zd0(void) interrupt 0 {//int0中断(下降沿)
const long M0 = 10000L*bk; //7135反向积分开始点对应的单片机计数值
long v;       //电压
uint x = 220; //倍频延迟(采用测量值减去2)
BRT = tr0;    //降低频率
na += TH0*256+TL0;         //积分计数数器的累计值

if(x){ //电压测量
  //显示测量电压
  v = 100000.0*(na-M0)/M0; //V值计算
  if(abs(v-pv/en)>5) pv = v*en;
  else               pv = v + pv - pv/en;
  v = pv/en;
  if(v<0 ) v  = 0;
  if(v>10) v -= 10; //零点非线处理
  showDig(v);
  if(!plo) disp[5]+=16; //显示正负号
  //预置下一次积分的倍频时间点
  n0 = na - 5*bk;     //设置在过零之前5字
  if(n0<M0) n0 = M0;  //确保倍频点设置在反积分期间
  n0 -= x;            //延迟量补偿,确保零点处也能正常倍频
  //溢出处理
  if(ORg){
   cls();  disp[5]=zk[1]; //显示溢出标识
   n0 = 3*M0;
  }
}else{ //延迟量测量
  showDig(na-n0 - (30002L*bk-na)/(bp-1));
  n0 = M0;
}

//计数器初值设定
v = 65536 - n0%65536;
na=0, TH0 = v/256, TL0 = v%256;
}



void timerInter(void) interrupt 1 {//T0中断
  if(na) na += 65536;
  else   na += n0%65536;
  if(na==n0) BRT = tr1; //升高频率
}



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

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

//时钟输出
AUXR |= 0x80; //T0置为1T模式
AUXR |= 0x04; //独立波特率发生器工作在1T模式
BRT = tr0;
WAKE_CLKO |= 0x07;
AUXR |= 0x10; //启动波特率发生器开始计数

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


while(1){
  //显示disp
  dispN=(++dispN)%6; //扫描器移动
  ds0=ds1=ds2=ds3=ds4=ds5=0;
  if(dispN==0) ds0=1;
  if(dispN==1) ds1=1;
  if(dispN==2) ds2=1;
  if(dispN==3) ds3=1;
  if(dispN==4) ds4=1;
  if(dispN==5) ds5=1;
  P0=~disp[dispN]; //显示
  delay(4000);
}//while end
}

评分

5

查看全部评分

     
 楼主| 发表于 2011-6-30 09:29:36 | 显示全部楼层
精度只能达到4位半,读值分辨力达到5位半,不确定2字左右。
回复 支持 反对

使用道具 举报

     
发表于 2011-6-30 09:36:31 | 显示全部楼层
高手,支持一下
回复 支持 反对

使用道具 举报

     
发表于 2011-6-30 10:51:54 | 显示全部楼层
这就可以了,能够解决大部分在四位半情况下的读数中间值的取值问题。
回复 支持 反对

使用道具 举报

     
发表于 2011-6-30 13:42:28 | 显示全部楼层
恭喜楼主.
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2011-6-30 16:39:25 | 显示全部楼层
昨天想了一天,又设计了一种温漂被偿算法,初试了一下,效果不错,用手对芯片加热,放手后,读值立刻回到原值,估计真五位半线性度的表头成功了。
回复 支持 反对

使用道具 举报

发表于 2011-6-30 19:03:57 | 显示全部楼层
希望能看到照片。
回复 支持 反对

使用道具 举报

     
发表于 2011-7-1 08:52:46 | 显示全部楼层
楼主好好研究这个课题,祝你获得圆满成功。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2011-7-1 09:25:57 | 显示全部楼层
希望能看到照片。
dsqzp 发表于 2011-6-30 19:03



    坛上有句话:有图有真相。

   其实,图与真相之间没有必然关系的。上图很麻烦,所以我只是偶尔上图。
   关系到制作工艺问题的,我一般会上图的。
   如果7135扩展成5位半成功了,我会上图的。特别是电路图。现在只能说成功了一半。漂移问题还没有解决。
回复 支持 反对

使用道具 举报

     
发表于 2011-7-1 13:24:41 | 显示全部楼层
如果精度没有提高,分辨率提高到5位、六位、七位都没有意义,后面的数字是没有可信度的。
回复 支持 反对

使用道具 举报

     
发表于 2011-7-1 13:32:29 | 显示全部楼层
双积分AD的精度和时钟精度、比较器的精度、比较器的速度、测试速度、积分电容的质量都有很大关系。如果上述都是很理想的话,理论上双积分的原理其本身是线性的。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2011-7-1 14:19:39 | 显示全部楼层
回复 11# Lee_88


    现在看来,最后一位会“漂”,很恼火。
回复 支持 反对

使用道具 举报

     
发表于 2011-7-1 14:28:36 | 显示全部楼层
基准不解决,不漂是不可能的。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2011-7-1 14:56:00 | 显示全部楼层
我先解决一下负电源问题。
用单片机的IO口输出方波,检波后得到负电源,这种电源不纯净。在积分电容上,会看到杂波。
我找到了一片7905,这样问题可以解决了。
回复 支持 反对

使用道具 举报

     
发表于 2011-7-1 23:12:36 | 显示全部楼层
有空做个!!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

蒙公网安备 15040402000005号

GMT+8, 2025-4-28 17:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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