㈠ 求51單片機實現AD轉換及串口數據發送的程序謝謝了!
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar A1,A2,A3,A4;
sbit wr=P3^7;
sbit rd=P3^6;
sbit cs=P3^5;
sbit dian=P0^7;
uchar code tab[]={ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰數碼管顯示到9的代碼
void delay(uint z) //延時函數
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar A1,uchar A2,uchar A3,uchar A4)//顯示函數
{
P0=tab[A1];
P2=0x7f;
delay(1);
P0=tab[A2];
dian=1;
P2=0xbf;
delay(1);
P0=tab[A3];
P2=0xdf;
delay(1);
P0=tab[A4];
P2=0xef;
delay(1);
}
void main()
{ uchar a;
uint temp=0,sum=0;
P3=0xdf;//令AD 片選CS一直為選通狀態
P1=0xff;
while(1)
{
for(a=255;a>0;a--)
{
display(A1,A2,A3,A4);
}
wr=1;
_nop_();
wr=0;
_nop_();
wr=1;
_nop_();
rd=1;
_nop_();
rd=0;
_nop_();
temp=P1;
rd=1;
temp=(temp*100*0.01961);//8位的ADC0804的解析度為1/256,5x1/255=0.01961;
A1=temp/1000; // 數碼管第一位顯示數據
A2=temp%1000/100; // 數碼管第二位顯示數據
A3=temp%1000%100/10;//數碼管第三位顯示數據
A4=temp%1000%100%10; //數碼管第四位顯示數據
}
}
㈡ 51的ad程序裝到15單片機上不能用
單片機,板卡不同型號的產品,對應的是不同的設備引腳,如果想要51程序在
15w201s單片機
上運行,那麼你要做的就是把51程序中所在的引腳給修改過來,
㈢ 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),自己詳細分析一下就可以了
㈣ 求51單片機AD程序
如下程序是在
STC
官方網站
提供的。應該很有用。
////
//本示例在Keil開發環境下請選擇Intel的8058晶元型號進行編譯
//假定測試晶元的工作頻率為18.432MHz
#include
"reg51.h"
#include
"intrins.h"
#define
FOSC
18432000L
#define
BAUD
9600
typedef
unsigned
char
BYTE;
typedef
unsigned
int
WORD;
#define
URMD
0
//0:使用定時器2作為波特率發生器
//1:使用定時器1的模式0(16位自動重載模式)作為波特率發生器
//2:使用定時器1的模式2(8位自動重載模式)作為波特率發生器
sfr
T2H
=
0xd6;
//定時器2高8位
sfr
T2L
=
0xd7;
//定時器2低8位
sfr
AUXR
=
0x8e;
//輔助寄存器
sfr
ADC_CONTR
=
0xBC;
//ADC控制寄存器
sfr
ADC_RES
=
0xBD;
//ADC高8位結果
sfr
ADC_LOW2
=
0xBE;
//ADC低2位結果
sfr
P1ASF
=
0x9D;
//P1口第2功能控制寄存器
#define
ADC_POWER
0x80
//ADC電源控制位
#define
ADC_FLAG
0x10
//ADC完成標志
#define
ADC_START
0x08
//ADC起始控制位
#define
ADC_SPEEDLL
0x00
//540個時鍾
#define
ADC_SPEEDL
0x20
//360個時鍾
#define
ADC_SPEEDH
0x40
//180個時鍾
#define
ADC_SPEEDHH
0x60
//90個時鍾
void
InitUart();
void
InitADC();
void
SendData(BYTE
dat);
BYTE
GetADCResult(BYTE
ch);
void
Delay(WORD
n);
void
ShowResult(BYTE
ch);
void
main()
{
InitUart();
//初始化串口
InitADC();
//初始化ADC
while
(1)
{
ShowResult(0);
//顯示通道0
ShowResult(1);
//顯示通道1
ShowResult(2);
//顯示通道2
ShowResult(3);
//顯示通道3
ShowResult(4);
//顯示通道4
ShowResult(5);
//顯示通道5
ShowResult(6);
//顯示通道6
ShowResult(7);
//顯示通道7
}
}
/*----------------------------
發送ADC結果到PC
----------------------------*/
void
ShowResult(BYTE
ch)
{
SendData(ch);
//顯示通道號
SendData(GetADCResult(ch));
//顯示ADC高8位結果
//
SendData(ADC_LOW2);
//顯示低2位結果
}
/*----------------------------
讀取ADC結果
----------------------------*/
BYTE
GetADCResult(BYTE
ch)
{
ADC_CONTR
=
ADC_POWER
|
ADC_SPEEDLL
|
ch
|
ADC_START;
_nop_();
//等待4個NOP
_nop_();
_nop_();
_nop_();
while
(!(ADC_CONTR
&
ADC_FLAG));//等待ADC轉換完成
ADC_CONTR
&=
~ADC_FLAG;
//Close
ADC
return
ADC_RES;
//返回ADC結果
}
/*----------------------------
初始化串口
----------------------------*/
void
InitUart()
{
SCON
=
0x5a;
//設置串口為8位可變波特率
#if
URMD
==
0
T2L
=
0xd8;
//設置波特率重裝值
T2H
=
0xff;
//115200
bps(65536-18432000/4/115200)
AUXR
=
0x14;
//T2為1T模式,
並啟動定時器2
AUXR
|=
0x01;
//選擇定時器2為串口1的波特率發生器
#elif
URMD
==
1
AUXR
=
0x40;
//定時器1為1T模式
TMOD
=
0x00;
//定時器1為模式0(16位自動重載)
TL1
=
0xd8;
//設置波特率重裝值
TH1
=
0xff;
//115200
bps(65536-18432000/4/115200)
TR1
=
1;
//定時器1開始啟動
#else
TMOD
=
0x20;
//設置定時器1為8位自動重裝載模式
AUXR
=
0x40;
//定時器1為1T模式
TH1
=
TL1
=
0xfb;
//115200
bps(256
-
18432000/32/115200)
TR1
=
1;
#endif
}
/*----------------------------
初始化ADC
----------------------------*/
void
InitADC()
{
P1ASF
=
0xff;
//設置P1口為AD口
ADC_RES
=
0;
//清除結果寄存器
ADC_CONTR
=
ADC_POWER
|
ADC_SPEEDLL;
Delay(2);
//ADC上電並延時
}
/*----------------------------
發送串口數據
----------------------------*/
void
SendData(BYTE
dat)
{
while
(!TI);
//等待前一個數據發送完成
TI
=
0;
//清除發送標志
SBUF
=
dat;
//發送當前數據
}
/*----------------------------
軟體延時
----------------------------*/
void
Delay(WORD
n)
{
WORD
x;
while
(n--)
{
x
=
5000;
while
(x--);
}
}