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