當前位置:首頁 » 編程語言 » adc0809c語言程序
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

adc0809c語言程序

發布時間: 2023-02-03 23:27:40

① 8051單片機和ADC0809 連接的C語言編程

啟動ADC0809,ADC0809將開始將外部電壓轉換成數字,當轉換完成時,轉換完成信號引腳會輸出一個電平(請查看datasheet).這時單片機就可以直接讀取數據了.
如果要不停採集,就繼續啟動採集,再查詢ADC0809完成引腳.
ADC0809晶元的採集速度是幾百K吧.記不得了,你自己看下.
也可以將ADC0809的完成引腳接到單片機的外部中斷引腳上,這樣就可以在中斷中讀取.
代碼自己找下吧,網上很多的.
這個給你參考:
#define
voldata
P2
sbit
adra=P0^0;
sbit
adrb=P0^1;
sbit
adrc=P0^2;
sbit
ale=P0^3;
sbit
st=P0^4;
sbit
eoc=P0^5;
sbit
oe=P0^6;
unsigned
char
getvol(unsigned
char
adr)
{
unsigned
char
volnumber=0;
unsigned
int
n=1000;
oe=0;
ale=0;
adra=!(!(adr&0x01));
adrb=!(!(adr&0x02));
adrc=!(!(adr&0x04));
ale=1;
st=0;
st=1;
st=0;
while(n--);
while(!eoc);
oe=1;
volnumber=voldata;
oe=0;
return(volnumber);
}
只要向函數傳遞一個0-7的地址(adra、adrb、adrc是地址線);便會返回相對應地址上的0-255的值;再根據相應的基準電壓便可以計算出被測電壓的值了!

② 求教一個單片機ADC0808或者0809的AD轉換C語言程序,如果可以和PC機通信就非常感謝了

//------------------------------------------------------------
// ADC0809模數轉換
//ADC0809采樣通道3輸入的模擬量,轉換後結果顯示在數碼管上
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int

uchar code LEDData[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//ADC0809引腳定義
sbit OE=P1^0;
sbit EOC=P1^1;
sbit ST=P1^2;
sbit CLK=P1^3;
//延時
void Delayms(uint ms)
{
uchar i;
while(ms--)for(i=0;i<120;i++);
}
//顯示轉換結果
void Display_Result(uchar d)
{
P2=0xf7;
P0=LEDData[d%10];
Delayms(5);
P2=0xfd;
P0=LEDData[d%100/10];
Delayms(5);
P2=0xfd;
P0=LEDData[d/100];
Delayms(5);
}
// 主程序
void main()
{
TMOD=0x02;
TH0=0x14;
TL0=0x00;
IE=0x82;
TR0=1;
P1=0x3f;//選擇ADC0809通道3(0111)
//高4位設通道地址為0111
while(1)
{
ST=0;ST=1;ST=0;//啟動轉換
while(EOC==0); //等待轉換結果
OE=1; //允許輸出
Display_Result(P3); //顯示A/D轉換結果
OE=0; //關閉輸出
}
}
//T0定時器中斷給ADC0809提供時鍾信號
void Timer0_INT() interrupt 1
{
CLK=!CLK; //ADC0809時鍾信號
}

③ 單片機AT89S52和ADC0809連用時單片機啟動ADC0809的C語言程序

#include<reg51.h>
#define uchar unsigned char

#define LCM_Data P0

#define Busy 0x80 //用於檢測LCM狀態字中的Busy?

sbit RW=P2^1; //定義引腳

sbit RS=P2^0;

sbit EN=P2^2;
sbit int1=P3^3;//定義管腳功能
//sbit cs=P3^2; //使能端
sbit wr=P3^6; //寫埠
sbit rd=P3^7; //讀埠

unsigned char disp[4]={0,0,0,0};
unsigned char _adc;
void dataproc(unsigned char);
void display(unsigned);
void delay1ms(char);
unsigned char adc0804();
unsigned char v='v';

unsigned char adc0804( ) //讀AD0804子程序
{
unsigned char addata,i;
rd=1;
wr=1;
int1=1; //讀ADC0804 前准備
P1=0xff; //P1全部置一準備
//cs=0;
wr=0;
wr=1; //啟動ADC0804開始測電壓
while(int1==1); //查詢等待A/D轉換完畢產生的INT(低電平有效)信號
rd=0; //開始讀轉換後數據
i=i; i="i"; //無意義語句,用於延時等待ADC0804 讀數完畢
addata=P1; //讀出的數據賦與addate
//while(1);
rd=1;
//cs=1; //讀數完畢
return(addata); //返回最後讀出的數據
}
void dataproc(unsigned char data_in)
{ int results;
results=data_in*196;
disp[3]=(results/10000)+0x30;
disp[2]=((results/1000)%10)+0x30;
disp[1]=((results/100)%10)+0x30;
disp[0]=((results/10)%10)+0x30;
}

/*************************lcd1602程序**************************/
void delay1ms(unsigned int ms)//延時1毫秒(不夠精確的 ,內部函數)
{unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<100;j++);
}

void wr_com(unsigned char com)//寫指令// (內部函數)
{ delay1ms(1);
RS=0;
RW=0;
P0=com;
EN=1;
delay1ms(1);
EN=0;
}

void wr_dat(unsigned char dat)//寫數據// (內部函數)
{ delay1ms(1);;
RS=1;
RW=0;
EN=0;
P0=dat;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}

void lcd_init()//初始化設置// (外部調用)
{delay1ms(15);
wr_com(0x38);delay1ms(5);
wr_com(0x08);delay1ms(5);
wr_com(0x01);delay1ms(5);
wr_com(0x06);delay1ms(5);
wr_com(0x0c);delay1ms(5);
}

void main()//主函數
{ while(1)
{
_adc= adc0804( ) ;
dataproc(_adc);
lcd_init();
wr_com(0x80);
wr_dat(disp[3]);
wr_com(0x81);
wr_dat(0x2E);
wr_com(0x82);
wr_dat(disp[2]);
wr_com(0x83);
wr_dat(disp[1]);
wr_com(0x84);
wr_dat(disp[0]);
wr_com(0x85);
wr_dat(v);
//while(1);

}

這是我的程序 我用的0804 但其實都是一樣的 呵呵