如果你的微控制器有內部AD,可以直接將GP2D12的OUTPUT腳連線到微控制器的AD輸入端,如果沒有內部AD,需要接一塊AD轉換晶片再連線到微控制器
下面這段程式使用了AD晶片ADC0809,微控制器是STC89C52RC.用液晶LCD1602來顯示資料,可參考.
#include
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;
sbit rs = P2^0;
sbit rw = P2^1;
sbit ep = P2^2;
sbit ST = P3^0;
sbit OE = P3^1;
sbit EOC = P3^2;
sbit CLK = P3^3;
int flag;
delay(BYTE ms)
{ // 延時子程式
BYTE i;
while(ms--)
{
for(i = 0; i
_nop_();
}
BOOL lcd_bz()
{ // 測試LCD忙碌狀態
BOOL result;
rs = 0;
rw = 1;
ep = 1;
result = (BOOL)(P0 & 0x80);
ep = 0;
return result;
lcd_wcmd(BYTE cmd)
{ // 寫入指令資料到LCD
while(lcd_bz());
rw = 0;
P0 = cmd;
lcd_pos(BYTE pos)
{ //設定顯示位置
lcd_wcmd(pos | 0x80);
lcd_wdat(BYTE dat)
{ //寫入字元顯示資料到LCD
rs = 1;
P0 = dat;
lcd_init()
{ //LCD初始化設定
lcd_wcmd(0x38);
delay(1);
lcd_wcmd(0x0c);
lcd_wcmd(0x06);
lcd_wcmd(0x01); //清除LCD的顯示內容
void t0() interrupt 1 using 0
CLK=~CLK; //ADC0809 CLK
void t1() interrupt 3 using 0
flag++;
main()
long int temp;
long int temp1;
int d100;
int d10;
ST=0;
OE=0;
TMOD=0x12;
TH0=246;TL0=246; //50KHZ
TH1=0;TL1=0; //50KHZ
TR0=1;ET0=1;TR1=1;ET1=1;EA=1;
lcd_init(); // 初始化LCD
delay(10);
flag=0;
while(1)
if (flag==5)
ST=1;ST=0; //給一個脈衝,上升沿暫存器復位,下降沿AD轉換開始
while(EOC==0); //當EOC為1時,轉換結束
OE=1; //暫存器資料輸出到D0-D7
temp=P1;
OE=0; //DO-D7復位
temp1=(temp*500)/256; //AD值轉換成電壓值(V=AD*VREF/256)
//顯示AD值
d100=temp/100;
lcd_pos(0x00);
lcd_wdat(0x30+d100);
temp=temp%100;
d10=temp/10;
lcd_pos(0x01);
lcd_wdat(0x30+d10);
temp=temp%10;
lcd_pos(0x02);
lcd_wdat(0x30+temp);
//顯示電壓值
d100=temp1/100;
lcd_pos(0x40);
temp1=temp1%100;
lcd_pos(0x41);
lcd_wdat(0x2e);
d10=temp1/10;
lcd_pos(0x42);
temp1=temp1%10;
lcd_pos(0x43);
lcd_wdat(0x30+temp1);
如果你的微控制器有內部AD,可以直接將GP2D12的OUTPUT腳連線到微控制器的AD輸入端,如果沒有內部AD,需要接一塊AD轉換晶片再連線到微控制器
下面這段程式使用了AD晶片ADC0809,微控制器是STC89C52RC.用液晶LCD1602來顯示資料,可參考.
#include
#include
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;
sbit rs = P2^0;
sbit rw = P2^1;
sbit ep = P2^2;
sbit ST = P3^0;
sbit OE = P3^1;
sbit EOC = P3^2;
sbit CLK = P3^3;
int flag;
delay(BYTE ms)
{ // 延時子程式
BYTE i;
while(ms--)
{
for(i = 0; i
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
BOOL lcd_bz()
{ // 測試LCD忙碌狀態
BOOL result;
rs = 0;
rw = 1;
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80);
ep = 0;
return result;
}
lcd_wcmd(BYTE cmd)
{ // 寫入指令資料到LCD
while(lcd_bz());
rs = 0;
rw = 0;
ep = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_pos(BYTE pos)
{ //設定顯示位置
lcd_wcmd(pos | 0x80);
}
lcd_wdat(BYTE dat)
{ //寫入字元顯示資料到LCD
while(lcd_bz());
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ep = 0;
}
lcd_init()
{ //LCD初始化設定
lcd_wcmd(0x38);
delay(1);
lcd_wcmd(0x0c);
delay(1);
lcd_wcmd(0x06);
delay(1);
lcd_wcmd(0x01); //清除LCD的顯示內容
delay(1);
}
void t0() interrupt 1 using 0
{
CLK=~CLK; //ADC0809 CLK
}
void t1() interrupt 3 using 0
{
flag++;
}
main()
{
long int temp;
long int temp1;
int d100;
int d10;
ST=0;
OE=0;
TMOD=0x12;
TH0=246;TL0=246; //50KHZ
TH1=0;TL1=0; //50KHZ
TR0=1;ET0=1;TR1=1;ET1=1;EA=1;
lcd_init(); // 初始化LCD
delay(10);
flag=0;
while(1)
{
if (flag==5)
{
flag=0;
ST=1;ST=0; //給一個脈衝,上升沿暫存器復位,下降沿AD轉換開始
while(EOC==0); //當EOC為1時,轉換結束
OE=1; //暫存器資料輸出到D0-D7
temp=P1;
OE=0; //DO-D7復位
temp1=(temp*500)/256; //AD值轉換成電壓值(V=AD*VREF/256)
//顯示AD值
d100=temp/100;
lcd_pos(0x00);
lcd_wdat(0x30+d100);
temp=temp%100;
d10=temp/10;
lcd_pos(0x01);
lcd_wdat(0x30+d10);
temp=temp%10;
lcd_pos(0x02);
lcd_wdat(0x30+temp);
//顯示電壓值
d100=temp1/100;
lcd_pos(0x40);
lcd_wdat(0x30+d100);
temp1=temp1%100;
lcd_pos(0x41);
lcd_wdat(0x2e);
d10=temp1/10;
lcd_pos(0x42);
lcd_wdat(0x30+d10);
temp1=temp1%10;
lcd_pos(0x43);
lcd_wdat(0x30+temp1);
}
}
}