日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于AT89C52单片机的数字电压表设计

發(fā)布時間:2023/12/29 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于AT89C52单片机的数字电压表设计 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、系統(tǒng)組成及工作原理

1.1 系統(tǒng)組成

該基于AT89C52單片機的數(shù)字電壓表設計由AT89C51單片機,ADC0809芯片(A/D轉換器),LED數(shù)碼管顯示電路以及蜂鳴器電路等幾部分組成。(用到得芯片是HC6800-MS)

系統(tǒng)結構圖

  • 單片機AT89C52芯片
  • AT89C52是一個低電壓,高性能CMOS?8位單片機,片內含8k?bytes的可反復擦寫的Flash只讀程序存儲器和256?bytes的隨機存取數(shù)據(jù)存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術生產,兼容標準MCS-51指令系統(tǒng),片內置通用8位中央處理器和Flash存儲單元,AT89C52單片機在電子行業(yè)中有著廣泛的應用。

    AT89C52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內含2個外中斷口,3個16位可編程定時計數(shù)器,2個全雙工串行通信口,2?個讀寫口線,AT89C52可以按照常規(guī)方法進行編程,也可以在線編程。其將通用的微處理器和Flash存儲器結合在一起,特別是可反復擦寫的?Flash存儲器可有效地降低開發(fā)成本。

    AT89C52管腳圖

    ?

  • 1.2ADC0809芯片
  • ADC0809作為A/D轉換器,是采樣分辨率為8位的、采用CMOS工藝制成的8通道以逐次逼近原理進行模/數(shù)轉 換的器件。其內部有一個8通道多路開關,它可以根據(jù)地址碼鎖存譯碼后的信號只選通8路模擬輸入信號中的一個進行A/D 轉換。ADC0809的內部結構包括8路模擬選通開關、通道地址鎖存器與譯碼器、8位A/D轉換器和三態(tài)輸出鎖存器。

    ADC0809的工作過程如下:1)設置ADDA、ADDB、ADDC地址選擇信號選擇某一通道號;2)給START端發(fā)送一個上升沿信號,啟動A/D轉換;3)查詢A/D轉換結束信號EOC是否等于1,等于1則A/D轉換結束;4)使輸出允許信號OE=1,通過I/O口讀取8位轉換結果到CPU,準備數(shù)據(jù)處理,此時OE=0。

    Table 1地址選擇與被選通道之間的關系

    ADDA

    ADDB

    ADDC

    通道

    0

    0

    0

    IN0

    0

    0

    1

    IN1

    0

    1

    0

    IN2

    0

    1

    1

    IN3

    1

    0

    0

    IN4

    1

    0

    1

    IN5

    1

    1

    0

    IN6

    1

    1

    1

    IN7

    ?

  • 1.3LED數(shù)碼管顯示電路
  • ?

    LED顯示電路的主要功能是對系統(tǒng)處理后的電壓值及時進行顯示。本設計選用4位的數(shù)碼型LED顯示器,用AT89C51單片機的P0口來控制LED顯示器的段碼;用P1.0-P1.3引腳來控制LED顯示器的位碼。

    實現(xiàn)代碼:

    void display()

    {????

    ?????? led1=led2=led3=led4=0;

    ?????? led4=1;

    ?????? P0=led[volt/100] | 0x80;? //整數(shù)位、小數(shù)點

    ?????? delay(2000);

    ??????

    ?????? led4=0;

    ?????? led3=1;

    ?????? P0=led[(volt/10)%10];?? //小數(shù)點后第一位

    ?????? delay(2000);

    ??????

    ?????? led3=0;

    ?????? led2=1;

    ?????? P0=led[volt%10];? //小數(shù)點后第二位

    ?????? delay(2000);

    ?????????????

    ?????? led1=led2=led3=led4=0;//清除顯示???????????????????????????????????????

    }

    1.1.4 蜂鳴器電路

    當測量值超過設置的最高電壓時,蜂鳴器發(fā)聲且LED燈閃爍。

    實現(xiàn)代碼:

    if((volt/100)>=MAX_VOLT)//超過最高電壓蜂鳴器報警

    ????????????? {

    ???????????????????? beep=~beep;

    ???????????????????? delay(200);

    ???????????????????? LED=0;

    ???????????????????? delay(6000);

    ???????????????????? LED=1;

    ???????????????????? delay(6000);

    ????????????? }

    ????????????? else

    ????????????? {

    ???????????????????? beep=0;

    ???????????????????? LED=1;

    ?????? ??? }

    完整代碼:

    #include "reg52.h"?? ?
    #include<intrins.h>?? ?
    #define uint unsigned int
    #define uchar unsigned char
    #define MAX_VOLT 4?
    uchar code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

    uint volt=0;
    ?
    sbit LED=P2^7;

    sbit led1=P1^0;?? ??
    sbit led2=P1^1;
    sbit led3=P1^2;
    sbit led4=P1^3;?? ?

    sbit OE=P2^6;
    sbit CLK=P1^7;
    sbit START=P2^4;?
    sbit EOC=P2^5;
    ?
    sbit adda=P2^3;
    sbit addb=P2^2;
    sbit addc=P2^0;
    sbit beep=P2^1;

    typedef unsigned int u32;
    typedef unsigned char u16;?? ? ??

    void delay(u32 i)
    {
    ?? ?while(i--);
    ?? ?}


    void ADC()
    {
    ?? ?EA=1;

    ?? ?OE=0;
    ?? ?START=0;
    ?? ?adda=0;
    ?? ?addb=0;
    ?? ?addc=0;
    ?? ?START=1;

    ?? ?START=0;?? ??? ?
    ?? ?while(EOC==0);?
    ?? ?OE=1;?
    ?? ?
    ?? ?EA=0;
    ?? ?volt=P3;
    ?? ?volt=volt*1.96;
    ?? ?
    ?? ?OE=0;
    }

    void display()
    {?? ?
    ?? ?led1=led2=led3=led4=0;
    ?? ?led4=1;
    ?? ?P0=led[volt/100]|0x80; ?//整數(shù)位、小數(shù)點
    ?? ?delay(2000);
    ?? ?
    ?? ?led4=0;
    ?? ?led3=1;
    ?? ?P0=led[(volt/10)%10];?? ?//小數(shù)點后第一位
    ?? ?delay(2000);
    ?? ?
    ?? ?led3=0;
    ?? ?led2=1;
    ?? ?P0=led[volt%10];?? ?//小數(shù)點后第二位
    ?? ?delay(2000);
    ?? ??? ?
    ?? ?led1=led2=led3=led4=0;//清除顯示?? ??? ??? ??? ??? ??? ?
    }

    void main()
    {?? ??? ? ??
    ? ? EA=1;/?? ? ??
    ? ? TMOD=0x01;

    ?? ?TH0=0XFF;
    ? ? TL0=0XB4;

    ?? ?ET0=1;?
    ?? ?TR0=1;
    ?
    ?? ?while(1)
    ?? ?{
    ?? ??? ?ADC();
    ?? ??? ?display();
    ?? ??? ?if((volt/100)>=MAX_VOLT)
    ?? ??? ?{
    ?? ??? ??? ?beep=~beep;
    ?? ??? ??? ?delay(200);
    ?? ??? ??? ?LED=0;
    ?? ??? ??? ?delay(6000);
    ?? ??? ??? ?LED=1;
    ?? ??? ??? ?delay(6000);
    ?? ??? ?}
    ?? ??? ?else
    ?? ??? ?{
    ?? ??? ??? ?beep=0;
    ?? ??? ??? ?LED=1;
    ?? ? ? ?}
    ?? ? }
    }

    void timer() interrupt 1
    {
    ?? ?TH0=0XFF;
    ? ? TL0=0XF0;
    ?? ?CLK=~CLK;
    }

    總結

    以上是生活随笔為你收集整理的基于AT89C52单片机的数字电压表设计的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。