ADC0804在單片機中的簡單應用舉例
如下圖所示,本例ADC0804中的VCC=5V, VREF/2引腳懸空(懸空則相當于與VCC共接5V電源),因此ADC轉換的參考電壓為VCC的值,即5V。VIN-接地,而VIN+連接滑動變阻器RV1的輸出,因此VIN+的電壓輸入范圍為0V~5V,正好處于參考電壓范圍內。
引腳接地, 和分別連接單片機的P3^6和P3^7引腳,而DB0~DB7連接單片機的P1口.
P0口接數碼管的段選線,P2口低四位接數碼管的位選線。
程序主要實現以下功能:
(1)控制ADC0804芯片對VIN(+)引腳輸入的電壓值進行正確采樣,讀取采樣結果。
(2)對采樣值進行模數變換,將轉換后數字量后顯示在4段數碼管上。
C程序如下:
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit wr=P3^6;
sbit rd=P3^7;
uchar code dis[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共陽顯示代碼
void delay(uint x) //延時函數 delay(1)延時0.992ms,大約為1ms
{
uchar i;
while(x--)
for(i=0;i<120;i++);
}
void display(uchar db) //數碼管顯示函數,用于顯示模數轉換后得到的數字量
{
uchar bw,sw,gw; //bw,sw,gw分別等于db百位,十位,個位上的數
bw=db/100;
sw=db%100/10;
gw=db%10;
P2=0x01; //點亮第一只數碼管
P0=dis[bw]&0x7f; //最高位置0,點亮第一只數碼管的小數點,
delay(5);
P2=0x02; //點亮第二只數碼管
P0=dis[sw];
delay(5);
P2=0x04; //點亮第三只數碼管
P0=dis[gw];
delay(5);
P2=0x08; //點亮第四只數碼管
P0=dis[0]; //第四只數碼管一直顯示0
delay(5);
}
void main()
{
uchar i;
while(1)
{
wr=0; //在片選信號CS為低電平情況下(由于CS接地,所以始終為低電平),
_nop_(); //WR由低電平到高電平時,即上升沿時,AD開始采樣轉換
wr=1;
delay(1); //延時1ms,等待采樣轉換結束
P1=0xff; //這條語句不能少,我也還不知道為什么
rd=0; //將RD腳置低電平后,再延時大于135ns左右(這里延時1us),
_nop_(); //即可從DB腳讀出有效的采樣結果,傳送到P1口
for(i=0;i<10;i++) //刷新顯示一段時間
display(P1); //顯示從DB得到的數字量
}
}
Proteus仿真運行結果如下: