设计中采用利用振荡频率来完成对电阻电容的测量。需要注意的是,对电阻电容的测量需要自己通过按键功能来选择。电容测量的范围0-10000pf,电阻这边是小于1兆欧的可以测量。下面是程序。
电阻电容测量仪仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include"reg52.h"
- #include"stdio.h"
- #include"math.h"
- #include"absacc.h"
- #include"intrins.h"
- typedef unsigned char uchar;
- typedef unsigned int uint;
- unsigned char inte=0;
- float uu=0;
- unsigned long int ff=0;
- unsigned long int DL,DH;
- sbit sc=P1^6;
- sbit sr=P1^7;
- sbit fw=P3^5;
- sbit srg=P1^2;
- sbit srd=P1^3;
- sbit scg=P1^4;
- sbit scd=P1^5;
- sbit fr=P1^0;
- sbit fc=P1^1;
- sbit LED=P3^7;
- sbit rs=P2^2;
- sbit rw=P2^1;
- sbit en=P2^0;
- sbit CS = P3^4;
- sbit Clk = P3^3;
- sbit DATI = P3^2;
- sbit DATO = P3^2;
- /*******************************定义全局变量********************************/
- unsigned char dat = 0x00; //AD值
- unsigned char CH;
- unsigned char code table[]={"0123456789"};
- #define count_M1 50000
- #define H_0 (65536-count_M1)/256
- #define L_0 (65536-count_M1)%256
- char times=0;
- bit status_F=1;
- char scan=1;
- unsigned int freq=0;
- sfr16 DPTR=0x82;
- void delay1ms(int);
- void display(uint x);
- void display1(uint dat);
- //入口参数:CH 出口参数:dat
- unsigned char adc0832(unsigned char CH)
- {
- unsigned char i,test,adval;
- adval = 0x00;
- test = 0x00;
- Clk = 0; //初始化
- DATI = 1;
- _nop_();
- CS = 0;
- _nop_();
- Clk = 1;
- _nop_();
- if ( CH == 0x00 ) //通道选择
- {
- Clk = 0;
- DATI = 1; //通道0的第一位
- _nop_();
- Clk = 1;
- _nop_();
- Clk = 0;
- DATI = 0; //通道0的第二位
- _nop_();
- Clk = 1;
- _nop_();
- }
- else
- {
- Clk = 0;
- DATI = 1; //通道1的第一位
- _nop_();
- Clk = 1;
- _nop_();
- Clk = 0;
- DATI = 1; //通道1的第二位
- _nop_();
- Clk = 1;
- _nop_();
- }
- Clk = 0;
- DATI = 1;
- for( i = 0;i < 8;i++ ) //读取前8位的值
- {
- _nop_();
- adval <<= 1;
- Clk = 1;
- _nop_();
- Clk = 0;
- if (DATO)
- adval |= 0x01;
- else
- adval |= 0x00;
- }
- for (i = 0; i < 8; i++) //读取后8位的值
- {
- test >>= 1;
- if (DATO)
- test |= 0x80;
- else
- test |= 0x00;
- _nop_();
- Clk = 1;
- _nop_();
- Clk = 0;
- }
- if (adval == test) //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
- dat = test;
- _nop_();
- CS = 1; //释放ADC0832
- DATO = 1;
- Clk = 1;
- return dat;
- }
- void delay(uint n)
- {
- uint x,y;
- for(x=n;x>0;x--)
- for(y=110;y>0;y--);
- }
- void lcd_wcom(uchar com)
- {
- rs=0;
- rw=0;
- P0=com;
- delay(5);
- en=1;
- en=0;
- }
- void lcd_wdat(uchar dat)
- {
- rs=1;
- rw=0;
- P0=dat;
- delay(5);
- en=1;
- en=0;
- }
- void lcd_init(void)
- {
- lcd_wcom(0x38);
- lcd_wcom(0x0c);
- lcd_wcom(0x06);
- lcd_wcom(0x01);
- }
-
- void lcd_xianshi1(void)
- {
- lcd_wcom(0x80+0x40);
- lcd_wdat('D');
- lcd_wdat('i');
- lcd_wdat('a');
- lcd_wdat('n');
- lcd_wdat('Z');
- lcd_wdat('u');
- lcd_wdat(':');
- lcd_wcom(0x80+0x4e);
- lcd_wdat(' ');
- lcd_wdat('K');
- }
- void lcd_xianshi2()
- {
- lcd_wcom(0x80+0x40);
- lcd_wdat('D');
- lcd_wdat('i');
- lcd_wdat('a');
- lcd_wdat('n');
- lcd_wdat('R');
- lcd_wdat('o');
- lcd_wdat('n');
- lcd_wdat('g');
- lcd_wdat(':');
- lcd_wcom(0x80+0x4e);
- lcd_wdat('p');
- lcd_wdat('F');
- }
- void xuanze()
- {
- lcd_wcom(0x80+0x00); //Please choose
-
- lcd_wdat(' ');
- lcd_wdat('P');
- lcd_wdat('l');
- lcd_wdat('e');
- lcd_wdat('a');
- lcd_wdat('s');
- lcd_wdat('e');
- lcd_wdat(' ');
- lcd_wdat('c');
- lcd_wdat('h');
- lcd_wdat('o');
- lcd_wdat('o');
- lcd_wdat('s');
- lcd_wdat('e');
- lcd_wdat(':');
- lcd_wcom(0x80+0x40); //Cap or Res
-
- lcd_wdat(' ');
- lcd_wdat(' ');
- lcd_wdat(' ');
- lcd_wdat('C');
- lcd_wdat('a');
- lcd_wdat('p');
- lcd_wdat(' ');
- lcd_wdat('o');
- lcd_wdat('r');
- lcd_wdat(' ');
- lcd_wdat('R');
- lcd_wdat('e');
- lcd_wdat('s');
- }
- void huanying()
- {
- lcd_wcom(0x80+0x00); //Welcome to use
- lcd_wdat(' ');
- lcd_wdat('W');
- lcd_wdat('e');
- lcd_wdat('l');
- lcd_wdat('c');
- lcd_wdat('o');
- lcd_wdat('m');
- lcd_wdat('e');
- lcd_wdat(' ');
- lcd_wdat('t');
- lcd_wdat('o');
- lcd_wdat(' ');
- lcd_wdat('u');
- lcd_wdat('s');
- lcd_wdat('e');
- }
- void measure(void)
- {
- IE=0x8a;
- EA=1;
- ET1=1;
- ET0=1;
- TMOD=0x51;
- TH0=H_0;
- TL0=L_0;
- TH1=0;
- TL1=0;
- TR0=1;
- // while(fw==1); //测得引脚P3^5为高电平
- TR1=1; //timer1 开始计数
- // while(fw==0); //测得引脚P3^5为低电平
- // TR1=0;
- //timer1 停止计数
- // DL=TL1; //读当前计数值
- // DH=TH1;
- /// freq=DPTR;
- // TH1=100;
- // TL1=100;
- // uu=DH*256+DPL+inte*65536; //计算总计数值
- // inte=0; //清累计溢出计数
- // tt=uu/(12*1000000.0/12.0); //求振荡周期
- // ff=(unsigned long int)(1.0/tt); //频率值 求震荡频率
- }
- void yunsuan (void)
- {
- float tt=0;
- // DPH=11;
- // DPL=12;
- uu=DH*256+DL+inte*65536; //计算总计数值
- inte=0; //清累计溢出计数
- tt=uu/(12*1000000.0/12.0); //求振荡周期
- ff=(unsigned long int)(1.0/tt); //频率值 求震荡频率
- }
- void judgekey1()
- {
- long int R=0;
- // R=(dat*1000)/(255-dat);
- R=10*dat-130;
- display(R);
- LED=~LED;
- }
- void judgekey2()
- {
- long int C=0;
- if(scd==0)
- {
- // C=3193333.0/freq;
- C=((9.4*ff)-200)*0.8;
- display1(C);
- LED=~LED;
- }
- else if (scg==0)
- {
- // C=3193333.0/ff;
- C=(9.4*ff)-200;
- display1(C);
- LED=~LED;
- }
- }
-
-
- void display(uint x)
- {
- uchar qian,bai1,shi1,ge1;
- qian=x/1000;
- bai1=(x%1000/100);
- shi1=(x%100/10);
- ge1=x%10;
- // lcd_wcom(0x80+0x0b);
- lcd_wcom(0x80+0x49);
- if(qian==0)
- {lcd_wdat(' ');}
- else if(qian!=0)
- {lcd_wdat(table[qian]);}
- lcd_wdat(table[bai1]);
- lcd_wdat(table[shi1]);
- lcd_wdat(table[ge1]);
- }
- void display1(uint y)
- {
- uchar qian0,bai0,shi0,ge0;
- qian0=y/1000;
- bai0=(y%1000/100);
- shi0=(y%100/10);
- ge0=y%10;
- lcd_wcom(0x80+0x49);
- if(qian0==0)
- {lcd_wdat(' ');}
- else if(qian0!=0)
- {lcd_wdat(table[qian0]);}
- lcd_wdat(table[bai0]);
- lcd_wdat(table[shi0]);
- lcd_wdat(table[ge0]);
- }
- void main(void)
- {
- // fw=1;
- LED=0;
- CH = 0x00; //在这里选择通道 0x00或0x01
- lcd_init();
- measure();
- sr=sc=1;
- while(1)
- {
- if(sr==0)
- {
- lcd_init();
- while(sr==0)
- {
- huanying();
- // fr=1;
- // fc=0;
- // TR0=1;
- // TR1=1;
- // measure();
- // status_F=0;
- // measure();
- // while(status_F==0);
- lcd_xianshi1();
- // TR1=1;
- // yunsuan();
- dat=adc0832(CH);
- // dat=123;
- // display(dat);
- judgekey1();
- // display();
- }
- }
- else if(sc==0)
- {
- lcd_init();
- while(sc==0)
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
基于单片机的电阻电容测量 程序 仿真.rar
(119 KB, 下载次数: 284)
|