基于AT89C52单片机的数字电压表设计
一、系統組成及工作原理
1.1 系統組成
該基于AT89C52單片機的數字電壓表設計由AT89C51單片機,ADC0809芯片(A/D轉換器),LED數碼管顯示電路以及蜂鳴器電路等幾部分組成。(用到得芯片是HC6800-MS)
系統結構圖
AT89C52是一個低電壓,高性能CMOS?8位單片機,片內含8k?bytes的可反復擦寫的Flash只讀程序存儲器和256?bytes的隨機存取數據存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術生產,兼容標準MCS-51指令系統,片內置通用8位中央處理器和Flash存儲單元,AT89C52單片機在電子行業中有著廣泛的應用。
AT89C52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內含2個外中斷口,3個16位可編程定時計數器,2個全雙工串行通信口,2?個讀寫口線,AT89C52可以按照常規方法進行編程,也可以在線編程。其將通用的微處理器和Flash存儲器結合在一起,特別是可反復擦寫的?Flash存儲器可有效地降低開發成本。
AT89C52管腳圖
?
ADC0809作為A/D轉換器,是采樣分辨率為8位的、采用CMOS工藝制成的8通道以逐次逼近原理進行模/數轉 換的器件。其內部有一個8通道多路開關,它可以根據地址碼鎖存譯碼后的信號只選通8路模擬輸入信號中的一個進行A/D 轉換。ADC0809的內部結構包括8路模擬選通開關、通道地址鎖存器與譯碼器、8位A/D轉換器和三態輸出鎖存器。
ADC0809的工作過程如下:1)設置ADDA、ADDB、ADDC地址選擇信號選擇某一通道號;2)給START端發送一個上升沿信號,啟動A/D轉換;3)查詢A/D轉換結束信號EOC是否等于1,等于1則A/D轉換結束;4)使輸出允許信號OE=1,通過I/O口讀取8位轉換結果到CPU,準備數據處理,此時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 |
?
?
LED顯示電路的主要功能是對系統處理后的電壓值及時進行顯示。本設計選用4位的數碼型LED顯示器,用AT89C51單片機的P0口來控制LED顯示器的段碼;用P1.0-P1.3引腳來控制LED顯示器的位碼。
實現代碼:
void display()
{????
?????? led1=led2=led3=led4=0;
?????? led4=1;
?????? P0=led[volt/100] | 0x80;? //整數位、小數點
?????? delay(2000);
??????
?????? led4=0;
?????? led3=1;
?????? P0=led[(volt/10)%10];?? //小數點后第一位
?????? delay(2000);
??????
?????? led3=0;
?????? led2=1;
?????? P0=led[volt%10];? //小數點后第二位
?????? delay(2000);
?????????????
?????? led1=led2=led3=led4=0;//清除顯示???????????????????????????????????????
}
1.1.4 蜂鳴器電路
當測量值超過設置的最高電壓時,蜂鳴器發聲且LED燈閃爍。
實現代碼:
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; ?//整數位、小數點
?? ?delay(2000);
?? ?
?? ?led4=0;
?? ?led3=1;
?? ?P0=led[(volt/10)%10];?? ?//小數點后第一位
?? ?delay(2000);
?? ?
?? ?led3=0;
?? ?led2=1;
?? ?P0=led[volt%10];?? ?//小數點后第二位
?? ?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单片机的数字电压表设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单片微型计算机原理及接口技术 陈桂友,《
- 下一篇: 51DIY音乐频谱显示