|
|
50黑幣
我的仿真只有第一檔能夠準(zhǔn)確測(cè)量出電容容值,其余三擋不準(zhǔn)確。請(qǐng)問(wèn)是程序哪里出現(xiàn)錯(cuò)誤了?能幫我指正一下嗎?謝謝!
具體可查看附件。
1.png (102.56 KB, 下載次數(shù): 48)
下載附件
2019-4-9 23:22 上傳
檔位 阻值 量程
一檔 R=77.2 1~50微法
二擋 R=772 0.1~5微法
三擋 R=7720 0.01~0.5微法
四擋 R=77200 0.00~0.05微法
單片機(jī)源程序如下: - #include <reg51.h>
- #include<intrins.h>//庫(kù)函數(shù)
- #define DATA P0
- sbit RW=P2^1;//1602寫數(shù)據(jù)
- sbit RS=P2^0;//1602寫地址
- sbit EN=P2^2; //1602工作使能
- sbit b_test=P3^7; //開始測(cè)量電容的按鍵輸入
- sbit _reset=P3^5; //555時(shí)基芯片工作控制信號(hào)
- unsigned int T_flag,N,C,i,Dis1,Dis0;
- unsigned int b[6]={0X13,0X0D,0X00,0X00,0X25,0X16}; //顯示C=00UF
- /***********延時(shí)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為單周期指令,延時(shí)1微妙
- _nop_();
- dat=DATA;
- _nop_();
- _nop_();
- EN=0;
- }while((dat&0x80)==1);
- }
- /**************LCD寫命令函數(shù)*********/
- void wcomd(unsigned char cmd)
- {
- Checkstates(); //判忙
- RS=0; //命令
- RW=0; //寫
- DATA=cmd; //準(zhǔn)備發(fā)送命令
- EN=1; //使能端為1時(shí) ,允許數(shù)據(jù)交換
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- EN=0; //完成數(shù)據(jù)交換,使能端電位拉低
- }
- /**********LCD寫數(shù)據(jù)函數(shù)**************/
- void wdata(unsigned char dat)
- {
- Checkstates(); //判忙
- RS=1; //數(shù)據(jù)
- RW=0; //寫
- DATA=dat;
- EN=1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- EN=0;
- }
- /*****************初始化********************/
- void LCDINIT()
- {
- Delay1ms(5);
- wcomd(0x38);//顯示功能設(shè)置
- Delay1ms(5);
- wcomd(0x38);
- Delay1ms(5);
- wcomd(0x01);//清屏
- Delay1ms(5);
- wcomd(0x08);//關(guān)顯示
- Delay1ms(5);
- wcomd(0x0c);//開顯示,不開光標(biāo)
- }
- /***********顯示函數(shù)**************/
- void Display(void) //顯示函數(shù)
- {
- 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); //0x80di第一行第一個(gè)字符的地址
- Delay1ms(1);
- wdata(a[i]);
- Delay1ms(1);
- }
-
- for(j=0;j<6;j++)//寫顯示第二行
- {
- wcomd(0xc0+j); //第二行第二個(gè)字符地址
- Delay1ms(1);
- wdata(0x30+b[j]);
- Delay1ms(1);
- }
- Delay1ms(150);
- }
- void main()
- {
- EA=1; //打開全部的中斷控制,并開啟外部中斷允許
- TMOD=0x09; //T0為16位計(jì)數(shù)工作方式1
- IT0=1; //設(shè)置外部中斷的觸發(fā)的方式為脈沖觸發(fā)
- TH0=0x00;
- TL0=0x00;
- T_flag=0;
- _reset=0;
- while(1)
- {
- while(!b_test) //如果有測(cè)量按鍵輸入就往下執(zhí)行
- {
- i=0;
- _reset=1; //啟動(dòng)555時(shí)基芯片
- EX0=1; //開啟中斷0
- while(_reset) //超出等待時(shí)間,中斷還沒(méi)有過(guò)來(lái),就退出
- {
- i++;
- if(i>5000) //設(shè)置最長(zhǎng)等待時(shí)間
- {
- _reset=0; //最長(zhǎng)等待時(shí)間到還沒(méi)有中斷,停止555
- }
- }
- if(N<100) //如果計(jì)數(shù)值小于100,顯示SM,表示應(yīng)換用小一點(diǎn)的量程
- {
- b[3]=0X1D;
- b[2]=0X23;
- }
- if(N>5000) //如果計(jì)數(shù)值大于5000,顯示LA,表示應(yīng)換用大一點(diǎn)的量程
- {
- b[3]=0X11;
- b[2]=0X1C;
- }
- if(N>=100 && N<=5000)
- {
- C=N/100; //計(jì)算電容的大小
- b[2]=C/10; //計(jì)算電容值的十位
- b[3]=C-b[2]*10; //計(jì)算電容值的各位
- }
- }
- Display(); //顯示電容的大小
- }
- }
- void int0(void) interrupt 0 //第一次中斷開始計(jì)數(shù),第二個(gè)中斷停止計(jì)數(shù)
- {
- T_flag=!T_flag;
- if(T_flag==1)
- {
- TR0=1; //開始計(jì)時(shí)
- }
- if(T_flag==0)
- {
- TR0=0; //停止計(jì)時(shí)
- EX0=0; //關(guān)閉中斷
- _reset=0; //停止發(fā)出方波
- N=TH0*256+TL0; //計(jì)算計(jì)數(shù)器的值
- N=N*5/3;
- TH0=0x00; //恢復(fù)初值
- TL0=0x00;
- }
- }
復(fù)制代碼
|
-
-
C語(yǔ)言.docx
2019-4-9 23:26 上傳
點(diǎn)擊文件名下載附件
87.99 KB, 下載次數(shù): 4
|