加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入

51單片機(jī)簡易電阻測量儀仿真設(shè)計

08/30 09:58
929
服務(wù)支持:
技術(shù)交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗、收獲成長和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購買后不支持退換且無法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論
放大
實物圖
  • 方案介紹
    • 演示視頻
    • 單片機(jī)最小系統(tǒng)
    • 1.主要功能:
    • 2.仿真
    • 3. 程序
    • 4.設(shè)計報告
    • 5. 設(shè)計資料內(nèi)容清單
  • 相關(guān)文件
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

51單片機(jī)簡易電阻測量儀仿真設(shè)計( proteus仿真+程序+報告+講解視頻)

仿真圖proteus7.8及以上

程序編譯器:keil 4/keil 5

編程語言:C語言

設(shè)計編號:S0037

演示視頻


基于51單片機(jī)的簡易電阻測量儀仿真設(shè)計( proteus仿真+程序+報告+講解視頻)

單片機(jī)最小系統(tǒng)

單片機(jī)最小系統(tǒng),或者稱為 最小應(yīng)用系統(tǒng),是指用最少的元件組成的單片機(jī)可以工作的系統(tǒng)。對51系列單片機(jī)來說,最小系統(tǒng)一般應(yīng)該包括:單片機(jī)、晶振電路、復(fù)位電路。下面給出一個51單片機(jī)的最小系統(tǒng)電路圖

復(fù)位電路:

一、復(fù)位電路的用途:單片機(jī)復(fù)位電路就好比電腦的重啟部分,當(dāng)電腦在使用中出現(xiàn)死機(jī),按下重啟按鈕電腦內(nèi)部的程序從頭開始執(zhí)行。單片機(jī)也一樣,當(dāng)單片機(jī)系統(tǒng)在運(yùn)行中,受到環(huán)境干擾出現(xiàn)程序跑飛的時候,按下復(fù)位按鈕內(nèi)部的程序自動從頭開始執(zhí)行。單片機(jī)復(fù)位電路如下圖:

二、復(fù)位電路的工作原理在書本上有介紹,51單片機(jī)要復(fù)位只需要在第9引腳接個高電平持續(xù)2US就可以實現(xiàn),那這個過程是如何實現(xiàn)的呢?在單片機(jī)系統(tǒng)中,系統(tǒng)上電啟動的時候復(fù)位一次,當(dāng)按鍵按下的時候系統(tǒng)再次復(fù)位,如果釋放后再按下,系統(tǒng)還會復(fù)位。所以可以通過按鍵的斷開和閉合在運(yùn)行的系統(tǒng)中控制其復(fù)位。

開機(jī)的時候為什么會復(fù)位:在電路圖中,電容的的大小是10uF,電阻的大小是10k。所以根據(jù)公式,可以算出電容充電到電源電壓的0.7倍(單片機(jī)的電源是5V,所以充電到0.7倍即為3.5V),需要的時間是10K*10UF=0.1S。也就是說在單片機(jī)啟動的0.1S內(nèi),電容兩端的電壓時在03.5V增加。這個時候10K電阻兩端的電壓為從51.5V減少(串聯(lián)電路各處電壓之和為總電壓)。所以在0.1S內(nèi),RST引腳所接收到的電壓是5V~1.5V。在5V正常工作的51單片機(jī)中小于1.5V的電壓信號為低電平信號,而大于1.5V的電壓信號為高電平信號。所以在開機(jī)0.1S內(nèi),單片機(jī)系統(tǒng)自動復(fù)位(RST引腳接收到的高電平信號時間為0.1S左右)。

按鍵按下的時候為什么會復(fù)位:在單片機(jī)啟動0.1S后,電容C兩端的電壓持續(xù)充電為5V,這是時候10K電阻兩端的電壓接近于0V,RST處于低電平所以系統(tǒng)正常工作。當(dāng)按鍵按下的時候,開關(guān)導(dǎo)通,這個時候電容兩端形成了一個回路,電容被短路,所以在按鍵按下的這個過程中,電容開始釋放之前充的電量。隨著時間的推移,電容的電壓在0.1S內(nèi),從5V釋放到變?yōu)榱?.5V,甚至更小。根據(jù)串聯(lián)電路電壓為各處之和,這個時候10K電阻兩端的電壓為3.5V,甚至更大,所以RST引腳又接收到高電平。單片機(jī)系統(tǒng)自動復(fù)位。

晶振電路:

晶振電路:晶振是晶體振蕩器的簡稱 在電氣上它可以等效成一個電容和一個電阻并聯(lián)再串聯(lián)一個電容的二端網(wǎng)絡(luò) 電工學(xué)上這個網(wǎng)絡(luò)有兩個諧振點 以頻率的高低分其中較低的頻率是串聯(lián)諧振 較高的頻率是并聯(lián)諧振 由于晶體自身的特性致使這兩個頻率的距離相當(dāng)?shù)慕咏?在這個極窄的頻率范圍內(nèi) 晶振等效為一個電感 所以只要晶振的兩端并聯(lián)上合適的電容它就會組成并聯(lián)諧振電路 這個并聯(lián)諧振電路加到一個負(fù)反饋電路中就可以構(gòu)成正弦波振蕩電路 由于晶振等效為電感的頻率范圍很窄 所以即使其他元件的參數(shù)變化很大 這個振蕩器的頻率也不會有很大的變化

晶振有一個重要的參數(shù) 那就是負(fù)載電容值 選擇與負(fù)載電容值相等的并聯(lián)電容 就可以得到晶振標(biāo)稱的諧振頻率
一般的晶振振蕩電路都是在一個反相放大器(注意是放大器不是反相器)的兩端接入晶振 再有兩個電容分別接到晶振的兩端 每個電容的另一端再接到地 這兩個電容串聯(lián)的容量值就應(yīng)該等于負(fù)載電容 請注意一般IC的引腳都有等效輸入電容 這個不能忽略

一般的晶振的負(fù)載電容為15pF或12.5pF 如果再考慮元件引腳的等效輸入電容 則兩個22pF的電容構(gòu)成晶振的振蕩電路就是比較好的選擇

如上圖:晶振是給單片機(jī)提供工作信號脈沖的 這個脈沖就是單片機(jī)的工作速度 比如 12M晶振 單片機(jī)工作速度就是每秒12M 當(dāng)然 單片機(jī)的工作頻率是有范圍的 不能太大 一般24M就不上去了 不然不穩(wěn)定

晶振與單片機(jī)的腳XTAL0和腳XTAL1構(gòu)成的振蕩電路中會產(chǎn)生偕波(也就是不希望存在的其他頻率的波) 這個波對電路的影響不大 但會降低電路的時鐘振蕩器的穩(wěn)定性 為了電路的穩(wěn)定性起見 ATMEL公司只是建議在晶振的兩引腳處接入兩個10pf-50pf的瓷片電容接地來削減偕波對電路的穩(wěn)定性的影響 所以晶振所配的電容在10pf-50pf之間都可以的 沒有什么計算公式

P0口的上拉電阻

P0口作為I/O口輸出的時候時 輸出低電平為0 輸出高電平為高組態(tài)(并非5V,相當(dāng)于懸空狀態(tài))。也就是說P0 口不能真正的輸出高電平,給所接的負(fù)載提供電流,因此必須接上拉電阻(一電阻連接到VCC),由電源通過這個上拉電阻給負(fù)載提供電流。 由于P0口內(nèi)部沒有上拉電阻,是開漏的,不管它的驅(qū)動能力多大,相當(dāng)于它是沒有電源的,需要外部的電路提供,絕大多數(shù)情況下P0口是必需加上拉電阻的。

1.一般51單片機(jī)的P0口在作為地址/數(shù)據(jù)復(fù)用時不接上拉電阻。
2.作為一般的I/O口時用時,由于內(nèi)部沒有上拉電阻,故要接上上拉電阻?。?br /> 3.當(dāng)p0口用來驅(qū)動PNP管子的時候,就不需要上拉電阻,因為此時的低電平有效;
4.當(dāng)P0口用來驅(qū)動NPN管子的時候,就需要上拉電阻的,因為此時只有當(dāng)P0為1時候,才能夠使后級端導(dǎo)通。

31腳EA/Vpp接電源:

STC89C51/52或其他51系列兼容單片機(jī)特別注意:對于31腳(EA/Vpp),當(dāng)接高電平時,單片機(jī)在復(fù)位后從內(nèi)部ROM的0000H開始執(zhí)行,當(dāng)接低電平時,復(fù)位后直接從外部ROM的0000H開始執(zhí)行,這一點是初學(xué)者容易忽略的。

1.主要功能:

電路元件參數(shù)RC測量電路的設(shè)計

要求:

測量儀的工作原理為:利用振蕩電路,將電阻測量轉(zhuǎn)變?yōu)榕c之成一定函數(shù)關(guān)系頻率的測量,再利用單片機(jī)對不同頻率進(jìn)行測量和處理,用LCD顯示被測量的大小。

測量電阻范圍為:≤30KΩ。

測量精度〈±5%。

以下為本設(shè)計資料展示圖:

2.仿真

開始仿真

開始仿真后可以通過滑動變阻器改變測了電阻值,改動后長按測量按鍵顯示。

測量6000R 實測數(shù)值6081R

測量15000R 實測數(shù)值15186R

img

img

3. 程序

img

    #include<reg52.h>
    #include<intrins.h>
    #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;           //高脈沖寫入數(shù)據(jù)
      delay_us();
      E=0;
    }
    void lcd_write_dat(uchar dat)
    {
      E=0;
      RS=1;
      RW=0;
      delay_us();
      LCD_data=dat;
      E=1;           //高脈沖寫入數(shù)據(jù)
      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;     /*中斷優(yōu)先*/
            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顯示(地址,數(shù)據(jù))
    {

            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)                        //誤差修正函數(shù)
    {
            uchar i,k;
            unsigned long wucha;
            if(cnt<100000)                   //100KHz以內(nèi)的修正
            {
                    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;          //關(guān)閉的計數(shù)器
                    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;           //打開計數(shù)器
           
           
            }
           

    }       

    void int1() interrupt 3
    {
             f_cnt++;
    } 

4.設(shè)計報告

報告格式規(guī)范,字?jǐn)?shù)6952,含各種框圖。

img

報告部分內(nèi)容

1 電阻測試儀的發(fā)展歷史及研究現(xiàn)狀

當(dāng)今電子測試領(lǐng)域,電阻,電容和電感的測量已經(jīng)在測量技術(shù)和產(chǎn)品研發(fā)中應(yīng)用的十分廣泛。 電阻測試發(fā)展已經(jīng)很久,方法眾多,常用測量方法如下。電阻測量依據(jù)產(chǎn)生恒流源的方法分為電位降法、比例運(yùn)算器法和積分運(yùn)算器法。比例運(yùn)算器法測量誤差稍大,積分運(yùn)算器法適用于高電阻的測量。傳統(tǒng)的測量電容方法有諧振法和電橋法兩種。前者電路簡單,速度快,但精度低;后者測量精度高,但速度慢。隨著數(shù)字化測量技術(shù)的發(fā)展,在測量速度和精度上有很大的改善,電容的數(shù)字化測量常采用恒流法和比較法。電感測量可依據(jù)交流電橋法,這種測量方法雖然能較準(zhǔn)確的測量電感但交流電橋的平衡過程復(fù)雜,且通過測量Q值確定電感的方法誤差較大,所以電感的數(shù)字化測量常采用時間常數(shù)發(fā)和同步分離法。

將一個運(yùn)算放大器的輸出端與其反相輸入端直接連接,形成一個電壓跟隨器; 將基準(zhǔn)精密電阻?的一端與被隔離的在線元件(Z↓[x])的一端通過導(dǎo)線連接,基準(zhǔn)精密電阻?的另一端與信號源(V↓[i])或者地連接,被隔離的在線元件(Z↓[x])的另一端通過導(dǎo)線與地或者信號源(V↓[i])連接,基準(zhǔn)精密電阻?與被隔離的在線元件(Z↓[x])連接的一端同時與運(yùn)算放大器的同相輸入端連接;中國本土測量儀器設(shè)備發(fā)展的主要瓶頸。盡管本土測試測量產(chǎn)業(yè)得到了快速發(fā)展,但客觀地說中國開發(fā)測試測量儀器還普遍比較落后。每當(dāng)提起中國測試儀器落后的原因,就會有許多不同的說法,諸如精度不高,外觀不好,可靠性差等。實際上,這些都還是表面現(xiàn)象,

真正影響中國測量儀器發(fā)展的瓶頸為:

測試在整個產(chǎn)品流程中的地位偏低。由于人們的傳統(tǒng)觀念的影響,在產(chǎn)品的制造流程中,研發(fā)始終處于核心位置,而測試則處于從屬和輔助位置。關(guān)于這一點,在幾乎所有的研究機(jī)構(gòu)部門配置上即可窺其一斑。這種錯誤觀念上的原因,造成整個社會對測試的重視度不夠,從而造成測試儀器方面人才的嚴(yán)重匱乏,造成相關(guān)的基礎(chǔ)科學(xué)研究比較薄弱,這是中國測量儀器發(fā)展的一個主要瓶頸。實際上,即便是研發(fā)隊伍本身,對測試的重視度以及對儀器本身的研究也明顯不夠。

面向應(yīng)用和現(xiàn)代市場營銷模式還沒有真正建立起來。本土儀器設(shè)備廠商只是重研發(fā),重視生產(chǎn),重視狹義的市場,還沒有建立起一套完整的現(xiàn)代營銷體系和面向應(yīng)用的研發(fā)模式。傳統(tǒng)的營銷模式在計劃經(jīng)濟(jì)年代里發(fā)揮過很大作用,但無法滿足目前整體解方案流行年代的需求。所以,為了快速縮小與國外先進(jìn)公司之間的差距,國內(nèi)儀器研發(fā)企業(yè)應(yīng)加速實現(xiàn)從面向仿制的研發(fā)向面向應(yīng)用的研發(fā)的過渡。特別是隨著國內(nèi)應(yīng)用需求的快速增長,為這一過渡提供了根本動力,應(yīng)該利用這些動力,跟蹤應(yīng)用技術(shù)的快速發(fā)展。

5. 設(shè)計資料內(nèi)容清單

下載方式見文章開頭視頻或下方鏈接

img

百度云網(wǎng)盤資料下載鏈接:

https://docs.qq.com/doc/DS3VsUGdlQnBheExM

  • 設(shè)計資料獲取聯(lián)系方式.doc

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
XRCGB25M000F3A00R0 1 Murata Manufacturing Co Ltd Parallel - Fundamental Quartz Crystal, 25MHz Nom, ROHS AND REACH COMPLIANT, SMALL, SMD, 3 PIN

ECAD模型

下載ECAD模型
$0.34 查看
M25P05-AVMN6P 1 Rochester Electronics LLC 64KX8 FLASH 2.7V PROM, PDSO8, 0.150 INCH, ROHS COMPLIANT, PLASTIC, SOP-8
$0.79 查看
S29GL256P10FFI020 1 AMD Flash, 16MX16, 100ns, PBGA64,
$9.29 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜