51單片機簡易內阻檢測儀仿真設計(仿真+程序+報告+講解視頻)
仿真圖.8及以上
程序編譯器:keil4/keil5
編程語言:C語言
設計編號:S0037
51單片機簡易內阻檢測儀仿真設計
演示視頻
基于51單片機的簡易內阻檢測儀仿真設計(仿真+程序+報告+講解視頻)
單片機最小系統
單片機最小系統,或則稱為最小應用系統電阻的測量儀器是什么,是指用最少的器件組成的單片機可以工作的系統。對51系列單片機來說,最小系統通常應當包括:單片機、晶振電路、復位電路。下邊給出一個51單片機的最小系統電路圖。
復位電路:
一、復位電路的用途:單片機復位電路就好比筆記本的重啟部份,當筆記本在使用中出現藍屏,按下重啟按鍵筆記本內部的程序從頭開始執行。單片機也一樣,當單片機系統在運行中,深受環境干擾出現程序跑飛的時侯,按下復位按鍵內部的程序手動從頭開始執行。單片機復位電路如右圖:
二、復位電路的工作原理在書本上有介紹,51單片機要復位只須要在第9引腳接個高電平持續2US就可以實現,那這個過程是怎樣實現的呢?在單片機系統中,系統上電啟動的時侯復位一次,當按鈕按下的時侯系統再度復位,假如釋放后再按下,系統就會復位。所以可以通過鍵盤的斷掉和閉合在運行的系統中控制其復位。
開機的時侯為何會復位:在電路圖中,電容的的大小是10uF,內阻的大小是10k。所以依照公式,可以算出電容充電到電源電流的0.7倍(單片機的電源是5V,所以充電到0.7倍即為3.5V),須要的時間是10K*10UF=0.1S。也就是說在單片機啟動的0.1S內,電容兩端的電流時在03.5V降低。這個時侯10K內阻兩端的電流為從51.5V降低(串聯電路各處電流之和為總電流)。所以在0.1S內,RST引腳所接收到的電流是5V~1.5V。在5V正常工作的51單片機中大于1.5V的電流訊號為低電平訊號,而小于1.5V的電流訊號為高電平訊號。所以在開機0.1S內,單片機系統手動復位(RST引腳接收到的高電平訊號時間為0.1S左右)。
鍵盤按下的時侯為何會復位:在單片機啟動0.1S后,電容C兩端的電流持續充電為5V,這是時侯10K內阻兩端的電流接近于0V,RST處于低電平所以系統正常工作。當按鈕按下的時侯,開關導通,這個時侯電容兩端產生了一個回路,電容被漏電,所以在按鈕按下的這個過程中,電容開始釋放之前充的電量。隨著時間的推移,電容的電流在0.1S內,從5V釋放到變為了1.5V,甚至更小。按照串聯電路電流為各處之和,這個時侯10K內阻兩端的電流為3.5V,甚至更大,所以RST引腳又接收到高電平。單片機系統手動復位。
晶振電路:
晶振電路:晶振是晶體振蕩器的簡稱在電氣上它可以等效成一個電容和一個內阻并聯再串聯一個電容的二端網路鉗工學上這個網路有兩個諧振點以頻度的高低分其中較低的頻度是串聯諧振較高的頻度是并聯諧振因為晶體自身的特點使得這兩個頻度的距離相當的接近在這個極窄的頻度范圍內晶振等效為一個電感所以只要晶振的兩端并聯上合適的電容它還會組成并聯諧振電路這個并聯諧振電路加到一個負反饋電路中就可以構成正弦波振蕩電路因為晶振等效為電感的頻度范圍很窄所以雖然其他器件的參數變化很大這個振蕩器的頻度也不會有很大的變化
晶振有一個重要的參數那就是負載電容值選擇與負載電容值相等的并聯電容就可以得到晶振標稱的諧振頻度
通常的晶振振蕩電路都是在一個反相放大器(注意是放大器不是反相器)的兩端接入晶振再有兩個電容分別接到晶振的兩端每位電容的另一端再接到地這兩個電容串聯的容量值就應當等于負載電容請注意通常IC的引腳都有等效輸入電容這個不能忽視
通常的晶振的負載電容為15pF或12.5pF假如再考慮器件引腳的等效輸入電容則兩個22pF的電容構成晶振的振蕩電路就是比較好的選擇
如上圖:晶振是給單片機提供工作訊號脈沖的這個脈沖就是單片機的工作速率例如12M晶振單片機工作速率就是每秒12M其實單片機的工作頻度是有范圍的不能太大通常24M就不起來了不然不穩定
晶振與單片機的腳XTAL0和腳XTAL1構成的振蕩電路中會形成偕波(也就是不希望存在的其他頻度的波)這個波對電路的影響不大但會增加電路的時鐘振蕩器的穩定性為了電路的穩定性起見ATMEL公司只是建議在晶振的兩引腳處接入兩個10pf-50pf的墻磚電容接地來縮減偕波對電路的穩定性的影響所以晶振所配的電容在10pf-50pf之間都可以的沒有哪些估算公式
P0口的上拉內阻:
P0口作為I/O口輸出的時侯時輸出低電平為0輸出高電平為高組態(并非5V,相當于
懸空狀態)。也就是說P0口不能真正的輸出高電平,給所接的負載提供電壓,因而必須接上拉內阻(一阻值聯接到VCC),由電源通過這個上拉內阻給負載提供電壓。因為P0口內部沒有上拉內阻,是開漏的,不管它的驅動能力多大,相當于它是沒有電源的,須要外部的電路提供,絕大多數情況下P0口是必需加上拉內阻的。
1.通常51單片機的P0口在作為地址/數據復用時不接上拉內阻。
2.作為通常的I/O口時用時,因為內部沒有上拉內阻,故要接上上拉內阻??!
3.當p0口拿來驅動PNP管子的時侯,就不須要上拉內阻,由于此時的低電平有效;4.當P0口拿來驅動NPN管子的時侯,就須要上拉內阻的,由于此時只有當P0為1時侯,才才能使后級端導通。
31腳EA/Vpp接電源:
/52或其他51系列兼容單片機非常注意:對于31腳(EA/Vpp),當接高電平時,單片機在復位后從內部ROM的0000H開始執行,當接低電平時,復位后直接從外部ROM的0000H開始執行,這一點是初學者容易忽視的。
1.主要功能:
電路器件參數RC檢測電路的設計
要求:
檢測儀的工作原理為:借助振蕩電路,將內阻檢測轉變為與之成一定函數關系頻度的檢測,再借助單片機對不同頻度進行檢測和處理,用LCD顯示被檢測的大小。
檢測內阻范圍為:≤30KΩ。
檢測精度〈±5%。
以下為本設計資料展示圖:
2.仿真
開始仿真
開始仿真后可以通過滑動變阻器改變測了內阻值,改動后長按檢測鍵盤顯示。
檢測6000R實測數值6081R
檢測實測數值
3.程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^6;
sbit RW=P2^5;
sbit E=P2^7;
sbit R=P1^0;
sbit C=P1^1;
sbit L=P1^2;
sbit A1=P1^3;
sbit A0=P1^4;
#define LCD_data P0
uchar code table1[10]={"R= R"};
uchar code table2[10]={"C= pF"};
uchar code table3[10]={"L= mH"};
uchar code f_table[88]={13,14,15,16,17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100};
uchar code f_correct[88]={9,10, 11, 12, 12, 12, 13, 14, 15, 16, 17, 18, 18, 18, 19, 20, 21, 21, 22, 23, 24, 25, 25, 26, 26, 27, 28, 29, 29, 30, 30, 31, 32, 33, 33, 34, 35, 35, 36, 37, 38, 38, 39, 40, 41, 41, 42, 42, 43, 44, 45, 45, 46, 47, 48, 49, 49, 50, 51, 51, 52, 53, 54, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 62, 62, 63, 64, 64, 65, 66, 66, 67, 67, 68, 69, 70, 71, 71,};
uchar a6,a5,a4,a3,a2,a1;
uchar flag;
unsigned long cnt,cnt1;
uchar f_cnt;
/********************************/
void delay_us(); //18us
void delay_ms(uint);
void lcd_init();
void lcd_write_com(uchar com);
void lcd_write_dat(uchar dat);
void lcd_init();
void lcd_display(uchar add,uchar dat);
/***********************************/
void delay_us()
{
uchar x;
for(x=0;x<5;x++);
}
void delay_ms(uint z)
{
uint x,y;
for(x=0;x<z;x++)
for(y=0;y<123;y++);
}
void lcd_write_com(uchar com)
{
E=0;
RS=0;
RW=0;
delay_us();
LCD_data=com;
E=1; //高脈沖寫入數據
delay_us();
E=0;
}
void lcd_write_dat(uchar dat)
{
E=0;
RS=1;
RW=0;
delay_us();
LCD_data=dat;
E=1; //高脈沖寫入數據
delay_us();
E=0;
}
void lcd_init() //lcd初始化
{
delay_ms(15);
lcd_write_com(0x38);
delay_ms(10);
lcd_write_com(0x0c);
lcd_write_com(0x06);
lcd_write_com(0x01);
delay_ms(2);
}
void timer_init(void) //定時器初始化
{
TMOD=0X51;
PT0=1; /*中斷優先*/
TH0=0x3c;
TL0=0xb0;
TH1=0;
TL1=0;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
EA=1;
}
void lcd_display(uchar add,uchar dat) //lcd顯示(地址,數據)
{
lcd_write_com(add);
lcd_write_dat(dat);
delay_us();
}
void real_display(void)
{
if(!R)
{
// while(!R);
A1=A0=0;
lcd_display(0x80,table1[0]);
lcd_display(0x80+1,table1[1]);
lcd_display(0x80+8,table1[8]);
lcd_display(0x80+9,table1[9]);
}
else if(!C)
{
A0=0;A1=1;
lcd_display(0x80,table2[0]);
lcd_display(0x80+1,table2[1]);
lcd_display(0x80+8,table2[8]);
lcd_display(0x80+9,table2[9]);
}
else if(!L)
{
A0=1;A1=0;
lcd_display(0x80,table3[0]);
lcd_display(0x80+1,table3[1]);
lcd_display(0x80+8,table3[8]);
lcd_display(0x80+9,table3[9]);
}
if(a6)
lcd_display(0x80+2,0x30+a6);
else
lcd_display(0x80+2,' ');
if(a6||a5)
lcd_display(0x80+3,0x30+a5);
else
lcd_display(0x80+3,' ');
if(a6||a5||a4)
lcd_display(0x80+4,0x30+a4);
else
lcd_display(0x80+4,' ');
if(a6||a5||a4||a3)
lcd_display(0x80+5,0x30+a3);
else
lcd_display(0x80+5,' ');
if(a6||a5||a4||a3||a2)
lcd_display(0x80+6,0x30+a2);
else
lcd_display(0x80+6,' ');
lcd_display(0x80+7,0x30+a1);
}
void correct(void) //誤差修正函數
{
uchar i,k;
unsigned long wucha;
if(cnt<100000) //100KHz以內的修正
{
if(cnt>980&&cnt<2100) cnt-=1;
if(cnt>=2100&&cnt<3900) cnt-=2;
if(cnt>=3900&&cnt<4800) cnt-=3;
if(cnt>=4800&&cnt<5700) cnt-=4;
if(cnt>=5700&&cnt<8000) cnt-=5;
if(cnt>=8000&&cnt<9100) cnt-=6;
if(cnt>=9100&&cnt<10900) cnt-=7;
if(cnt>=10900&&cnt<11900) cnt-=8;
if(cnt>=11900&&cnt<13000) cnt-=9;
if(cnt>=13000&&cnt<=100000)
{
k=cnt/1000;
for(i=0;i<88;i++)
{
if(k==f_table[i])
{
cnt-=f_correct[i];
}
}
}
}
if(cnt>100000)
{
wucha=(cnt/1000)*73065/100000;
cnt-=wucha;
}
}
void main()
{
timer_init();
lcd_init();
while(1)
{
if(flag==1)
{
real_display();
flag=0;
}
}
}
void timer0() interrupt 1
{
uchar timer0;
TH0=0x3c; //50ms
TL0=0xb0;
timer0++;
if(timer0==20)
{
TR1=0; //關閉的計數器
EA=0;
cnt=TL1+TH1*256+f_cnt*65536;
correct();
//cnt1=(1e+9)/(2*0.693 *cnt)-20000/2;
if(!R)
{
// while(!R);
cnt1=1000000/(0.2*0.693*cnt)-165;
}
else if(!C)
{
cnt1=1000000000/(0.693*3*510*cnt);
}
else if(!L)
{
cnt1=(1e+9)/(4*3.14*3.14*cnt*cnt*0.05);
}
timer0=0;
a6=cnt1%10000000/100000;
a5=cnt1%100000/10000;
a4=cnt1%10000/1000;
a3=cnt1%1000/100;
a2=cnt1%100/10;
a1=cnt1%10;
flag=1;
TH1=0;
TL1=0;
TH0=0x3c;
TL0=0xb0;
cnt=0;
f_cnt=0;
EA=1;
TR1=1; //打開計數器
}
}
void int1() interrupt 3
{
f_cnt++;
}
4.設計報告
報告格式規范,字數6952,含各類框圖。
報告部份內容
1內阻測試儀的發展歷史及研究現況
現今電子測試領域,內阻,電容和電感的檢測早已在檢測技術和產品研制中應用的非常廣泛。內阻測試發展早已許久,技巧諸多,常用檢測方式如下。內阻檢測根據形成恒流源的方式分為電位降法、比例運算器法和積分運算器法。比列運算器法檢測偏差稍大,積分運算器法適用于高內阻的檢測。傳統的檢測電容方式有諧振法和電橋法兩種。后者電路簡單電阻的測量儀器是什么,速率快,但精度低;前者檢測精度高,但速率慢。隨著數字化檢測技術的發展,在檢測速率和精度上有很大的改善,電容的數字化檢測常采用恒流法和比較法。電感檢測可根據交流電橋法,這些檢測方式其實能較確切的檢測電感但交流電橋的平衡過程復雜,且通過檢測Q值確定電感的方式偏差較大,所以電感的數字化檢測常采用時間常數發和同步分離法。
將一個運算放大器的輸出端與其反相輸入端直接聯接,產生一個電流追隨器;將基準精密內阻?的一端與被隔離的在線器件(Z↓[x])的一端通過導線聯接,基準精密內阻?的另一端與訊號源(V↓[i])或則地聯接,被隔離的在線器件(Z↓[x])的另一端通過導線與地或則訊號源(V↓[i])聯接,基準精密內阻?與被隔離的在線器件(Z↓[x])聯接的一端同時與運算放大器的同相輸入端聯接;中國本土檢測儀器設備發展的主要困局。雖然本土測試檢測產業得到了快速發展,但客觀地說中國開發測試檢測儀器還普遍比較落后。每每提起中國測試儀器落后的緣由,還會有許多不同的說法,例如精度不高,外形不好,可靠性差等。實際上,那些都還是表面現象,
真正影響中國檢測儀器發展的困局為:
測試在整個產品流程中的地位偏高。因為人們的傳統觀念的影響,在產品的制造流程中,研制一直處于核心位置,而測試則處于從屬和輔助位置。關于這一點,在幾乎所有的研究機構部門配置上即可窺其二斑。這些錯誤觀念上的緣由,導致整個社會對測試的注重度不夠,進而導致測試儀器方面人才的嚴重短缺,導致相關的基礎科學研究比較薄弱,這是中國檢測儀器發展的一個主要困局。實際上,就算是研制隊伍本身,對測試的注重度以及對儀器本身的研究也顯著不夠。
面向應用和現代市場營銷模式還沒有真正完善上去。本土儀器設備廠商只是重研制,注重生產,注重狹義的市場,還沒有構建起一套完整的現代營銷體系和面向應用的研制模式。傳統的營銷模式在計劃經濟年代里發揮過很大作用,但未能滿足目前整體解方案流行年代的需求。所以,為了快速縮小與美國先進公司之間的差別,國外儀器研制企業應加速實現從面向仿造的研制向面向應用的研制的過渡。非常是隨著國外應用需求的快速下降,為這一過渡提供了根本動力,應當借助這種動力,跟蹤應用技術的快速發展。
5.設計資料內容清單
下載形式見文章開頭視頻或下方鏈接
百度云云盤資料下載鏈接: