|
- /*********************************************************************************************************</這種電容測量方法主要是通過一塊555芯片來測量電容,讓555芯片工作在直接反饋無穩態的狀態下,555芯片輸出一定頻率的方波,其頻率的大小跟被測量的電容之間的關系是:f=0.772/(R*Cx),我們固定R的大小,其公式就可以寫為:f=k/Cx,只要我們能夠測量出555芯片輸出的頻率,就可以計算出測量的電容。計算頻率的方法可以利用單片機的計數器T0和中斷INT0配合使用來測量,這種研究方法相當的簡單。
- *********************************************************************************************************/
- #include "reg51.h"
- #include"intrins.h
- #define DATA P0
- sbit RW=P2^1;//1602寫數據
- sbit RS=P2^0;//1602寫地址
- sbit EN=P2^2; //1602工作使能
- sbit b_test=P3^7; //控制小燈的亮滅
- sbit _reset=P3^5; //555時基芯片工作控制信號
- unsigned int T_flag,N,C,i,Dis1,Dis0;
- unsigned int b[6]={0X13,0X0D,0X00,0X00,0X40,0X16}; //顯示C=00pF</FONT></P>
- /***********延時1MS******************/
- void Delay1ms(unsigned int mm)
- {unsigned int i;
- for(mm;mm>0;mm--)
- for(i=100;i>0;i--);
- }
- /***************檢查忙否*****************/
- void Checkstates()
- {
- unsigned char dat;
- RS=0;
- RW=1;
- do{EN=1;//下降沿
- _nop_();//保持一定間隔
- _nop_();
- dat=DATA;
- _nop_();
- _nop_();
- EN=0;
- }while((dat&0x80)==1);
- }
- /**************LCD寫命令函數*********/
- void wcomd(unsigned char cmd)
- {
- Checkstates();
- RS=0;
- RW=0;
- DATA=cmd;
- EN=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- EN=0;
- }
- /**********LCD寫數據函數**************/
- void wdata(unsigned char dat)
- {
- Checkstates();
- RS=1;
- RW=0;
- DATA=dat;
- EN=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- EN=0;
- }
- /*****************初始化********************/
- void LCDINIT()
- {
- Delay1ms(15);
- wcomd(0x38);//功能設置
- Delay1ms(5);
- wcomd(0x38);//功能設置
- Delay1ms(5);
- wcomd(0x01);//清屏
- Delay1ms(5);
- wcomd(0x08);//關顯示
- Delay1ms(5);
- wcomd(0x0c);//開顯示,不開光標</FONT></P>
- <P><FONT color=black>}</FONT></P>
- <P><FONT color=black>/***********顯示函數**************/
- void Display(void) //顯示函數
- {
- unsigned char i,j;
- unsigned char a[12]={0X4D,0X45,0X41,0X53,0X55,0X52,0X45,0X4D,0X45,0X4E,0X54,0X53};//顯示measurements
- LCDINIT();
- for(i=0;i<12;i++)//寫顯示第一行
- { wcomd(0x80+i);
- Delay1ms(1);
- wdata(a[i]);
- Delay1ms(1);
- }
- for(j=0;j<6;j++)//寫顯示第二行
- {
- wcomd(0xc0+j);
- Delay1ms(1);
- wdata(0x30+b[j]);
- Delay1ms(1);
- }
- Delay1ms(150);</FONT></P>
- <P><FONT color=black>}
- void main()
- {
- IE=0x81; //打開全部的中斷控制,并開啟外部中斷允許
- TMOD=0x09; //T0為16位計數工作方式1
- IT0=1; //設置外部中斷的觸發的方式為脈沖觸發
- TH0=0x00;
- TL0=0x00;
- T_flag=0;
- _reset=0;
- b_test=1;
- while(1)
- {
- //while(!b_test) //如果有測量按鍵輸入就往下執行
- //{
- i=0;
- _reset=1; //啟動555時基芯片
- EX0=1; //開啟中斷0
- while(_reset) //超出等待時間,中斷還沒有過來,就退出
- {
- i++;
- if(i>50000) //設置最長等待時間
- {
- _reset=0; //最長等待時間到還沒有中斷,停止555
- }
- }
- if(N<100) //如果計數值小于100,顯示SM,表示應換用小一點的量程
- {
- b[3]=0X1D;
- b[2]=0X23;
- }
- if(N>50000) //如果計數值大于5000,顯示LA,表示應換用大一點的量程
- {
- b[3]=0X11;
- b[2]=0X1C;
- }
- if(N>=100 && N<=50000)
- {
- C=N/100; //計算電容的大小
- b[2]=C/10; //計算電容值的十位
- b[3]=C-b[2]*10; //計算電容值的各位
- }
- //}
- Display(); //顯示電容的大小
- if(C>40)
- b_test=0;
- else
- b_test=1;
- }
- }
- void int0(void) interrupt 0 //第一次中斷開始計數,第二個中斷停止計數
- {
- T_flag=!T_flag;
- if(T_flag==1)
- {
- TR0=1; //開始計時
- }
- if(T_flag==0)
- {
- TR0=0; //停止計時
- EX0=0; //關閉中斷
- _reset=0; //停止發出方波
- N=TH0*256+TL0; //計算計數器的值
- N=N*5/3;
- TH0=0x00; //恢復初值
- TL0=0x00;
- }
- }[audio]http://play.baidu.com/?__m=mboxCtrl.playSong&__a=233111&__o=song/233111||playBtn&fr=altg3||www.baidu.com#[/audio]
復制代碼 |
-
-
單片機電容測量.rar
2015-3-14 19:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
70.94 KB, 下載次數: 250, 下載積分: 黑幣 -5
|