導航:首頁 > 編程語言 > 單片機AD多路轉換程序

單片機AD多路轉換程序

發布時間:2024-02-26 18:52:40

Ⅰ 51單片機與AD轉換程序

/*
此程序通過對DAC0832操作,實現D/A轉換。按INT1鍵DAC0832輸出電壓變高,按s3鍵DAC0832電壓變低。
輸出介面是"D/A OUT"
*/
#include<reg51.h>

//////////////////////
sbit le1=P1^0;/*ic1 74hc373使能端*/
sbit dac0832_cs=P3^7;
sbit dac0832_wr=P1^1;
sbit int1_k=P3^3;
sbit s3_k=P3^6;
sbit blight=P0^6;
void s_q00();
void s_q01();
void s_q02();
void s_q03();
void s_q04();
void s_q05();
void s_q06();
void s_q07();

void c_q00();
void c_q01();
void c_q02();
void c_q03();
void c_q04();
void c_q05();
void c_q06();
void c_q07();

//void delay1();
void delayms(unsigned int i);

void delay100us() ;
void initi_lcd();
void initi();
void c_rw();
void s_rw();
void c_e();
void s_e();
void c_rs(void);
void s_rs(void);
void display(unsigned int addr,char a);
void out_74ls164(unsigned char i);

unsigned char q1=0;
unsigned char da_out_74ls164=0,pwm1=0;

void d_to_a(unsigned char dat)//DAC0832寫函數。
{

out_74ls164(dat);
//c_q14(); /*片選*/
dac0832_cs=0;
//c_q13(); /*寫數據*/
//s_q13();
dac0832_wr=0;
dac0832_wr=1;
// s_q14();/*禁止轉換*/
dac0832_cs=1;

}
main()
{
unsigned char dat=0;
initi_lcd();

display(0,'o');
display(1,'u');
display(2,'t');
display(3,'p');
display(4,'u');
display(5,'t');
display(6,':');
display(7,0x30+dat/100);display(8,0x30+dat%100/10);display(9,0x30+dat%10);
while(1)
{

if(int1_k==0) {dat++;display(7,0x30+dat/100);display(8,0x30+dat%100/10);display(9,0x30+dat%10);}
if(s3_k==0) {dat--;display(7,0x30+dat/100);display(8,0x30+dat%100/10);display(9,0x30+dat%10);}
blight=1;
d_to_a(dat);

delayms(60);
}

}

void display(unsigned int addr,char a)
{
s_e();
c_rs();
c_rw();
// P0=0x80+i;
out_74ls164(0x80+addr); /*寫地址*/
c_e();
delay100us();
s_e();
s_rs();
//P0=a;
out_74ls164(a);/*寫數據*/
c_e();
delay100us();
s_e();
}

void delayms(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=100;j>0;j--);
}

void initi_lcd()
{
delayms(10);
c_rw();
s_e();
c_rs();
// P0=0x01;
out_74ls164(0x01);
c_e();
delayms(5);
s_e();
c_rs();
// P0=0x38;
out_74ls164(0x38);

c_e();
delayms(5);
s_e();
//P0=0x0f;
out_74ls164(0x0f);
c_e();
delayms(5);
s_e();
// P0=0x04;
out_74ls164(0x04);
c_e();
delayms(5);
s_e();

}

void out_74ls164(unsigned char i)
{
unsigned char j,i_tem;
// s_q27();
for(j=0;j<8;j++)
{
i_tem=i<<j;
if(i_tem&0x80)s_q01();/*74ls164數據*/
else c_q01();
c_q00();/*74ls164時鍾*/
s_q00();
}

}
void s_rs(){s_q05();}
void c_rs(){c_q05();}
void s_rw(){s_q06();}
void c_rw(){c_q06();}
void s_e(){s_q07();}
void c_e(){c_q07();}

void delay100us() { unsigned int i=2; for(;i>0;i--); }

///////////////////////////////////////////////////////
//////////////////////////////////////////////////
/*74hc373擴展介面函數:s表示置1,c表示置0,q1表示ic1 74hc373 ,
q2表示ic2 74hc373 ,僅接著的數字表示相應輸出Q的序號 */

void s_q00(){q1=q1|0x01; P0=q1; le1=1; le1=0; }
void s_q01(){q1=q1|0x02; P0=q1; le1=1; le1=0; }
void s_q02(){q1=q1|0x04; P0=q1; le1=1; le1=0; }
//void s_q03(){q1=q1|0x08; P0=q1; le1=1; le1=0; }
void s_q04(){q1=q1|0x10; P0=q1; le1=1; le1=0; }
void s_q05(){q1=q1|0x20; P0=q1; le1=1; le1=0; }
void s_q06(){q1=q1|0x40; P0=q1; le1=1; le1=0; }
void s_q07(){q1=q1|0x80; P0=q1; le1=1; le1=0; }

void c_q00(){q1=q1&(~0x01); P0=q1; le1=1; le1=0;}
void c_q01(){q1=q1&(~0x02); P0=q1; le1=1; le1=0;}
void c_q02(){q1=q1&(~0x04); P0=q1; le1=1; le1=0;}
//void c_q03(){q1=q1&(~0x08); P0=q1; le1=1; le1=0;}
void c_q04(){q1=q1&(~0x10); P0=q1; le1=1; le1=0;}
void c_q05(){q1=q1&(~0x20); P0=q1; le1=1; le1=0;}
void c_q06(){q1=q1&(~0x40); P0=q1; le1=1; le1=0;}
void c_q07(){q1=q1&(~0x80); P0=q1; le1=1; le1=0;}

一塊實驗板的例子,DA轉換(DAC0832),自己詳細分析一下就可以了

Ⅱ 單片機c52 用c語言編寫的 要實現ad轉換程序

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CS=P3^0;
sbit CLK=P3^1; //時鍾
sbit DIO=P3^2; //ADC0832輸出引腳
sbit din=P0^7;

uchar code tab1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8E}; //共陽數碼表
uchar code tab[4]={0xfe,0xfd,0xfb,0xf7}; //數碼管位選表

void delay(uint k)
{
uint i,j;
for(i=0;i<k;i++)
for(j=0;j<121;j++);

}

uint A_D() // A/D轉換函數
{
unsigned char i,dat;

CS=0; //片選
CLK=0; //為第1個脈沖作準備
CLK=1; //第1個脈沖
DIO=1; // DI置1,規定的起始信號
_nop_();_nop_();

CLK=0; //第1個脈沖的下降沿
CLK=1; //第2個脈沖
DIO=1; // DI置1, 通道選擇信號:1
_nop_();_nop_();

CLK=0; //第2個脈沖下降沿
CLK=0; //第3個脈沖
DIO=1; // DI置0,通道選擇信號:0, 選通道0
_nop_();_nop_();

// CLK=0; //第3個脈沖下降沿,轉換開始
// _nop_();_nop_();//第3個脈沖後,
// CLK=1;
for(i=0;i<8;i++) //高位在前
{

CLK=1; //第4個脈沖
if(DIO)
dat=(dat<<1)|0x80;//從高位至低位讀取 "|"的優先順序高於">>"
else
dat=(dat<<1)|0x00;
CLK=0;
}
for(i=0;i<8;i++) //高位在前
{

CLK=1; //第4個脈沖
if(DIO)
dat=(dat>>1)|0x80;//從高位至低位讀取 "|"的優先順序高於">>"
else
dat=(dat>>1)|0x00;
CLK=0;
}

CS=1;
CLK=1;
return dat;
}
void display(uint k)
{

P2=tab[1];
P0=tab1[k/100];
din=0;
delay(3);
P2=0xff;

P2=tab[2];
P0=tab1[k/10%10];
delay(3);
P2=0xff;

P2=tab[3];
P0=tab1[k%10];
delay(3);
P2=0xff;

}

void main(void) //主函數
{
uint temp;
while(1)
{
temp=A_D()*5.0/256*100; // 根據轉換結果求出電壓值
display(temp);
}
}

ADC0832程序 板子做出來 能用

Ⅲ pic單片機多路ad轉換

我恰好做過一個PIC 4通道A/D,您先看看我的程序 有問題留言

#include <pic.h> //調用頭文件,可以去PICC軟體下去查找PIC16F873A單片機的頭文件
#include <stdio.h> //調用頭文件
#include <math.h> //調用頭文件
__CONFIG(XT&PROTECT&WDTEN&PWRTEN); //定義配置字,晶振類型:XT,打開開門狗,代碼保護
unsigned char count,count1,tunnel,t1s; //0.1s計時,1s計時,通道號,1s時間到標志
unsigned int result[4],s[4]; //轉換電壓結果、轉換時間結果
unsigned char f[4]; //輸入埠狀態存儲表
union{
struct{
unsigned b0:1; //通道1有輸入標志
unsigned b1:1; //通道2有輸入標志
unsigned b2:1; //通道3有輸入標志
unsigned b3:1; //通道4有輸入標志
unsigned b4:1; //通道1需要AD采樣標志
unsigned b5:1; //通道2需要AD采樣標志
unsigned b6:1; //通道3需要AD采樣標志
unsigned b7:1; //通道4需要AD采樣標志
}one;
unsigned char allbits;
}myflag; //共佔一個位元組的數據寄存器存儲空間的標志位
#define b0 myflag.one.b0 //定義標志b0
#define b1 myflag.one.b1 //定義標志b1
#define b2 myflag.one.b2 //定義標志b2
#define b3 myflag.one.b3 //定義標志b3
#define b4 myflag.one.b4 //定義標志b4
#define b5 myflag.one.b5 //定義標志b5
#define b6 myflag.one.b6 //定義標志b6
#define b7 myflag.one.b7 //定義標志b7
#define in1 RB4 //定義1通道輸入口為RB4埠
#define in2 RB5 //定義2通道輸入口為RB5埠
#define in3 RB6 //定義3通道輸入口為RB6埠
#define in4 RB7 //定義4通道輸入口為RB7埠
#define out1 RC0 //定義1通道輸出口為RC0埠
#define out2 RC1 //定義2通道輸出口為RC1埠
#define out3 RC2 //定義3通道輸出口為RC2埠
#define out4 RC3 //定義4通道輸出口為RC3埠
//---------------------------------------
//名稱: 定時器T0中斷初始化函數
//-----------------------------------------
void T0init(void)
{
T0CS=0; //T0工作在定時器方式
PSA=0; //分頻器給TMR0
PS0=1; //1:16分頻
PS1=1;
PS2=0;
T0IF=0; //清零T0中斷標志
T0IE=1; //清除T0中斷使能
}
//---------------------------------------
//名稱:RB口引腳電平變化中斷初始化函數
//-----------------------------------------
void RBinit(void)
{
RBPU=1; //內部弱上拉禁止
RBIF=0; //中斷標志清零
RBIE=1; //中斷使能
PORTB=PORTB; //鎖存舊值,為下次變化做准備
}
//---------------------------------------
//名稱:RA口引腳A/D初始化函數
//-----------------------------------------
void ADinit(void)
{
ADCON1=0x00; //設置RA口所有為模擬輸入,採取左對齊方式存放結果
ADCON0=0b11000001; //AD采樣時鍾為內部RC,默認第一次通道為RA0,啟用轉換模塊
ADIE=0; //關閉中斷使能禁止
}
//---------------------------------------
//名稱: 主初始化函數
//-----------------------------------------
void init(void)
{
unsigned char i;
TRISA=0b00101111; //初始化AN0-AN5為輸入
TRISC=0x00; //初始化C口為輸出
TRISB=0xFF; //初始化RB0-RB7為輸入
PORTC=0b00000000; //初始化輸出
count=0; //初始化T0計數器
count1=0; //初始化T0計數器
tunnel=1; //初始化通道號為1
myflag.allbits=0x00; //初始化標志位
for(i=0;i<4;i++) //初始化延時量和輸入埠狀態
{s[i]=30;
f[i]=0;}
}
//---------------------------------------
//-----------------------------------------
//名稱: 中斷服務子函數
//-----------------------------------------
void interrupt ISR(void)
{
//全局中斷屏蔽
if(RBIF&&RBIE) //RB邊沿中斷類型判別
{
PORTB=PORTB;
RBIF=0;
if(in1) //判斷1通道狀態
b0=1;
else
b0=0;
if(in2) //判斷2通道狀態
b1=1;
else
b1=0;
if(in3) //判斷3通道狀態
b2=1;
else
b2=0;
if(in4) //判斷4通道狀態
b3=1;
else
b3=0;
} //RB_int服務子程序1

if(T0IF&&T0IE) //定時器T0中斷類型判別
{
TMR0=TMR0+8; //發生一次的時間為250*16=4ms
T0IF=0;
count+=1;
if(count==25) //計數基數25*16*250=0.1s
{
count=0;
count1+=1;
if(count1==5) //計數基數0.1s*5=0.5s
{
count1=0;
t1s=1; //1s時間到標志
}
}
} //Tmr0_int服務子程序3
//全局中斷使能
}
//-----------------------------------------
//名稱:delay延時
//-----------------------------------------
void delay()
{
unsigned int i;
for(i=0;i<10;i++);//采樣延時160us
}
//-----------------------------------------
//-----------------------------------------
//名稱:A/D轉換選擇子程序
//-----------------------------------------
void ADconvert(void)
{
switch(tunnel) //AD通道選擇
{
case 1: //1通道AD采樣轉換
ADCON0=0b11000001; //設置1通道
delay(); //采樣延時
#asm
clrf _STATUS ;
bsf _ADCON0,2 ;
btfsc _ADCON0,2 ;
goto $-1 ;
#endasm //結束采樣
result[0]=ADRESH; //把結果保存
s[0]=result[0]*120>>8; //把結果轉化為時間
if(s[0]<2) //限制最小值1s
s[0]=2;
else if(s[0]>120)
s[0]=120; //限制最大值60s
break; //跳出
case(2): //2通道AD采樣轉換
ADCON0=0b11001001; //設置2通道
delay(); //采樣延時
#asm
clrf _STATUS ;
bsf _ADCON0,2 ;
btfsc _ADCON0,2 ;
goto $-1 ;
#endasm //結束采樣
{result[1]=ADRESH;} //把結果保存
s[1]=result[1]*120>>8; //把結果轉化為時間
if(s[1]<2) //限制最小值1s
s[1]=2;
else if(s[1]>120)
s[1]=120; //限制最大值60s
break; //跳出
case(3): //3通道AD采樣轉換
ADCON0=0b11010001; //設置3通道
delay();
#asm
clrf _STATUS ;
bsf _ADCON0,2 ;
btfsc _ADCON0,2 ;
goto $-1 ;
#endasm //結束采樣
{result[2]=ADRESH;} //把結果保存
s[2]=result[2]*120>>8; //把結果轉化為時間
if(s[2]<2) //限制最小值1s
s[2]=2;
else if(s[2]>120)
s[2]=120; //限制最大值60s
break; //跳出
case(4): //4通道AD采樣轉換
ADCON0=0b11011001; //設置4通道
delay(); //采樣延時
#asm
clrf _STATUS ;
bsf _ADCON0,2 ;
btfsc _ADCON0,2 ;
goto $-1 ;
#endasm //結束采樣
{result[3]=ADRESH;} //把結果保存
s[3]=result[3]*120>>8; //把結果轉化為時間
if(s[3]<2) //限制最小值1s
s[3]=2;
else if(s[3]>120)
s[3]=120; //限制最大值60s
break; //跳出
default:break; //出錯跳出
}
}
//---------------------------------------
//名稱:deal通道處理
//-----------------------------------------
void deal(void)
{
unsigned char i;
if(t1s) //判斷0.5秒時間是否到
{
asm("nop");
t1s=0; //0.5秒時間標志清零,等待下0.5秒
if(b0) //是第1通道嗎
{
if(b4) //是第1通道有變化後的采樣嗎
{tunnel=1; //賦值AD通道號
ADconvert(); //開始AD轉換
b4=0;} //沒變化不再采樣
if(!(s[0]--)) //延時計時開始
out1=1;} //繼電器開始動作
else out1=0;
if(b1) //是第2通道嗎
{
if(b5) //是第2通道有變化後的采樣嗎
{tunnel=2; //賦值AD通道號
ADconvert(); //開始AD轉換
b5=0;} //沒變化不再采樣
if(!(s[1]--)) //延時計時開始
out2=1;} //繼電器開始動作
else out2=0;
asm("clrwdt");
if(b2) //是第3通道嗎
{
if(b6) //是第3通道有變化後的采樣嗎
{tunnel=3; //賦值AD通道號
ADconvert(); //開始AD轉換
b6=0;} //沒變化不再采樣
if(!(s[2]--)) //延時計時開始
out3=1;} //繼電器開始動作
else out3=0;
if(b3) //是第4通道嗎
{
if(b7) //是第4通道有變化後的采樣嗎
{tunnel=4; //賦值AD通道號
ADconvert(); //開始AD轉換
b7=0;} //沒變化不再采樣
if(!(s[3]--)) //延時計時開始
out4=1;} //繼電器開始動作
else out4=0;
}
asm("nop"); //1秒時間沒到繼續檢測
}
//-----------------------------------------
//名稱:主函數
//-----------------------------------------
void main()
{
init(); //全局初始化
T0init(); //T0初始化
ADinit(); //A/D初始化
RBinit(); //RB初始化
asm("nop"); //穩定狀態
asm("nop");
delay();
delay(); //耗時0.7ms
//-----------------------------------------
{ //開機初始化采樣AD
tunnel=1;
ADconvert();
tunnel=2;
ADconvert();
tunnel=3;
ADconvert();
tunnel=4;
ADconvert();
} //開機1次AD,到此耗時2.4ms,這個時間前不要有觸發
if(in1) //開機一次狀態判斷
{b0=1;
f[0]=in1;} //存儲開機時1通道狀態
if(in2)
{b1=1;
f[1]=in2;} //存儲開機時2通道狀態
if(in3)
{b2=1;
f[2]=in3;} //存儲開機時3通道狀態
if(in4)
{ b3=1;
f[3]=in4;} //存儲開機時4通道狀態
//-----------------------------------------
ei(); //打開全局中斷
//-----------------------------------------
while(1) //主循環
{
asm("clrwdt"); //清看門狗
if(b0) //判斷1通道狀態
{
if(f[0]!=in1)
{f[0]=in1; //存儲1通道狀態
b4=1;} //1通道是否進行AD標志
} //設定1通道有效標志
else
{
b4=0;
f[0]=in1;} //設定1通道無效標志
if(b1) //判斷2通道狀態
{
if(f[1]!=in2)
{f[1]=in2; //存儲2通道狀態
b5=1;} //2通道是否進行AD標志
} //設定2通道有效標志
else
{
b5=0;
f[1]=in2;} //設定2通道無效標志
if(b2) //判斷3通道狀態
{
if(f[2]!=in3)
{f[2]=in3; //存儲3通道狀態
b6=1;} //3通道是否進行AD標志
} //設定3通道有效標志
else
{
b6=0;
f[2]=in3;} //設定3通道無效標志
if(b3) //判斷4通道狀態
{
if(f[3]!=in4)
{f[3]=in4; //存儲4通道狀態
b7=1;} //4通道是否進行AD標志
} //設定4通道有效標志
else
{
b7=0;
f[3]=in4;} //設定4通道無效標志
deal(); //最大循環時間不超過4ms,看門狗典型值18ms
asm("nop"); //中斷檢測
}
}
//---------------------------------------

Ⅳ 誰做過單片機和AD轉換,多通道的AD,在兩個通道該怎麼切換並且用數碼管顯示的

單片機at89s51和ADC0809
1)匯編源程序:
CH EQU 30H
DPCNT EQU 31H
DPBUF EQU 33H
GDATA EQU 32H
ST BIT P3.0
OE BIT P3.1
EOC BIT P3.2
ORG 00H
LJMP START
ORG 0BH
LJMP T0X
ORG 30H
START: MOV CH,#0BCH
MOV DPCNT,#00H
MOV R1,#DPCNT
MOV R7,#5
MOV A,#10
MOV R0,#DPBUF
LOP: MOV @R0,A
INC R0
DJNZ R7,LOP
MOV @R0,#00H
INC R0
MOV @R0,#00H
INC R0
MOV @R0,#00H
MOV TMOD,#01H
MOV TH0,#(65536-4000)/256
MOV TL0,#(65536-4000) MOD 256
SETB TR0
SETB ET0
SETB EA
WT: CLR ST
SETB ST
CLR ST
WAIT: JNB EOC,WAIT
SETB OE
MOV GDATA,P0
CLR OE
MOV A,GDATA
MOV B,#100
DIV AB
MOV 33H,A
MOV A,B
MOV B,#10
DIV AB
MOV 34H,A
MOV 35H,B
SJMP WT
T0X: NOP
MOV TH0,#(65536-4000)/256
MOV TL0,#(65536-4000) MOD 256
MOV DPTR,#DPCD
MOV A,DPCNT
ADD A,#DPBUF
MOV R0,A
MOV A,@R0
MOVC A,@A+DPTR
MOV P1,A
MOV DPTR,#DPBT
MOV A,DPCNT
MOVC A,@A+DPTR
MOV P2,A
INC DPCNT
MOV A,DPCNT
CJNE A,#8,NEXT
MOV DPCNT,#00H
NEXT: RETI
DPCD: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH,00H
DPBT: DB 0FEH,0FDH,0FBH,0F7H
DB 0EFH,0DFH,0BFH,07FH
END

2)C語言源程序
#include
unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char dispbuf[8]={10,10,10,10,10,0,0,0};
unsigned char dispcount;
sbit ST="P3"^0;
sbit OE="P3"^1;
sbit EOC="P3"^2;
unsigned char channel="0xbc";//IN3
unsigned char getdata;
void main(void)
{
TMOD=0x01;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
TR0=1;
ET0=1;
EA=1;
P3=channel;
while(1)
{
ST=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;//片選
getdata=P0;
OE=0;
dispbuf[2]=getdata/100;
getdata=getdata%10;
dispbuf[1]=getdata/10;
dispbuf[0]=getdata%10;
}
}
void t0(void) interrupt 1 using 0
{
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
P1=dispcode[dispbuf[dispcount]];
P2=dispbitcode[dispcount];
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
}

閱讀全文

與單片機AD多路轉換程序相關的資料

熱點內容
剛復制的文件找不到怎麼辦 瀏覽:724
試運行適用於哪些體系文件 瀏覽:987
ghost文件復制很慢 瀏覽:967
傑德原車導航升級 瀏覽:240
編程dest是什麼意思 瀏覽:935
linux埠鏡像 瀏覽:820
iphone5屏幕清塵 瀏覽:157
機頂盒密碼怎麼改 瀏覽:672
w7系統下載32位教程 瀏覽:618
pcb文件包括哪些內容 瀏覽:598
g00文件 瀏覽:607
用bat程序刪除程序 瀏覽:516
dnf鬼泣90版本打安圖恩 瀏覽:668
245倒角編程怎麼計算 瀏覽:599
可以買生活用品的app有哪些 瀏覽:175
cad在c盤產生的文件夾 瀏覽:541
聯想手機解鎖工具 瀏覽:696
瑞銀3887win10 瀏覽:833
學網路編程哪個好 瀏覽:805
手機vmos導入的文件在哪裡 瀏覽:115

友情鏈接